2013-03-06 10 views
10

私はPlay 2.1を使用しています。私はデフォルトのロガーplay.api.Loggerを使用しています。私はそれがどのように動作するのか混乱しています。私のScalaのコードでLogbackを設定してクラス名を印刷するには

「getPayment()」は、この

Logger.info("getTickets") 

ような方法でクラス「com.myapp.tickets」の行は、このようなログメッセージを生成します。

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

私のアプリケーション・Logger.xmlのパターンは%ロガーは、 "アプリケーション" 私に指示することを私が持っている問題がある

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

で、%クラスは、私に「play.api.LoggerLike $クラスおよび%を告げますメソッドは私にその情報を教えてくれます。私はもちろんそれを知っています。もちろん、クラス名やメソッドのようにメッセージ自体に亀裂を入れたくないのですが。レベル2には私が望むものがありますが、それはログを生成する実行可能な方法ではありません。

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

答えて

4

Logbackパターン:

%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メソッド名です行番号

+2

これは、同じ "play.api.LoggerLike $ class" cruftを表示するだけなので、元の問題には実際には対応していません。 –

+0

同じこと、助けにならない。 'play.api.LoggerLike $ class'が表示されます。 '%logger'は正しいクラスタ – Sergey

1

私はそれが本当にあなたが望むものだとは思っていませんが、これを試してみませんか? :

ロガー(this.getClass())の情報( "getTickets")

+1

これは近いがない、まさにです私は探していた。私はこれを得ます06:24:52.907 INFO com.myapp.tickets $ play.api.LoggerLike $ class info getTickets %ロガーは私がOKである適切な文字列を取得します。それが改善です。しかし、%クラスと%メソッドはまだ遊びから役に立たない価値を得ています。 %loggerに適切なクラスがあるとすれば、%クラスはそれほど重要ではなく、削除することができます。 %メソッドはまだ欠けているものです。 "info"ではなく "getPayments"という実際のメソッドを取得する方法はありますか? – user2141729

18

%class{0}ますのみ出力クラス名を、その代わりに:。

com.something.MyClass 

あなたは得られます。

MyClass 

これはlogbackのための私のパターンは、通常、どのように見えるかです:

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

また、あなたが行って、興味を持っている場合の方法や行を追加することができます。

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

を、私はそのロガーとをデフォルトに思える再生単一application.logでアプローチを放棄する過程にいますよ。私のアプリケーションでは、classname == Logger名のときにまっすぐなログバックがうまくいくような細かい粒度のログとランタイム調整が必要です。私は、このアプローチは、おなじみのように見えるだろう.../logbackのlog4jまたはSLF4Jをするために使用されるすべての開発者のために

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 = "@[email protected]" 
    val tag = "@[email protected]" 
    val timestamp = "@[email protected]" 
    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" 
    } 
} 

ように私のコントローラでは、単に「古い学校を」行くかなり良い成功を収めてきました。一方、私は現在、start shell script from "play dist" fails to locate logger.xml in JAR fileで苦労しています。開始スクリプトは、 "play dist"コマンドでJARを取得したconf/logger.xmlを使用していません。

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

4

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

あなたのクラスでこれを入れて:

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

をそして、あなたの方法でこれを置く:

logger.info("Your message"); 

別のオプションは、あなたのロガーのこのすべてを呼び出しますが、それは以降のオーバーヘッドが追加されますを交換することですログに記録するたびに基礎となるオブジェクトをフェッチする必要があります。

Logger.underlying().info("Your message"); 
+0

を表示します。演劇からそれを直接行う方法はありませんか? – saurabheights

0

Pla yのLoggerは基本となるSLF4J呼び出しをラップしますが、Loggerクラスは常に「アプリケーション」です。

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 
関連する問題