web-dev-qa-db-ja.com

クラス名を出力するようにLogbackを構成するにはどうすればよいですか

Play2.1を使用しています。デフォルトのロガーplay.api.Loggerを使用しています。私はそれがどのように機能するかについて混乱しています。

私のscalaコードでは、メソッド「getPayment()」のクラス「com.myapp.tickets」の行は次のようになります。

Logger.info("getTickets")

このようなログメッセージを生成します。

14:58:58.005 INFO  application play.api.LoggerLike$class info  getTickets

私のapplication-logger.xmlパターンは

%d{HH:mm:ss.SSS} %-5level %logger %class %method  %msg%n

私が抱えている問題は、%loggerが「アプリケーション」を教えてくれ、%classが「play.api.LoggerLike $ class」を教えてくれて、%methodが「情報」を教えてくれることです。私はそれをすべて知っています。メッセージ自体に(クラス名やメソッドなど)。

コールスタック(%caller)を出力すると、レベル2に必要なものがありますが、ログを生成するための実行可能な方法ではないようです。

ロガー自体のクラスとメソッドではなく、アプリケーション固有のクラスとメソッドを出力するように構成するにはどうすればよいですか?

18
user2141729

ログバックパターン:

%d{HH:mm:ss.SSS} [%thread] %-5level %class{36}.%M %L - %msg%n

結果:

14:53:47.816 [http-bio-8080-exec-3] DEBUG  c.f.s.w.s.i.example.ExServiceImpl.getStatus 993 - blocked-->0
  • [http-bio-8080-exec-3]はスレッド名です

  • c.f.s.w.s.i.exampleはパッケージ名です

  • ExServiceImplはクラス名です

  • getStatusはメソッド名です

  • 993は行番号です

10
Dinesh-SriLanka

%class{0}はクラス名のみを出力するため、次の代わりに:

com.something.MyClass

あなたが得るでしょう:

MyClass

これは、ログバックのパターンが通常どのように見えるかです。

%d{HH:mm:ss} [%thread] %-5p %class{0} - %m%n

興味がある場合は、次のようにしてメソッドと行を追加することもできます。

%d{HH:mm:ss} [%thread] %-5p %class{0}.%method:%L - %m%n
26
jspboix

古いスレッドですが、一般的な問題です。 Playはslf4jのラッパーを使用します。これにより、すべてが[Logger $ ALogger]または[application]としてログに記録されます。実際のクラス名をログに記録する方法はいくつかあります。

これをあなたのクラスに入れてください:

private static org.slf4j.Logger logger = play.logger.underlying();

そしてこれをあなたのメソッドに入れてください:

logger.info("Your message");

もう1つのオプションは、すべてのLogger呼び出しをこれに置き換えることですが、何かをログに記録するたびに基になるオブジェクトをフェッチする必要があるため、オーバーヘッドが追加されます。

Logger.underlying().info("Your message");
4
bitstream

それが本当にあなたが望むものかどうかはわかりませんが、これを試してみますか? :

Logger(this.getClass())。info( "getTickets")

1
Maxime Calmels

Playのロガーは基礎となるSLF4J呼び出しをラップするため、ロガークラスは常に「アプリケーション」です。

13:45:21 INFO  application: - Some message

しかし、これを回避する簡単な方法があります。

特性を作成します。

import play.api.Logger

trait WithLogging {
   val logger: Logger = Logger(this.getClass())
}

そして、あなたのクラスでは、特性を混ぜ合わせるだけです:

import WithLogging

class Foobarr extends WithLogging {
   def doFoo = {
      logger.info("Im in foooo")
   }
}

これで、次のようになります。

13:45:21 INFO  models.Foobarr: - Im in foooo
0
flurdy

PlayがLoggerでデフォルトで使用しているように見える単一のapplication.logアプローチを放棄する過程にあります。私のアプリケーションでは、クラス名==ロガー名の場合にストレートアップログバックがうまく機能するような、きめ細かいロギングと実行時の調整が必要です。私は私のコントローラーで「古い学校」に行くだけでかなり良い成功を収めました...

package controllers
import play.api._
import play.api.mvc._
import org.slf4j.LoggerFactory

object Application extends Controller {
  val log = LoggerFactory.getLogger(getClass())

  def index = Action {
    log.trace("index")
    NotFound
  }

  def hb = Action {
    log.trace("hb")
    val message = makeMessage()
    log.info(message)
    Ok(message)
  }

  def makeMessage(): String = {
    val version = "@buildsig.version@"
    val tag = "@buildsig.tag@"
    val timestamp = "@buildsig.timestamp@"
    val status = makeStatus()
    return "DM2 [Version: %s] [Build: %s] [Date: %s] [Status: %s]".format(version, tag, timestamp, status)
  }

  def makeStatus(): String = {
    // TODO: Implement datastore healthcheck
    return "TODO"
  }
}

Slf4j/logbackまたはlog4jに慣れている開発者にとって、このアプローチはおなじみのようです。一方、私は現在苦労しています 「playdist」からシェルスクリプトを開始すると、JARファイルでlogger.xmlが見つかりません 開始スクリプトがconf /logger.xmlを使用できません。 「playdist」コマンドによってJARアップされます。

Scala開発者の方が少し上手だったとしたら、ロギング特性のようなものでも同じ効果が得られると思います。

0
Bob Kuhar