【问题标题】:Using Log4J 1.*, how can I write two packages to two separate files?使用 Log4J 1.*,如何将两个包写入两个单独的文件?
【发布时间】:2013-05-09 23:20:19
【问题描述】:

我有以下两个包:

com.mycorp.project.first
com.mycorp.project.second

我想配置 Log4J (SLF4J) 将日志从一个包写入一个文件,从另一个包写入第二个文件。我不希望他们混在一起。

明确地说,这是一个正在运行的项目/一个进程。

我尝试过过滤和记录器,但它们似乎被 log4j 忽略了。两个文件始终相同。

编辑:感谢您到目前为止的答案,这就是我所拥有的,但它不起作用。两个输出文件完全相同。

<configuration debug="true">
<contextName>dev</contextName>

<appender name="FIRST_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>A:/dev/LogTesting/logs/first.log</file>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>INFO</level>
    </filter>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>A:/dev/LogTesting/logs/first.%d{yyyyMMdd}%d{_HHmmss,aux}.log.gz</fileNamePattern>
    </rollingPolicy>
    <encoder>
        <pattern>%d{MMM dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
</appender>

<appender name="SECOND_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>A:/dev/LogTesting/logs/second.log</file>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>INFO</level>
    </filter>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>A:/dev/LogTesting/logs/second.%d{yyyyMMdd}%d{_HHmmss,aux}.log.gz</fileNamePattern>
    </rollingPolicy>
    <encoder>
        <Pattern>%d{MMM dd HH:mm:ss.SSS} %property{HOSTNAME} [%thread] %level %logger{36} %msg%n</Pattern>
    </encoder>
</appender>

<!-- =============================================================== -->
<logger name="com.test.apples" additivity="false">
    <level value="DEBUG" />
    <appender-ref ref="FIRST_FILE"  />
</logger>

<logger name="com.test.oranges" additivity="false">
    <level value="DEBUG" />
    <appender-ref ref="SECOND_FILE"  />
</logger>
<!-- =============================================================== -->

<category name="com.test.apples" additivity="false">
    <priority value="DEBUG"/>
    <appender-ref ref="FIRST_FILE"/>
</category>

<category name="com.test.oranges" additivity="false">
    <priority value="DEBUG"/>
    <appender-ref ref="SECOND_FILE"/>
</category>

<!-- =============================================================== -->

<!-- default -->
<root level="WARN">
    <appender-ref ref="FIRST_FILE" />
    <appender-ref ref="SECOND_FILE" />
</root>

【问题讨论】:

    标签: java logging log4j filtering slf4j


    【解决方案1】:

    试试这是属性文件的例子:

    log4j.rootLogger=DEBUG, CONSOLE
    # Each package has different appender name     
    log4j.logger.com.mycorp.project.first=DEBUG, FIRST
    log4j.logger.com.mycorp.project.second=DEBUG, SECOND
    
    log4j.appender.FIRST=org.apache.log4j.RollingFileAppender
    log4j.appender.FIRST.File=./first.log
    log4j.appender.FIRST.layout=org.apache.log4j.PatternLayout
    
    log4j.appender.SECOND=org.apache.log4j.RollingFileAppender
    log4j.appender.SECOND.File=./second.log
    log4j.appender.SECOND.layout=org.apache.log4j.PatternLayout
    

    或者这个用于 XML(只突出重要部分):

    <!-- FIRST appender definition -->
    <appender name="FIRST" class="org.apache.log4j.FileAppender">
        ...
    </appender> 
    
    <!-- SECOND appender definition -->
    <appender name="SECOND" class="org.apache.log4j.FileAppender">
        ...
    </appender>
    
    <!-- logger package com.mycorp.project.first -->
    <logger name="com.mycorp.project.first">
        <level value="DEBUG" />
        <appender-ref ref="FIRST"/>
    </logger>
    
    <!-- logger for package com.mycorp.project.second -->
    <logger name="com.mycorp.project.second">
        <level value="DEBUG" />
        <appender-ref ref="SECOND"/>
    </logger>
    

    【讨论】:

    • 对不起,我忘了说我有一个xml配置文件。 xml 中 this 的等价物是什么? log4j.logger.com.mycorp.project.first=调试,首先
    • 对此我有两个问题: 1. 如果附加程序之间的区别只是文件名,有没有办法定义一次公共属性(XML)以避免冗余? 2. 是否可以将一个记录器映射到多个包?
    【解决方案2】:

    创建两个附加程序LOG1LOG2,每个日志文件一个。然后在 log4j 配置文件中参考这些 appender 定义两个类别(每个包一个)。

    <category name="com.mycorp.project.first" additivity="true">
        <priority value="TRACE"/>
        <appender-ref ref="LOG1"/>
    </category>
    

    Appender2

    <category name="com.mycorp.project.second" additivity="true">
        <priority value="TRACE"/>
        <appender-ref ref="LOG2"/>
    </category>
    


    【讨论】:

      【解决方案3】:

      动态放置文件路径.in log4j.properties

      log4j.appender.FILE.File=${file.name}
      

      并在java中设置文件路径System.setProperty("file.name", FILEPATH);

      【讨论】:

        【解决方案4】:

        您只需指定 2 个附加程序,但为两者提供相同的输出日志文件名。

        #same appender for both packages
        log4j.logger.package1=INFO,MyCommonLogger    
        log4j.logger.package2=INFO,MyCommonLogger
        
        log4j.appender.MyCommonLogger=org.apache.log4j.DailyRollingFileAppender
        log4j.appender.MyCommonLogger.layout=org.apache.log4j.PatternLayout
        log4j.appender.MyCommonLogger.layout.ConversionPattern=%t %d{MM/dd/yy HH:mm:ss} %x %-5p %c %M - %m%n
        
        #single log file for logs from both packages
        log4j.appender.MyCommonLogger.File=/somewhereonserver/log/mysinglelogfile.log
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-12
          相关资源
          最近更新 更多