2017-09-18 53 views
0

システムログとユーザログを区別したい。システムログは開発者や管理者が見るものです。ユーザログには、技術的な詳細がすべてなくてもシステム情報がユーザに提供されます。私は別のログメッセージを異なるファイルに保存したいと思っています。ひとつは技術者用、もう一つはユーザー用です。複数のlog4j2ロガーの設定

カスタムレベルとフィルタを含む多くのオプションを検討しました。フィルターがユーザーのメッセージを識別するために使用できるメッセージの先頭にキーワードを追加することができます。標準のエラーレベルを使用するユーザーメッセージ用に別のロガーを追加することを試しています。

私はテストのための簡単なデモプログラムを書いています。 2つのロガーが作成され、いくつかのエラー・メッセージが生成されます。私は、configファイルで

package demo; 
import java.io.IOException; 
import org.apache.logging.log4j.Level; 
import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 

public class Logdemo { 
private final static Logger logger = LogManager.getLogger(); 
private final static Logger userLog = LogManager.getLogger("demo.userMsg"); 

public static void main(String[] args) throws IOException { 
    try { 
     ((Object) null).toString(); 
    } catch (Exception e) { 
     logger.error("error message", e); 
    } 
    try { 
     ((Object) null).toString(); 
    } catch (Exception e) { 
     logger.fatal("User level Red message" ,e); 
    } 
    try { 
     ((Object) null).toString(); 
    } catch (Exception e) { 
     userLog.error("User level Amber message" ,e); 
    } 
    logger.info("Errors Logged"); 
    userLog.info("Lunch is served."); 
    } 
} 

:このことから

<Loggers> 
     <Root level="all"> 
      <AppenderRef ref="RollingFile" level="ALL"/> 
      <AppenderRef ref="Console" level="ALL"/> 
     </Root> 
     <userMsg name="demo.userMsg" level = "all"> 
      <AppenderRef ref="UserMsgFile" level="ALL"/> 
     </userMsg> 
    </Loggers> 
</Configuration> 

私は、NetBeansから、次のエラーメッセージが出ます:

run: 
2017-09-18 22:20:13,933 main ERROR Error processing element UserMsgFile [Appenders: null]): CLASS_NOT_FOUND 
2017-09-18 22:20:13,936 main ERROR Error processing element userMsg ([Loggers: null]): CLASS_NOT_FOUND 
22:20:14.038 [main] INFO demo.Logdemo - logger starting... 
22:20:14.040 [main] ERROR demo.Logdemo - error message 

を例外メッセージのすべてがコンソールに書き込まれ、 userLogのメッセージも含まれます。だから私は両方のロガーが動作していることを知っています。ロガーアペンダーはファイルにOKを書き込みます。ほとんど同じアペンダーを使用するuserLogロガーによって作成されるファイルはありません。

私はlog4j2がロガーを見つけることを許可するために何かを正しく指定していないようです。私はそれを正しくするために命名の様々な組み合わせを試みたが、私は問題が何であるか把握することはできません。

私がまだ持っていないもう一つのことは、異なるクラス間でuserLogロガーを使用することです。ユーザーログメッセージが生成されたクラスを知る必要はありません。そのため、すべてのクラスで、クラス識別子なしで同じロガー名を使用したいと考えています。私はそれができないと思う。

私の質問は次のとおりです: 設定ファイルにはどのようなエラーがありますか?
編集: 次の設定エントリが機能します。これは2つのロガーを与える。 2つの問題がありました。 1つは、ロガーの名前がパッケージ名であるということでした。もう一つは、Loggerという言葉を正しく使用しなかったということでした。

<Loggers> 
    <Logger name="demo" level="all"> <!-- name = package name --> 
     <AppenderRef ref="UserLogFile" level="ALL" /> 
    </Logger> 
    <Root level="all"> 
     <AppenderRef ref="Console" level="ALL"/> 
     <AppenderRef ref="SystemLogFile" level="ALL"/> 
    </Root> 
</Loggers> 

各クラスのLoggerの開始にクラス名を含める必要がありますか?
編集:パッケージ名を含める必要がありました。これは私を理解するために私を取った。

私が持っていたもう一つの問題は、log4j2のデバッグメッセージを有効にしていたことです。これは次のように達成されます:

<Configuration status="WARN"> <!-- to debug, set status="TRACE" --> 

答えて

0

私はアプローチを変更しました。私は追加されたロガーでマーカー機能を使用しました。ログメッセージにマーカーを追加すると、別のアペンダーを使用してユーザーメッセージを処理できます。 サンプルコードは次のようになります。

import java.io.IOException; 
import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 
import org.apache.logging.log4j.MarkerManager; 
import org.apache.logging.log4j.Marker; 

    public class Logdemo { 

    private final static Logger logger = LogManager.getLogger(); 
    static final Marker usrMkr = MarkerManager.getMarker("USR"); 

    public static void main(String[] args) throws IOException { 
     logger.info("logger starting..."); 

     try { 
      ((Object) null).toString(); 
     } catch (Exception e) { 
      logger.fatal(usrMkr,"User message"); 
     } 
     try { 
      ((Object) null).toString(); 
     } catch (Exception e) { 
      logger.debug("Debug error message" ,e); 
     } 
     logger.info("Errors Logged"); 
     } 
    } 

設定ファイルの関連部分を以下のようになります。MarkerFilterコマンドが追加されて、私はアペンダを作成し

 <RollingFile 
     name="UserLogFile" 
     fileName="${basePath}/UserMsg.log" 
     immediateFlush="false" 
     filePattern="logs/$${date:yyyy-MM}/user-%d{MM-dd-yyyy}-%i.log"> 
     <MarkerFilter marker="USR" onMatch="ACCEPT" onMismatch="DENY"/> 
    </RollingFile> 
</Appenders> 

<Loggers> 
    <Logger name="demo" level="all"> 
     <AppenderRef ref="UserLogFile" level="ALL"/> 
    </Logger> 
    <Root level="all"> 
     <AppenderRef ref="Console" level="ALL"/> 
     <AppenderRef ref="RollingFile" level="ALL"/> 

    </Root> 

</Loggers> 

。 ロガーをアペンダーに向けて、マークされたメッセージを別のファイルに振り向けるように指示しました。 簡潔にするために、私はxmlファイルの大きな断片をハックしました。

+0

こんにちは、あなたのアプローチのどちらかがうまくいくはずです。 「ログメッセージにマーカーを追加すると、別のアペンダーを使用してユーザーメッセージを処理できます」というメッセージが表示されますが、マーカーなしでこれを行うことは可能です。マーカを使用しないと複数のロガーを作成する必要があり、読みにくくなることがあるため、マーカーを使って正しい方向に進んでいると思います。 –

+0

もう1つのこと - あなたの "デモ"ロガーを持っている唯一の理由は、 "UserLogFile"アペンダーを割り当てることです。本当にこのロガーは必要ありません。あなたのアペンダーはMarkerFilterを持っているので、あなたはそれをルートロガーに割り当てることができ、同じ方法で動作するはずです。 –

+0

こんにちは#D.Bロガーのカーブを覚えていて(そしてまだまだ道のりは)、私が書いたコードが仕事をしています。私はデモロガーが必要ではないことがわかりますが、私が何をしたのか忘れてしまった場合、2年後にコードを読みやすくすると思います。 – dazz

関連する問題