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に必要なものがありますが、ログを生成するための実行可能な方法ではないようです。
ロガー自体のクラスとメソッドではなく、アプリケーション固有のクラスとメソッドを出力するように構成するにはどうすればよいですか?
ログバックパターン:
%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
は行番号です
%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
古いスレッドですが、一般的な問題です。 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");
それが本当にあなたが望むものかどうかはわかりませんが、これを試してみますか? :
Logger(this.getClass())。info( "getTickets")
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
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開発者の方が少し上手だったとしたら、ロギング特性のようなものでも同じ効果が得られると思います。