【问题标题】:Print log messages from 2 classes placed under same package hierarchy to 2 different files将位于同一包层次结构下的 2 个类的日志消息打印到 2 个不同的文件
【发布时间】:2013-07-04 10:28:57
【问题描述】:

我在同一个包中有 2 个 Java 类。我想将这 2 个类的消息记录到 2 个不同的日志文件中。

日志消息不应在这两个文件中的任何一个中重复。

我正在使用以下 log4j.properties 文件:

# Set root category priority to DEBUG and its appender to CONSOLE and LOGFILE_ENGINE.
log4j.rootCategory=DEBUG, LOGFILE_ENGINE, SYNC_HANDLER


log4j.additivity.LOGFILE_ENGINE = false
log4j.additivity.SYNC_HANDLER = false


log4j.category.org.jboss=ERROR
log4j.category.org.apache.axis=ERROR
log4j.category.org.springframework=ERROR
log4j.category.org.hibernate=ERROR
log4j.category.org.jgroups=ERROR
log4j.category.org.apache.catalina.loader.WebappClassLoader=OFF
log4j.logger.net.sourceforge.stripes=ERROR
log4j.logger.net.sf.ehcache=ERROR
log4j.additivity.org.jboss.cache=false
log4j.logger.org.quartz=ERROR

# LOGFILE_ENGINE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE_ENGINE=org.apache.log4j.RollingFileAppender
log4j.appender.LOGFILE_ENGINE.File=${catalina.home}/logs/file1.log
log4j.appender.LOGFILE_ENGINE.Append=true
log4j.appender.LOGFILE_ENGINE.maxBackupIndex=5
log4j.appender.LOGFILE_ENGINE.maxFileSize=10MB
log4j.appender.LOGFILE_ENGINE.Threshold=INFO
log4j.appender.LOGFILE_ENGINE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE_ENGINE.layout.ConversionPattern=%d{MMM dd, yyyy hh:mm:ss.SSS a} %-5p %c - %m%n


log4j.appender.SYNC_HANDLER=org.apache.log4j.RollingFileAppender
log4j.appender.SYNC_HANDLER.File=${catalina.home}/logs/file2.log
log4j.appender.SYNC_HANDLER.Append=true
log4j.appender.SYNC_HANDLER.maxBackupIndex=5
log4j.appender.SYNC_HANDLER.maxFileSize=10MB
log4j.appender.SYNC_HANDLER.Threshold=DISASTER#PackageName.className
log4j.appender.SYNC_HANDLER.layout=org.apache.log4j.PatternLayout
log4j.appender.SYNC_HANDLER.layout.ConversionPattern=%d{MMM dd, yyyy hh:mm:ss.SSS a} %-5p %c - %m%n

DISASTER#PackageName.className 是我通过扩展org.apache.log4jLevel 类制作的自定义级别

我的问题 1. 来自 file2.log 的日志消息在 file1.log 文件中重复出现。

2. 是否可以通过 log4j 进行基于类的日志记录。

不用说我对Log4j....很幼稚。

【问题讨论】:

    标签: java logging log4j rollingfileappender


    【解决方案1】:

    您正在寻找的内容类似于:

    log4j.rootLogger=DEBUG, file1, file2
    
    log4j.appender.file1=org.apache.log4j.RollingFileAppender
    ...
    
    log4j.appender.file2=org.apache.log4j.RollingFileAppender
    ...
    
    log4j.logger.my.package.MyClassA=DEBUG, file1
    log4j.additivity.my.package.MyClassA=false
    
    log4j.logger.my.package.MyClassB=DEBUG, file2
    log4j.additivity.my.package.MyClassB=false
    

    这意味着您可以在记录器中使用类名。希望这会有所帮助!

    【讨论】:

    • 很抱歉,我已经尝试过了,但它会引发错误。一些 Bean 创建异常。
    • 请参考下面我的回答。谢谢。
    【解决方案2】:

    我找到了解决问题的解决方案
    我为我想要单独的日志的班级创建了一个自定义日志级别。
    我尝试了以下 log4j 配置:

    log4j.rootCategory=DEBUG, LOGFILE_ENGINE
    
    log4j.category.packageName.className = DEBUG, packageName.className.syncLogger
    log4j.additivity.packageName.className= false
    
    log4j.appender.LOGFILE_ENGINE=org.apache.log4j.RollingFileAppender
    log4j.appender.LOGFILE_ENGINE.File=${catalina.home}/logs/file1.log
    .....................
    
    log4j.appender.packageName.className.syncLogger=org.apache.log4j.RollingFileAppender
    log4j.appender.packageName.className.syncLogger.File=${catalina.home}/logs/file2.log
    log4j.appender.packageName.className.syncLogger.Threshold=DISASTER#packageName.SyncLogLevel
    .....................
    

    而且,我创建了如下的记录器引用:

    private static final String FQCN = className.class.getName();
    private static final String SYNC_LOGGER_NAME = FQCN + ".syncLogger";
    public static customLoggingClassName syncLogger = Logger.getLogger(SYNC_LOGGER_NAME);
    

    下面是用于创建自定义关卡(DISASTER)的自定义关卡类(SyncLogLevel):

    public class SyncLogLevel extends Level{
    
        private static final long serialVersionUID = 1L;
    
        public SyncLogLevel(int level, String levelStr, int syslogEquivalent) {
            super(level, levelStr, syslogEquivalent);
        }
        public static SyncLogLevel toLevel(int val, Level defaultLevel) {
            return DISASTER;
        }
    
        public static SyncLogLevel toLevel(String sArg, Level defaultLevel) {
            return DISASTER;
        }
        public static final SyncLogLevel DISASTER = new SyncLogLevel(60000, "DISASTER", 0);
    
    }
    

    在此之后,您必须按如下方式登录所需的类:

    syncLogger.log(SyncLogLevel.DISASTER, "Log Message");
    

    最后,从 syncLogger 调用的所有日志级别为“DISASTER”的日志消息将转到一个单独的文件(file2.log)

    完成所有这些操作后,我的所有日​​志都将分别放入所需的文件中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-08
      • 2014-11-07
      • 2019-09-20
      • 2010-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多