Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用log4j将错误和信息消息分别记录到syslog中?_Java_Logging_Log4j - Fatal编程技术网

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

Java 如何使用log4j将错误和信息消息分别记录到syslog中?,java,logging,log4j,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=l

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。

在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只记录错误(及更高):将阈值设置为错误级别。以较低级别记录的所有消息都不会显示

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

您可以使用筛选器只记录“低于”级别的消息,例如
ERROR
level

在log4j 2中:PropertyConfiguration不支持该筛选器。因此,您必须更改为XML配置才能使用它。看

“特定级别”示例


或“水平范围”


在log4j 1.2中,我们可以在属性文件中使用过滤器。为了实现完全分离和更好的定制,我认为建议定义更多的记录器

我的例子:

log4j.属性:

# 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
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);
    }
}
Log4jLogger类:

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

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