Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.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 如何停止日志文件相互添加?_Java_Logging_Log4j - Fatal编程技术网

Java 如何停止日志文件相互添加?

Java 如何停止日志文件相互添加?,java,logging,log4j,Java,Logging,Log4j,我在代码中的每个类中都有两个log4j记录器: logA = Logger.getLogger(com.some.class.in.my.project); logB = Logger.getLogger('perf'); 我希望这两个记录器将数据输出到两个完全不同的文件中。我似乎无法让它工作 以下是我的log4j属性: log4j.rootLogger = myAppenderA # A log4j.appender.myAppenderA=org.apache.

我在代码中的每个类中都有两个log4j记录器:

logA = Logger.getLogger(com.some.class.in.my.project);
logB = Logger.getLogger('perf');
我希望这两个记录器将数据输出到两个完全不同的文件中。我似乎无法让它工作

以下是我的log4j属性:

    log4j.rootLogger = myAppenderA


    # A
    log4j.appender.myAppenderA=org.apache.log4j.RollingFileAppender
    log4j.appender.myAppenderA.File=../logs/mylogfileA.log
    log4j.appender.myAppenderA.additivity=false
    log4j.appender.myAppenderA.Threshold=DEBUG
    log4j.appender.myAppenderA.layout=org.apache.log4j.PatternLayout
    log4j.appender.myAppenderA.layout.ConversionPattern=%d{ISO8601} %-5p 0 %m%n


    # perf
    log4j.appender.perf=org.apache.log4j.RollingFileAppender
    log4j.appender.perf.File=..logs/perf.log
    log4j.appender.perf.additivity=false
    log4j.appender.perf.Threshold=DEBUG
    log4j.appender.perf.layout=org.apache.log4j.PatternLayout
    log4j.appender.perf.layout.ConversionPattern=%d{ISO8601} %-5p 0 %m%n

    log4j.logger.myAppenderB = perf 

myLogfileA.logperf.log都包含相同的数据。假设将加法设置为false可以修复这一问题,但我已经尝试过了,效果甚微

可加性是记录器的属性,而不是appender,因此您必须从appender中删除
可加性
属性,并将其添加到记录器配置中

目前,文件中只有rootLogger配置(并且您没有为其定义日志记录级别),因此所有日志记录程序都将从中扩展appender。要停止将消息传播记录到祖先,必须使用记录器上的additivity属性。因此,要实现您的目标,您必须:

  • rootLogger
    定义一个附加器(
    root
    )。它将是默认值,并由其他日志记录程序继承,这些日志记录程序没有
    additivity=false
  • myappender
    appender分配给
    mypackage.MyClass
    logger
  • pref
    追加器分配给
    pref
    记录器
  • myappender
    pref
    记录器的
    additivity
    设置为
    false
    ,以停止向祖先记录器传播日志消息
  • 有一个孔特性文件:

    log4j.rootLogger = DEBUG, root
    
    
    # Root
    log4j.appender.root=org.apache.log4j.RollingFileAppender
    log4j.appender.root.File=logs/mainLogInheritable.log
    log4j.appender.root.Threshold=DEBUG
    log4j.appender.root.layout=org.apache.log4j.PatternLayout
    log4j.appender.root.layout.ConversionPattern=%d{ISO8601} %-5p 0 %m%n
    
    
    # A
    log4j.appender.myAppenderA=org.apache.log4j.RollingFileAppender
    log4j.appender.myAppenderA.File=logs/mylogfileA.log
    #log4j.appender.myAppenderA.additivity=false
    log4j.appender.myAppenderA.Threshold=DEBUG
    log4j.appender.myAppenderA.layout=org.apache.log4j.PatternLayout
    log4j.appender.myAppenderA.layout.ConversionPattern=%d{ISO8601} %-5p 0 %m%n
    
    
    # perf
    log4j.appender.perf=org.apache.log4j.RollingFileAppender
    log4j.appender.perf.File=logs/perf.log
    #log4j.appender.perf.additivity=false
    log4j.appender.perf.Threshold=DEBUG
    log4j.appender.perf.layout=org.apache.log4j.PatternLayout
    log4j.appender.perf.layout.ConversionPattern=%d{ISO8601} %-5p 0 %m%n
    
    
     log4j.logger.mypackage.MyClass = DEBUG, myAppenderA
     log4j.logger.perf  = DEBUG, perf
    
     log4j.additivity.perf = false
     log4j.additivity.mypackage.MyClass = false
    
    要测试它是否记录到三个不同的文件,可以尝试以下操作:

    Logger.getLogger("mypackage.MyClass").debug("1111");
    Logger.getLogger("perf").debug("2222");
    Logger.getLogger("anyName").debug("3333");
    

    不,对不起,这个不行。此属性文件配置仅将所有附加器中的数据发送到logs/mylogfileA.log文件。而且不影响性能。你是如何创建你的记录器的?我对答案进行了编辑,以说明如何使用记录器将消息打印到3个不同的文件中。我还更改了日志位置(删除了
    ,我认为应该是
    。/
    而不是
    ),所以请确保您看到的是正确的位置谢谢,实际上我认为我的问题更多地与Eclipse、Maven、Glassfish和其他一千件事情有关。我认为你有正确的解决方案,我只需要先考虑一些事情。