2011-07-02 15 views
8

私は現在、機能的に賢明なレストウェブサービスになるように近々開発しています。ログを本当によくキャプチャしたいので、どこで何が起こっているのかをよく知ることができます。log4jをロギングに追加する最も良い方法

ログのこれらの種類の生産
<!-- Appenders --> 
<appender name="console" class="org.apache.log4j.ConsoleAppender"> 
    <param name="Target" value="System.out" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%-5p: %c - %m%n" /> 
    </layout> 
</appender> 

10:44:55,893 INFO [STDOUT] INFO : my.package.MyClass - I'm class message 
  1. どのように私はこのメッセージがすなわち

    10:44:55,893 INFO : my.package.MyClass - I'm class message 
    
    ように見せることができが今の私は、この追加の設定を使用して、ログ記録用にlog4jを使用します
  2. 私は特別なアペンダーなどを作って、すべてではないいくつかのクラスで使うことができます。つまり、私はhにしたいですか?これらINFO [STDOUT] INFO my.package.MyClass in front of it

    UPDATE

    01を持たずに

    • Payload: some request parameters
    • Response: some response that my service returns
    • extra data : some extra data

:私のログこの数でAVE

私はJboss 5を使用しているという質問に忘れました。私はjbossが私のlog4j設定に入れたフォーマットに10:44:55,893 INFO [STDOUT]を追加している可能性があると思います。

BOUNTYのUPDATE

私はこの変更:これに

<!-- ============================== --> 
    <!-- Append messages to the console --> 
    <!-- ============================== --> 

    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> 
     <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/> 
     <param name="Target" value="System.out"/> 
     <param name="Threshold" value="INFO"/> 

     <layout class="org.apache.log4j.PatternLayout"> 
     <!-- The default pattern: Date Priority [Category] Message\n --> 
     <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/> 
     </layout> 
    </appender> 

<!-- ============================== --> 
    <!-- Append messages to the console --> 
    <!-- ============================== --> 

     <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> 
      <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/> 
      <param name="Target" value="System.out"/> 
      <param name="Threshold" value="INFO"/> 

      <layout class="org.apache.log4j.PatternLayout"> 
      <!-- The default pattern: Date Priority [Category] Message\n --> 
      <param name="ConversionPattern" value="%m%n"/> 
      </layout> 
     </appender> 

をそして、それは働いていたが、このようにそれを行うには一種の醜いようです。他の方法はありますか?私は春のMVC/JBossの組み合わせを使用しています。私は今、素敵なきれいなメッセージを取得しています

10:44:55,893 INFO : my.package.MyClass - I'm class message 

プレフィックス

迷惑

10:44:55,893 INFO [STDOUT] 
なし

+0

JBossではなく、%d {ABSOLUTE}から10:44:55,893メッセージが届きました。 – Dima

+0

カスタム変換パターンを設定するのは醜いですか? – GargantuChet

答えて

7

質問1:

があなたのために、以下のパターンレイアウトを使用しますアペンダー:

<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p: %c - %m%n" /> 

指定した設定ファイルの変換パターンは、指定したログの種類にはなりません。たとえば、日付/時刻はコンバージョンパターンには含まれません。


質問2:

あなたが唯一の純粋なメッセージをログに記録されている別のアペンダを使用する特別なロガーを使用することができます。

あなたの構成は、たとえば次のようになります。

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 

    <appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender"> 
     <param name="Target" value="System.out" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%m%n" /> 
     </layout> 
    </appender> 

    <appender name="consoleAppender2" class="org.apache.log4j.ConsoleAppender"> 
     <param name="Target" value="System.out" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p: %c - %m%n" /> 
     </layout> 
    </appender> 

    <logger name="specialLogger" additivity="false"> 
     <level value="INFO" /> 
     <appender-ref ref="consoleAppender" /> 
    </logger> 

    <root> 
     <priority value="INFO" /> 
     <appender-ref ref="consoleAppender2" /> 
    </root> 

</log4j:configuration> 

あなたは、追加情報なしで、純粋なメッセージのためにspecialLoggerを使用しています。複数のクラスで使用できます。

specialLoggerの設定では、additivity = "false"が必要です。そうしないと、ルートロガーのアペンダーconsoleAppender2も同じメッセージを記録するためです。 (メッセージは、この場合には2回記録されます。)

あなたのコードは、たとえば次のようになります。

どこかで、あなたのメインクラスで
17:17:18,125 INFO : com.foo.TestClassA - Some message from TestClassA 
Some message via the specialLogger from TestClassA 

:中doSomethingの結果を呼び出す

public class TestClassA 
{ 
    private static Logger specialLogger = Logger.getLogger("specialLogger"); 
    private static Logger logger = Logger.getLogger(TestClassA.class);  

    public TestClassA() { 

    } 

    public void doSomething() { 
     logger.info("Some message from TestClassA"); 
     specialLogger.info("Some message via the specialLogger from TestClassA"); 
    } 
} 

通常のようにlog4jを設定する必要があります。例:

DOMConfigurator.configureAndWatch("log4j.xml", 60 * 1000); 
+0

あなたが提案したものをすべて使用しても、私はまだこの厄介な「13:13:43,428 INFO [STDOUT]」をアペンダーで変更したものの前に取り除くことはできません。部.. –

1

このパターンを使用してみましょうあなたクリーンメッセージ:

<param name="ConversionPattern" value="%d{HH:mm:ss.SSS} %-5p %c %X %m/> 

それはリクエストが来たときに、あなたのパターンに%のX {uniqueValueKey}を追加し、MDCにいくつかのユニークな値を追加することをお勧めです。この一意の要求のログを追跡できます。

4

INFO [STDOUT]は通常、log4jがSystem.outもリスンしています。アプリケーション自体に独自のlog4j設定があり、独自のルートアペンダを持っているという類似のケースがありました。これは、JBossのlog4jが聴いているコンソールにログを記録します。これにより、System.outに直接書き込むかのようにINFO [STDOUT]が追加されます(System.errに書き込む場合はERROR [STDERR])。

私たちの場合のソリューションは、アプリケーション固有のlog4j設定を削除し、JBossが書き込むものを使用することでした。

別の方法として、コンソールに書き込むのではなく、アプリケーション固有のログファイルに直接書き込む方法があります。サーバ環境では、とにかくログファイルを参照している可能性があります。すなわち、自動的に応答して、ログを延びる第二の部分については

、などを要求したデータ:

は1ケースでは、機能性をロギング提供ステートレスセッションBeanのスーパークラスを持っていたし、(上書き)ロガーあたりを持っていましたインスタンス。 infoのような基本メソッドは、ロガーを呼び出し、必要なデータを自動的に追加します。

2番目のアプローチはMCDです。つまり、要求のようなデータをスレッドローカルMDC(基本的にはマップ)に入れ、パターン定義でアクセスします。

たとえば、いくつかのクラスを持つ類似のアプリケーションがいくつかあります。だから我々は、メッセージが由来ため、MDCにアプリケーション名を追加したアプリケーション必要があるでしょう:コードで


MDC.put("app.name", "myapplication");

log4jのパターンの設定では:
<param name="ConversionPattern" value="%d %-5p [%c (%X{app.name})] %m%n"/>%の点に注意してください。 X {app.name}

私はあなたがMDCに要求を置くような何かをしてから使用することができるかどうかをテストしていない:それはちょうどMDCの値を取得し、それにtoString()を呼び出す場合、%X{request.getAttribute('xyz')}けどあなたはこのような要求ラッパー:

class RequestLogWrapper { 
    private HttpServletRequest request; //initialize through constructor etc. 

    public String toString() { 
    return request.getAttribute("xyz") + ";" + request.getAttribute("abc") + ... //handle null etc. as well 
    } 
} 

その後MDC.put("request", new RequestLogWrapper(request));を呼び出し、設定で%X{request}を使用しています。

0

メッセージのみを出力するには、次の変換パターンを使用します。あなたの条件に応じて、あなたが

  1. %の-5pに好きに変換パターンを設定することができ

    <param name="ConversionPattern" value="%m%n"/> 
    

    は、ログエントリのタイプを指します。これは、 ログファイルにINFO、DEBUG、ERRORなどのように表示されます。技術的には、%pはこの説明を含めるには十分に です。 -5は、 の単語を5文字の幅の列に含めるためのものです。

  2. %dは日付を表します。
  3. %tは、このログエントリを発生させたスレッドの名前です。
  4. %cこのログを生成したカテゴリは、通常 のクラス名です。
  5. %mメッセージを表示します。
  6. %nは改行を追加します。

メッセージにすべての関連情報を入れるつもりですか?私は確信していませんが、それは良い考えではありません。

1

log4j xml構成ファイルが気に入らない場合は、代わりにプロパティファイルに切り替えることができます。単純なプロパティファイルを使用してフィルタを設定することはできませんが、必要ないと思われるので、これは問題ではありません。あなたは

が...現在、大きな(賢明な機能)、残りのWebサービスであることをすぐに開発していると私は本当に良いログを取得したいので、私は何であるかの優れた洞察力を持つことができることを考えると

どこで行くか。

その後、私はあなたの希望の出力がすべてであなたに多くの洞察を与えることはありません、それはうまくスケールしないことを恐れている、それが期待通りにアプリケーションが大きな到達したら、あなたがあなたの心を失うことになります...

ログデザインの参考にはLog4j Best Practicesを参照してください。ALL最後に化粧品の配慮を含むパラグラフをご覧ください。お役に立てれば。

関連する問題