简体   繁体   English

如何使用log4j将错误和信息消息分别记录到syslog中?

[英]How to log error and info messages separately into syslog with log4j?

log4j.properties: 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"

logger class 记录器类

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

I want to log info (these are audit messages, i don't want to log error messages here) messages into SYSLOG LOCAL6, and to log error messages(these are internal error messages of the java program) into SYSLOG LOCAL7. 我想将信息(这些是审计消息,我不想在此处记录错误消息)记录到SYSLOG LOCAL6中,并将错误消息(这些是java程序的内部错误消息)记录到SYSLOG LOCAL7中。

How should I extend this class and configuration file to do this? 我应该如何扩展此类和配置文件来执行此操作?

I use log4j 1.2. 我使用log4j 1.2。

Add to your log4j.properties another appender: 添加到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"

Edit regarding comment: 编辑评论:

If SYSLOG7 shall only log ERROR (and higher): set the threshold to ERROR level. 如果SYSLOG7仅记录ERROR(和更高):将阈值设置为ERROR级别。 All messages logged with a lower level won't show. 以较低级别记录的所有消息都不会显示。

Tricky part is to show only low levels in Syslog: 棘手的部分是在Syslog中只显示低级别:

You can use a filter to log only messages "lower" than eg ERROR level. 您可以使用过滤器仅记录“低于”例如ERROR级别的消息。

In log4j 2 : The filter is not supported by PropertyConfigurator. 在log4j 2中:PropertyConfigurator不支持过滤器。 So you must change to XML config to use it . 因此,您必须更改为XML配置才能使用它 See log4j-Wiki about filters . 有关过滤器,请参阅log4j-Wiki

Example "specific level" 示例“特定级别”

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

Or "Level range" 或“等级范围”

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

In log4j 1.2 we can use filters in the property file. 在log4j 1.2中,我们可以在属性文件中使用过滤器。 For full separation and better customization I think it's advised to define more loggers. 为了完全分离和更好的定制,我认为建议定义更多的记录器。

My example: 我的例子:

log4j.properties: 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 class: 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);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM