2016-08-15 65 views
3

log4j.properties:如何使用log4j將錯誤和信息消息分別記錄到系統日誌中?

# 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其他的appender:

# 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級別。

在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> 

或 「等級範圍」

<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附加器的門檻是錯誤?我如何選擇我想用的appender的Java代碼?只寫LOG.error就足夠了(「msg」); ?我想僅在SYSLOG中記錄信息消息,而僅在SYSLOG7中記錄錯誤消息。 – BlackCat

+0

如果7只顯示ERROR消息(和更高),那麼只需設置Threahsold,是的。棘手的部分是6 ** **不顯示錯誤消息。你可以配置一個過濾器,但如果我沒有記錯的話,你需要改變爲xml config來使過濾器可用。 – Fildor

+0

也許這是log4j 2中的解決方法,但在1.2中,您可以在不使用xml文件的情況下執行此操作。關鍵是真的是LevelMin和LevelMax過濾器。後來我意識到,如果我想擴展這個記錄器的附加功能,建議定義更多的記錄器。例如,當您需要根據其屬性將相同的嚴重級別日誌消息記錄到不同的設施中時。 – BlackCat

0

在log4j的1.2,我們可以在屬性文件中使用的過濾器。爲了完全分離和更好的定製,我認爲建議定義更多的記錄器。

我的例子:

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); 
    } 
} 
相關問題