2016-08-15 3 views
3

log4j.properties:私は情報をログに記録したいlog4jでsyslogにエラーメッセージとinfoメッセージを別々に記録する方法は?

# configure the root logger 
log4j.rootLogger=INFO, SYSLOG 

# configure Syslog facility LOCAL6 appender 
log4j.appender.SYSLOG=org.apache.log4j.net.SyslogAppender 
log4j.appender.SYSLOG.threshold=INFO 
log4j.appender.SYSLOG.syslogHost=localhost 
log4j.appender.SYSLOG.facility=LOCAL6 
log4j.appender.SYSLOG.layout=org.apache.log4j.PatternLayout 
log4j.appender.SYSLOG.layout.conversionPattern="MyApp: %d\{ISO8601\}%m\n" 

ロガークラス

import org.apache.log4j.Logger; 

public class Log4jAuditLogger { 
    private static Logger LOG = Logger.getLogger(Log4jAuditLogger.class); 

    public static void log(String message) { 
     LOG.info(message); 
    } 
} 

(これらは、監査メッセージで、私はここでエラーメッセージをログに記録しない)SYSLOG LOCAL6へのメッセージ、およびエラーメッセージ(これらはJavaプログラムの内部エラーメッセージです)をSYSLOG LOCAL7に記録します。

これを行うには、このクラスと構成ファイルをどのように拡張する必要がありますか?

私はlog4j 1.2を使用します。

答えて

3

あなたのlog4j.propertiesに別のアペンダを追加します。

# configure the root logger 
log4j.rootLogger=INFO, SYSLOG, SYSLOG7 

# configure Syslog facility LOCAL6 appender 
log4j.appender.SYSLOG=org.apache.log4j.net.SyslogAppender 
log4j.appender.SYSLOG.threshold=INFO 
log4j.appender.SYSLOG.syslogHost=localhost 
log4j.appender.SYSLOG.facility=LOCAL6 
log4j.appender.SYSLOG.layout=org.apache.log4j.PatternLayout 
log4j.appender.SYSLOG.layout.conversionPattern="MyApp: %d\{ISO8601\}%m\n" 

# configure Syslog facility LOCAL7 appender 
log4j.appender.SYSLOG7=org.apache.log4j.net.SyslogAppender 
log4j.appender.SYSLOG7.threshold=ERROR 
#         vv change to whatever the host is 
log4j.appender.SYSLOG7.syslogHost=localhost 
log4j.appender.SYSLOG7.facility=LOCAL7 
log4j.appender.SYSLOG7.layout=org.apache.log4j.PatternLayout 
log4j.appender.SYSLOG7.layout.conversionPattern="MyApp: %d\{ISO8601\}%m\n" 

編集に関するコメント:

SYSLOG7だけエラーを記録(以上)ものとした場合:ERRORレベルにしきい値を設定します。下位レベルで記録されたすべてのメッセージは表示されません。

トリッキーな部分は、syslogにのみ低レベルを表示することです:

あなただけのメッセージをログに記録するフィルタを使用することができ、「下」よりも、例えばERRORレベル。

log4jの場合2:フィルタはPropertyConfiguratorではサポートされていません。したがって、それを使用するにはXML設定に変更する必要がありますlog4j-Wiki about filtersを参照してください。

例 "特定水準"

<appender name="info-out" class="org.apache.log4j.FileAppender"> 
      <param name="File" value="info.log"/> 
      <layout class="org.apache.log4j.PatternLayout"> 
        <param name="ConversionPattern" value="%m%n"/> 
      </layout> 
      <filter class="org.apache.log4j.varia.LevelMatchFilter"> 
        <param name="LevelToMatch" value="info" /> 
        <param name="AcceptOnMatch" value="true"/> 
      </filter> 
      <filter class="org.apache.log4j.varia.DenyAllFilter" /> 
</appender> 

または "レベル範囲" 我々は、プロパティファイルでフィルタを使用できるのlog4j 1.2で

<appender name="info-out" class="org.apache.log4j.FileAppender"> 
      <param name="File" value="info.log"/> 
      <layout class="org.apache.log4j.PatternLayout"> 
        <param name="ConversionPattern" value="%m%n"/> 
      </layout> 
      <filter class="org.apache.log4j.varia.LevelRangeFilter"> 
        <param name="LevelMax" value="info"/> 
        <param name="LevelMin" value="info"/> 
        <param name="AcceptOnMatch" value="true"/> 
      </filter> 
</appender> 
+0

がSYSLOG7アペンダの閾値はERRORではないでしょうか?どのように私が使用したいアペンダーをJavaコードで選択できますか? LOG.error( "msg")を書くだけで十分です。 ? SYSLOGにのみinfoメッセージを記録し、SYSLOG7でエラーメッセージを記録したいと思います。 – BlackCat

+0

7がERRORメッセージ(およびそれ以上)のみを表示する場合は、Threahsoldをyesに設定します。難しいのは、6〜** ** ERRORメッセージを表示しないことです。フィルタを設定することはできますが、正しく覚えていれば、フィルタを使用できるようにxml設定に変更する必要があります。 – Fildor

+0

これはlog4j 2の回避策かもしれませんが、1.2ではxmlファイルなしでもこれを行うことができます。キーは実際にはLevelMinとLevelMaxフィルタでした。後で私は気付きました、もし私が追加の機能でこのロガーを拡張したいのであれば、より多くのロガーを定義することをお勧めします。同様の重大度レベルのログメッセージを、そのプロパティに応じて異なる施設にログする必要がある場合。 – BlackCat

0

。完全な分離とより良いカスタマイズのために、より多くのロガーを定義することをお勧めします。

私の例:

log4j.properties:

# configure the root logger 
log4j.rootLogger=INFO 
log4j.logger.auditLogger=INFO,SYSAUDIT 
log4j.logger.appLogger=INFO,SYSAPPINFO,SYSAPPERR 

log4j.additivity.auditLogger=false 
log4j.additivity.appLogger=false 

# SYSAUDIT appender 
log4j.appender.SYSAUDIT=org.apache.log4j.net.SyslogAppender 
log4j.appender.SYSAUDIT.threshold=INFO 
log4j.appender.SYSAUDIT.syslogHost=localhost 
log4j.appender.SYSAUDIT.facility=LOCAL6 
log4j.appender.SYSAUDIT.layout=org.apache.log4j.PatternLayout 
log4j.appender.SYSAUDIT.layout.conversionPattern=Audit Info: %d\{ISO8601\} %m\n 
log4j.appender.SYSAUDIT.filter.a=org.apache.log4j.varia.LevelRangeFilter 
log4j.appender.SYSAUDIT.filter.a.LevelMin=INFO 
log4j.appender.SYSAUDIT.filter.a.LevelMax=INFO 

# SYSAPPINFO appender 
log4j.appender.SYSAPPINFO=org.apache.log4j.net.SyslogAppender 
log4j.appender.SYSAPPINFO.threshold=INFO 
log4j.appender.SYSAPPINFO.syslogHost=localhost 
log4j.appender.SYSAPPINFO.facility=LOCAL5 
log4j.appender.SYSAPPINFO.layout=org.apache.log4j.PatternLayout 
log4j.appender.SYSAPPINFO.layout.conversionPattern=App Info: %d\{ISO8601\} %m\n 
log4j.appender.SYSAPPINFO.filter.a=org.apache.log4j.varia.LevelRangeFilter 
log4j.appender.SYSAPPINFO.filter.a.LevelMin=INFO 
log4j.appender.SYSAPPINFO.filter.a.LevelMax=INFO 

# SYSAPPERR appender 
log4j.appender.SYSAPPERR=org.apache.log4j.net.SyslogAppender 
log4j.appender.SYSAPPERR.threshold=ERROR 
log4j.appender.SYSAPPERR.syslogHost=localhost 
log4j.appender.SYSAPPERR.facility=LOCAL5 
log4j.appender.SYSAPPERR.layout=org.apache.log4j.PatternLayout 
log4j.appender.SYSAPPERR.layout.conversionPattern=App Error: %d\{ISO8601\} %m\n 
log4j.appender.SYSAPPERR.filter.a=org.apache.log4j.varia.LevelRangeFilter 
log4j.appender.SYSAPPERR.filter.a.LevelMin=ERROR 
log4j.appender.SYSAPPERR.filter.a.LevelMax=ERROR 

Log4jLoggerクラス:

public class Log4jLogger { 
    private static Logger AUDITLOGGER = Logger.getLogger("auditLogger"); 
    private static Logger APPLOGGER = Logger.getLogger("appLogger"); 

    public static void audit(String message) 
    { 
     AUDITLOGGER.info(message); 
    } 

    public static void error(String message) 
    { 
     APPLOGGER.error(message); 
    } 

    public static void info(String message) 
    { 
     APPLOGGER.info(message); 
    } 
} 
関連する問題