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

Bla*_*Cat 3 java logging log4j

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"
Run Code Online (Sandbox Code Playgroud)

记录器类

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想将信息(这些是审计消息,我不想在此处记录错误消息)消息记录到 SYSLOG LOCAL6 中,并将错误消息(这些是 java 程序的内部错误消息)记录到 SYSLOG LOCAL7 中。

我应该如何扩展这个类和配置文件来做到这一点?

我使用 log4j 1.2。

Fil*_*dor 5

将另一个 appender 添加到您的 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"
Run Code Online (Sandbox Code Playgroud)

编辑评论:

如果 SYSLOG7 只记录 ERROR(及更高):将阈值设置为 ERROR 级别。所有以较低级别记录的消息都不会显示。

棘手的部分是在 Syslog 中只显示低级别:

您可以使用过滤器仅记录“低于”ERROR级别的消息。

在 log4j 2 中:PropertyConfigurator 不支持过滤器。因此,您必须更改为 XML 配置才能使用它有关过滤器,请参阅log4j-Wiki

示例“特定级别”

<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> 
Run Code Online (Sandbox Code Playgroud)

或“级别范围”

<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>
Run Code Online (Sandbox Code Playgroud)

  • @Tomer 请就此提出一个新问题,以便其他有相同问题的用户可以找到它。 (2认同)