【问题标题】:Application not writing logs on when log file rotates日志文件旋转时应用程序未写入日志
【发布时间】:2020-05-05 23:52:49
【问题描述】:

我的应用程序正在使用 spring log4j2 并使用 slf4j api 将日志写入单独的日志文件“application.log”。

此应用与其他应用一起部署到 tomcat v8。所有应用共享通用 log4j2 配置并写入通用日志文件“application.log”。

我们有一个 250 mb 的日志轮换策略,当日志文件轮换时,日志不会写入日志文件,令人惊讶的是,所有应用程序中只有一个应用程序能够写入日志文件。

我也可以在本地复制它。你能帮忙解决这个问题吗?

另一个 请在下面找到 log4j2.xml 配置。

JAR 版本

  • slf4j-api 1.7.21
  • log4j-slf4j-impl 2.5
  • log4j-api 2.5
  • log4j-core 2.5
  • log4j-web 2.5

Log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration name="api-config" status="trace" monitorInterval="30">
  <Properties>
    <Property name="logdir">/Users/kramesan/microservices-config/logs</Property>
  </Properties>
  <Appenders>

    <Console name="STDOUT" target="SYSTEM_OUT">
      <PatternLayout pattern="%X{_requestId} %X{authToken} %X{urlEmployeeId} %X{urlCompanyId} [%X{authEmplIds}] [%X{authCompanyIds}] %d{yyy
y-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
    </Console>

    <RollingFile name="ApplicationLogRollingFile" fileName="${logdir}/application.log"
      filePattern="${logdir}/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
      <JSONLayout locationInfo="true" complete="true" compact="true" eventEol="true" properties="true" />
      <Policies>
        <TimeBasedTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="250 MB" />
      </Policies>
      <DefaultRolloverStrategy max="20" />
    </RollingFile>

    <RollingFile name="AuditLogRollingFile" fileName="${logdir}/audit/api-audit.log"
      filePattern="${logdir}/audit/$${date:yyyy-MM}/api-audit-%d{MM-dd-yyyy}-%i.log.gz">
      <PatternLayout>
            <Pattern>%X{_requestId} %X{authToken} %X{urlEmployeeId} %X{urlCompanyId} [%X{authEmplIds}] [%X{authCompanyIds}] %m%n</Pattern>
      </PatternLayout>
      <!-- JSONLayout locationInfo="true" complete="true" compact="true" eventEol="true" properties="true" -->
      <Policies>
        <TimeBasedTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="250 MB" />
      </Policies>
      <DefaultRolloverStrategy max="20" />
    </RollingFile>
        <Async name="ApplicationLogAsync" bufferSize="262144">
         <AppenderRef ref="ApplicationLogRollingFile"/>
     </Async>

     <Async name="AuditLogAsync" bufferSize="262144">
         <AppenderRef ref="AuditLogRollingFile"/>
     </Async>

 </Appenders>
 <Loggers>
     <!--  All the 3rd Party frameworks -->
     <Logger name="org.springframework" level="warn" />

     <Logger name="org.hibernate" level="warn" />

<!-- common package name for all the business application level code -->
     <Logger name="com.trinet" level="info" />

     <!-- Audit Loggger This is used for spring aspect to log before and after execution --> 
     <Logger name="AuditLogger" level="info">
         <AppenderRef ref="AuditLogAsync" />
     </Logger>

     <Root level="info">
         <AppenderRef ref="ApplicationLogAsync" />
     </Root>
 </Loggers>
</Configuration>

【问题讨论】:

    标签: spring log4j2 slf4j tomcat8


    【解决方案1】:

    请编辑您的Logger name。记录器名称属性需要包路径。

    现状

    ...
    <Logger name="AuditLogger" level="info">
    ...
    

    未来

    ...
    <Logger name="com.foo.bar.AuditLogger" level="info" additivity="false">
    ...
    

    ...
    <Logger name="com.foo.bar.*" level="info" additivity="false">
    ...
    

    我认为你最好写属性additivity 因为你的Logger 工作两次com.foo.bar.AuditLogger LoggerRoot Logger。所以你 additivityfalse 然后每个都可以。

    参考链接:Additivity

    【讨论】:

    • 感谢您的评论,如您所见,我们有两个记录器在执行前后记录代码的切入点,我可以在日志文件中看到正确的包名的propper日志。谢谢
    • @krrish0690 祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多