【问题标题】:How to log error and info messages separately into syslog with log4j?如何使用 log4j 将错误和信息消息分别记录到 syslog 中?
【发布时间】:2016-08-15 07:27:35
【问题描述】:

log4j.properties:

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

【问题讨论】:

    标签: java logging log4j


    【解决方案1】:

    将另一个附加程序添加到您的 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(及更高):将阈值设置为 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> 
    

    或“级别范围”

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

    【讨论】:

    • SYSLOG7 appender的阈值不应该是ERROR吗?如何在 Java 代码中选择要使用的附加程序?只写 LOG.error("msg"); 就够了吗? ?我想只在 SYSLOG 中记录信息消息,而只在 SYSLOG7 中记录错误消息。
    • 如果 7 只显示 ERROR 消息(及更高),那么只需设置 Threahsold,是的。棘手的部分是 6 到 显示错误消息。您可以配置过滤器,但如果我没记错的话,您需要更改为 xml 配置才能使用过滤器。
    • 也许这是 log4j 2 中的一种解决方法,但在 1.2 中,您也可以在没有 xml 文件的情况下执行此操作。关键是 LevelMin 和 LevelMax 过滤器。后来我意识到,如果我想用额外的功能扩展这个记录器,建议定义更多的记录器。例如,当您需要根据属性将相同严重级别的日志消息记录到不同的设施时。
    • 嗨,如果我将 log4j 日志路由到 Rsyslog(具有错误阈值),我是否还能获得到目前为止的日志,直接按照 log4j.xml 中的配置写入?另外,我发现我的机器中没有名为 log4j.properties 的文件。
    • @Tomer 请对此提出一个新问题,以便其他有相同问题的用户可以找到它。
    【解决方案2】:

    在 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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      相关资源
      最近更新 更多