java 使用 Log4J 1.*,如何将两个包写入两个单独的文件?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/16564159/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 23:18:49  来源:igfitidea点击:

Using Log4J 1.*, how can I write two packages to two separate files?

javalogginglog4jfilteringslf4j

提问by Csaba

I have the following two packages:

我有以下两个包:

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

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

I'd like to configure Log4J (SLF4J) to write the logs from one package to one file, and from the other package to a second file. I do not want them to be mixed in together.

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

To be clear, this is one project/one process running.

需要明确的是,这是一个项目/一个进程在运行。

I've tried filtering and with loggers but they seem to be ignored by log4j. Both files are always identical.

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

Edit: Thank you for the answers so far, this is what I've got and it's not working. Both output files are identical.

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

<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>

回答by Wayan Wiprayoga

Try this is the example of properties file:

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

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

or this for XML (only highlight important part):

或这对于 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>

回答by basiljames

Create two appenders LOG1and LOG2, one for each log file. After that define two categories(one for each package) with reference to these appenders int the log4j config file.

创建两个 appenderLOG1LOG2,每个日志文件一个。之后,参考 log4j 配置文件中的这些 appender 定义两个类别(每个包一个)。

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

Appender2

附加程序2

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



回答by KhAn SaAb

put dynamiclly file path .in log4j.properties

将动态文件路径 .in log4j.properties

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

And in java set file path System.setProperty("file.name", FILEPATH);

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

回答by ObviousChild

you just specify 2 appenders, but give same output log file name for both.

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

#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