【问题标题】:Does log4j provide any mechanism to daily archive log?log4j 是否为每日归档日志提供任何机制?
【发布时间】:2011-01-05 22:37:18
【问题描述】:

log4j 1.2 是否提供任何机制来每日归档日志?

每个人都说我可以通过 org.apache.log4j.rolling.TimeBasedRollingPolicy 做到这一点,但在 1.2.15 的源代码中我看不到任何 TimeBasedRollingPolicy 类。

我找到了解决办法:

<appender name="FILE" class="org.apache.log4j.rolling.RollingFileAppender">
   <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>

   <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
       <param name="ActiveFileName" value="${jboss.server.log.dir}/server.log"/>
       <!-- roll log file once a day -->
       <param name="FileNamePattern" value="${jboss.server.log.dir}/archives/server.log.%d.gz"/>
   </rollingPolicy>

   <!-- A PatternLayout that limits the number of lines in stack traces -->
   <layout class="com.mtvi.log4j.StackTraceLimitingPatternLayout">
       <!-- The full pattern: Date MS Priority [Category] (Thread) Message\n -->
       <param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n"/>
   </layout>
</appender>

【问题讨论】:

  • @user253202 您好,如果您使用 apache-log4j-extras 找到了您的请求的解决方案,请将其放在这里以便与其他人共享。将其标记为您自己的答案。

标签: java log4j logging


【解决方案1】:

您需要将 appender 定义为 DailyRollingFileAppender 并将日期模式定义为按日粒度。以下是一个名为 'file' 的示例 appender,它输出到 application.log 并通过将日期附加到午夜之后的末尾并开始一个新文件来每天滚动文件。

log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=application.log
log4j.appender.file.DatePattern='.'yyyy-MM-dd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d %5p [%t] - %m%n

然后您需要定义您的记录器(或 rootLogger)以输出到此附加程序。例如:

log4j.rootLogger=debug, file

【讨论】:

  • 好的,如何使它不将文件滚动到与原始文件相同的文件夹,而是滚动到任何其他已定义的文件夹?
  • 如果我想在一段时间后删除日志文件并重新开始一个新的日志文件怎么办?用例是,我不需要旧日志。
  • @Cyber​​Knight 这是一篇很老的帖子。我建议您转到 logback。你可以很容易地做到这一点和其他事情(比如将存档文件移动到其他目录并压缩它们)。您还可以指定要保留多少存档文件,例如,如果您每天滚动并且只想保留 1 周的数据,则将 maxHistory 设置为 7。logback.qos.ch/manual/appenders.html#TimeBasedRollingPolicy
【解决方案2】:

您可以使用DailyRollingFileAppender 完成您的要求。

【讨论】:

  • 是的,但它不允许我将滚动日志放入特定文件夹。我找到了一个解决方案 - apache-log4j-extras
【解决方案3】:
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=application.log
log4j.appender.file.DatePattern='.'yyyy-MM-dd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d %5p [%t] - %m%n

在我的 application.properties 文件中按照上述配置 log4j.Appender.file 在我的 SpringBootApplication 中似乎不起作用。最后,我使用了 logback-spring.xml 文件解决方案。该文件位于 src/main/recources (您通常放置 application.properties 文件的默认文件夹)。

在您的 pom.xml 中不需要 maven 依赖项,但在应用程序的根目录中创建一个 /logs/archived 文件夹。文件“nameOfYourLog.log”将在第二天自动归档到 ./logs/archived 文件夹中。由于此文件夹位于您的 jar 文件之外,因此可以在将其部署到生产服务器时轻松访问以查看日志(针对所需日期)。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <property name="DEV_HOME" value="./logs" />
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n
            </Pattern>
        </layout>
    </appender>
    <!--<appender name="FILE-AUDIT" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
    <appender name="FILE-AUDIT" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${DEV_HOME}/nameOfYourLog.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>
                %d{yyyy-MM-dd HH:mm:ss} - %msg%n
            </Pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- rollover daily -->
            <fileNamePattern>${DEV_HOME}/archived/debug.%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <logger name="com.the.package.you.wish.to.log" level="debug" additivity="false">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE-AUDIT" />
    </logger>

    <root level="error">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE-AUDIT" />
    </root>

</configuration>

【讨论】:

  • Spring Boot 不直接使用 log4j,所以使用像 log4j.appender.* 这样的属性是行不通的。您需要使用其日志记录属性,前缀为logging。例如:logging.file=application.log。他们需要进入您的application.propertiesapplication.ymldocs.spring.io/spring-boot/docs/2.0.4.RELEASE/reference/html/… 否则创建一个成熟的 logback-spring.xml 配置。
【解决方案4】:

使用log4j-extras:

<appender name="FILE" class="org.apache.log4j.rolling.RollingFileAppender">
   <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>

   <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
       <param name="ActiveFileName" value="${jboss.server.log.dir}/server.log"/>
       <!-- roll log file once a day -->
       <param name="FileNamePattern" value="${jboss.server.log.dir}/archives/server.log.%d.gz"/>
   </rollingPolicy>

   <!-- A PatternLayout that limits the number of lines in stack traces -->
   <layout class="com.mtvi.log4j.StackTraceLimitingPatternLayout">
       <!-- The full pattern: Date MS Priority [Category] (Thread) Message\n -->
       <param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n"/>
   </layout>
</appender>

注意:此答案是从 OP 的问题中提取的,以保持 Stack Exchange 规定的正确格式。 (OP 显然没有回应 jbx 的评论。)

【讨论】:

    猜你喜欢
    • 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-02-20
    相关资源
    最近更新 更多