当前位置: 首页 > 面试题库 >

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

黄正浩
2023-03-14
问题内容

我有以下两个软件包:

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>

问题答案:

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

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>


 类似资料:
  • 两个(切换)按钮是否可能在片段之间具有同步行为?即:当按钮A在片段A中打开时,我希望按钮B在片段B中的外观也显示为打开。 我该怎么做呢?最终目标是在任何一个片段上都有一个全局按钮。

  • 问题内容: 我不知道如何配置我的log4j,以便我的debugLog和reportLog彼此分开(不是附加的)。为什么在以下配置中,reportsLog始终为空? 这是我的Java代码: 问题答案: 尝试以下配置: 然后相应地用Java代码配置记录器: 你要输出到吗?如果不是,请将第一行更改为: 并摆脱界限。

  • 我正在为工作中的一个项目尝试闪烁。我已经到了通过应用计数窗口等来处理流的地步。然而,我注意到一个特殊的行为,我无法解释。 看起来一个流是由两个线程处理的,输出也是分成两部分的。 首先,我注意到使用将流打印到标准控制台时的行为。 然后,我打印到一个文件,它实际上正在输出文件夹中的两个名为1和2的文件中打印。 有人能解释一下为什么Flink会有这种行为吗?如何配置它?为什么有必要对结果流进行拆分? 并

  • 问题内容: 下午好, 我有两个单独的但相关的应用程序。它们都应具有自己的后台队列 (请参阅:独立的Sidekiq和Redis进程) 。但是,我偶尔希望能够将作业从推送到的队列中。 从简单的队列/推送角度来看,如果没有现有的Sidekiq / Redis堆栈,则很容易做到这一点: 但是,考虑到我本来会调用a 和from ,那么在这之间可能需要一步。 显然,我可以直接从Sidekiq内部获取序列化和规

  • 在angular中,如果文本是在两个单独的组件中,是否可以将它们环绕在图像周围?还是图像和文本必须存在于同一个组件中?

  • 我正在使用log4j日志记录,并且正在尝试记录到不同的日志文件。我还希望能够在不同的日志文件中显示类名。如何实例化我的两个不同的日志文件:serverFileLog和ClientLogger。我需要传入类名,所以调用get logger,我不能使用logger名。请救命!!!!!!谢谢!! log4j.rootlogger=debug,serverFileLog log4j.appender.se