22

私は Play 2.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 に必要なものが表示されますが、ログを生成する実行可能な方法ではないようです。

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

4

6 に答える 6

34

%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
于 2013-03-18T11:16:58.513 に答える
4

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

これをクラスに入れます:

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

そして、これをメソッドに入れます:

logger.info("Your message");

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

Logger.underlying().info("Your message");
于 2015-03-02T22:10:07.290 に答える
1

私は、Play が Logger でデフォルトで使用しているように見える単一の application.log アプローチを放棄しようとしています。私のアプリケーションでは、classname == Logger name の場合、まっすぐな logback が非常にうまく機能する、きめ細かいロギングとそのランタイム調整が必要です。私はコントローラーで「古い学校」に行くだけでかなり成功しました...

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 に慣れている開発者にとって、このアプローチはなじみ深いものに思えるでしょう。一方、私は現在、「play dist」からシェルスクリプトを開始するのに苦労しています.JARファイルでlogger.xmlを見つけることができません。開始スクリプトは、「playによってJAR化されたconf / logger.xmlを使用できません。ディスト」コマンド。

私が Scala 開発者として少しだけ優れていれば、Logging トレイトのようなもので同じ効果を達成できると思います。

于 2013-06-03T22:27:40.427 に答える
1

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

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

于 2013-03-08T08:10:29.820 に答える
0

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
于 2017-06-20T13:27:13.147 に答える