【问题标题】:Application not saving logs to specific appender应用程序未将日志保存到特定的附加程序
【发布时间】:2019-05-13 20:17:07
【问题描述】:

我正在尝试将一些日志从 Apache James 保存到特定的附加程序。

Apache James 默认使用 Apache Commons Logging 并添加了 Logback。 Logback.xml 配置如下:

    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
            <resetJUL>true</resetJUL>
    </contextListener>

    <!--  Appenders for console and logs -->

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                    <pattern>%d{HH:mm:ss.SSS} %highlight([%-5level]) %thread %logger{15}:%line - %msg%n%rEx</pattern>
                    <immediateFlush>false</immediateFlush>
            </encoder>
    </appender>

    <appender name="JAMES" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>./logs/james.log</file>
            <encoder>
                    <pattern>%d{HH:mm:ss.SSS} [%-5level] %thread %logger{15}:%line - %msg%n%rEx</pattern>
                    <immediateFlush>false</immediateFlush>
            </encoder>

            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">       
               <fileNamePattern>./logs/james.%d{yyyy-MM-dd}.log</fileNamePattern>
               <maxHistory>30</maxHistory>
            </rollingPolicy>
    </appender>

<appender name="JAMES-SERVER" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>./logs/james-server.log</file>
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%-5level] %thread %logger{15}:%line - %msg%n%rEx</pattern>
        <immediateFlush>false</immediateFlush>
    </encoder>

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>./logs/james-server.log.%d{yyyy-MM-dd}</fileNamePattern>
        <maxHistory>30</maxHistory>
    </rollingPolicy>
</appender>

    <logger name="org.domain.mypackage" level="DEBUG">
        <appender-ref ref="JAMES-SERVER" />
    </logger>

    <root level="INFO">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="JAMES"/>
    </root>

Apache James 以

开头
java -classpath "james-server-jpa-guice.jar:james-server-jpa-guice.lib/*:james-server-jpa-guice.lib" -javaagent:james-server-jpa-guice.lib/openjpa-3.0.0.jar -Dlogback.configurationFile=./conf/logback.xml -Dworking.directory=. org.apache.james.JPAJamesServerMain >> ./logs/james.log

所有日志都可以记录到james.log,但org.domain.mypackage 上方的特定包没有记录到james-server.log,但似乎在james.log

对此有什么想法吗?

【问题讨论】:

  • 您似乎缺少additivity 属性:&lt;logger name="org.domain.mypackage" level="DEBUG" additivity="false"&gt;
  • @LuisMuñoz 我已将additivity 添加到相关行,这使得该包中的日志没有登录到james.log,但仍然不在james-server.log 中。想法?
  • 该文件的权限?可能是它已经是一个空的并且属于 root 或其他用户,删除它。另外,我认为您不需要将 `>> ./logs/james.log` 添加到命令中,因为您已经有一个分配给 root 日志级别的文件附加程序。您可能有重复的消息。
  • @LuisMuñoz 我已将 JAMES 附加程序中的 james.log 替换为 james-server.log 并写入该文件,因此没有权限问题。然后我删除了&gt;&gt; ./logs/james.log,但之后不会记录 James 核心代码日志 - 只是 mailet 日志。我的目标是将 James 核心代码分隔为 james.log,将恶意代码日志分隔为 james-server.log。

标签: java logging logback apache-commons-logging james


【解决方案1】:

您的设置可能需要 2 次修复,至少删除 immediateFlush 标记以进行测试,并将 JAMES-APPENDER 添加到 root 记录器。 immediateFlush=false 应在预计有大量日志记录活动时设置,出于测试目的,将其设置为 true

  <root level="DEBUG">
    <appender-ref ref="CONSOLE" />
    <appender-ref ref="JAMES" />
    <appender-ref ref="JAMES-SERVER" />
  </root>

使用logback-examples包可以方便地测试Logback设置,如下:

export LOGBACK_CP="/home/luis.munoz/.m2/repository/org/slf4j/slf4j-api/1.6.1/slf4j-api-1.6.1.jar:/home/luis.munoz/.m2/repository/ch/qos/logback/logback-core/1.1.3/logback-core-1.1.3.jar:logback-examples-1.1.3.jar:/home/luis.munoz/.m2/repository/ch/qos/logback/logback-classic/1.1.3/logback-classic-1.1.3.jar"

java -cp "$LOGBACK_CP" chapters.appenders.ConfigurationTester ~/tmp/logback.xml

以下消息将写入控制台和任何配置文件

12:37:45.336 [DEBUG] main c.a.ConfigurationTester:50 - **Hello test 123
12:37:45.338 [DEBUG] main c.a.ConfigurationTester:54 - logging statement 0
12:37:45.439 [DEBUG] main c.a.ConfigurationTester:54 - logging statement 1
12:37:45.540 [DEBUG] main c.a.ConfigurationTester:54 - logging statement 2
12:37:45.640 [DEBUG] main c.a.ConfigurationTester:54 - logging statement 3
12:37:45.742 [DEBUG] main c.a.ConfigurationTester:54 - logging statement 4
12:37:45.843 [DEBUG] main c.a.ConfigurationTester:54 - logging statement 5
12:37:45.943 [DEBUG] main c.a.ConfigurationTester:54 - logging statement 6
12:37:46.044 [DEBUG] main c.a.ConfigurationTester:54 - logging statement 7
12:37:46.145 [DEBUG] main c.a.ConfigurationTester:54 - logging statement 8
12:37:46.246 [DEBUG] main c.a.ConfigurationTester:54 - logging statement 9
12:37:46.355 [ERROR] main c.a.s.s.Bar:32 - error-level request
java.lang.Exception: test exception
        at chapters.appenders.sub.sample.Bar.subMethodToCreateRequest(Bar.java:32) [logback-examples-1.1.3.jar:na]
        at chapters.appenders.sub.sample.Bar.createLoggingRequest(Bar.java:27) [logback-examples-1.1.3.jar:na]
        at chapters.appenders.ConfigurationTester.main(ConfigurationTester.java:58) [logback-examples-1.1.3.jar:na]

在控制台上,写入了一些对调试配置有用的日志记录

...
12:37:45,333 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [CONSOLE] to Logger[ROOT]
12:37:45,333 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [JAMES] to Logger[ROOT]
12:37:45,333 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [JAMES-SERVER] to Logger[ROOT]
 ...

此外,此示例包允许“播放”配置并检查结果。例如:

  <logger name="chapters.appenders.ConfigurationTester" level="DEBUG" additivity="false">
    <appender-ref ref="JAMES" />
  </logger>

  <logger name="chapters.appenders.sub.sample" level="DEBUG" additivity="false">
    <appender-ref ref="JAMES-SERVER" />
  </logger>

  <root level="DEBUG">
    <appender-ref ref="CONSOLE" />
  </root>

将其记录到 james.log

16:04:44.487 [DEBUG] main c.a.ConfigurationTester:50 - **Hello test 123
16:04:44.490 [DEBUG] main c.a.ConfigurationTester:54 - logging statement 0
16:04:44.590 [DEBUG] main c.a.ConfigurationTester:54 - logging statement 1
16:04:44.691 [DEBUG] main c.a.ConfigurationTester:54 - logging statement 2
16:04:44.792 [DEBUG] main c.a.ConfigurationTester:54 - logging statement 3
16:04:44.892 [DEBUG] main c.a.ConfigurationTester:54 - logging statement 4
16:04:44.993 [DEBUG] main c.a.ConfigurationTester:54 - logging statement 5
16:04:45.093 [DEBUG] main c.a.ConfigurationTester:54 - logging statement 6
16:04:45.194 [DEBUG] main c.a.ConfigurationTester:54 - logging statement 7
16:04:45.295 [DEBUG] main c.a.ConfigurationTester:54 - logging statement 8
16:04:45.395 [DEBUG] main c.a.ConfigurationTester:54 - logging statement 9

这个到 james-server.log

16:04:45.502 [ERROR] main c.a.s.s.Bar:32 - error-level request
java.lang.Exception: test exception
    at chapters.appenders.sub.sample.Bar.subMethodToCreateRequest(Bar.java:32) [logback-examples-1.1.3.jar:na]
    at chapters.appenders.sub.sample.Bar.createLoggingRequest(Bar.java:27) [logback-examples-1.1.3.jar:na]
    at chapters.appenders.ConfigurationTester.main(ConfigurationTester.java:58) [logback-examples-1.1.3.jar:na]

【讨论】:

  • 我收到了该测试的错误消息:[ERROR] main c.a.s.s.Bar:32 - error-level request java.lang.Exception: test exception
  • 大声笑我虽然这也是一个错误,但它是logging test 的一部分。
  • 有趣。无论如何 - 当我将 JAMES-SERVER appender 移动到 ROOT 记录器时,它将记录到 james-server.logjames.log 相同,但是当移回基于包名称的日志时不是。我认为当我将使用 SLF4J 时,它必须与 Apache Common Logging 相关的 Tomcat 代码,它与记录器名称一起工作正常。
  • 终于让它工作了。看来我需要保留 &gt;&gt; ./logs/james.log 并将 immediateFlush 保留为 JAMES-SERVER 的 true
  • true是默认值,因此与删除它相同。
猜你喜欢
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 2017-11-27
  • 1970-01-01
相关资源
最近更新 更多