【问题标题】:One logfile per run with log4j每次使用 log4j 运行一个日志文件
【发布时间】:2013-10-08 13:43:36
【问题描述】:

如何将 log4j.properties 配置为每次运行应用程序只有一个日志文件。 我读过你应该在文件名中使用时间戳,但是随着时间的推移,每次运行都会创建很多文件。

我尝试了 DailyRollingFileAppender 和 RollingFileAppender,但找不到每次运行只配置一个日志的方法。日志不应分成多个日志,不应截断,应保留旧运行的文件。

每个类都有一个静态的 org.slf4j.Logger 作为它自己的类名:

private static final Logger log = LoggerFactory.getLogger(Foo.class);

这是我当前的 log4j.properties

log4j.rootLogger=error, RootAppender, RootErrorAppender

#log4j.logger.com.example=info, qspaBackendAppender, stderr
log4j.logger.com.example=info, qspaBackendAppender
log4j.additivity.com.example=true

#log4j.logger.com.example.util=trace, qspaBackendAppender, stderr
#log4j.additivity.com.example.util=true

log4j.appender.qspaBackendAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.qspaBackendAppender.file=logs/qspaBackend.log
log4j.appender.qspaBackendAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.qspaBackendAppender.layout.ConversionPattern=<%d{yyyy-MM-dd HH:mm:ss}> %-5p : %C{1} %c{2} : %m%n

log4j.appender.stderr=org.apache.log4j.ConsoleAppender
log4j.appender.stderr.Target=System.err
log4j.appender.stderr.layout=org.apache.log4j.PatternLayout
log4j.appender.stderr.layout.ConversionPattern=%-5p %c{1}:%L - %m%n

log4j.appender.RootAppender=org.apache.log4j.RollingFileAppender
log4j.appender.RootAppender.file=logs/root.log
log4j.appender.RootAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.RootAppender.layout.ConversionPattern=<%d{yyyy-MM-dd HH:mm:ss}> %-5p : %C{1} %c{2} : %m%n

log4j.appender.RootErrorAppender=org.apache.log4j.RollingFileAppender
log4j.appender.RootErrorAppender.file=logs/rootError.log
log4j.appender.RootErrorAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.RootErrorAppender.layout.ConversionPattern=<%d{yyyy-MM-dd HH:mm:ss}> %-5p : %C{1} %c{2} : %m%n
log4j.appender.RootErrorAppender.threshold=error

【问题讨论】:

    标签: java logging log4j slf4j appender


    【解决方案1】:

    使用 filePattern 属性

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration>
        <Properties>
            <property name="filePattern">${date:yyyy-MM-dd-HH_mm_ss}</property>
        </Properties>
        <Appenders>
            <File name="File" fileName="export/logs/app_${filePattern}.log" append="false">
                <PatternLayout
    pattern="%d{yyyy-MMM-dd HH:mm:ss a} [%t] %-5level %logger{36} - %msg%n" />
            </File>
        </Appenders>
        <Loggers>
            <Root level="debug">
                <AppenderRef ref="Console" />
                <AppenderRef ref="File" />
            </Root>
        </Loggers>
    </Configuration>
    

    【讨论】:

      【解决方案2】:

      要在应用启动时启动新的日志文件,您可能需要使用 OnStartupTriggeringPolicy

      Triggering Policies

      XML 配置示例:

      <?xml version="1.0" encoding="UTF-8"?>
      <Configuration status="DEBUG">
          <Properties>
              <Property name="log-path">C:/Logs/</Property>
          </Properties>
          <Appenders>
              <appender name="console" class="org.apache.log4j.ConsoleAppender">
                  <layout class="org.apache.log4j.PatternLayout">
                      <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
                  </layout>
              </appender>
              <RollingFile name="RollingFile" fileName="${log-path}/app.log"
                           filePattern="${log-path}/app-%d{yyyy-MM-dd}-%i.log">
                  <PatternLayout>
                      <pattern>%d{dd/MM/yyyy HH:mm:ss} [%-5p/%t]: %C{1}(%L): %m%n</pattern>
                  </PatternLayout>
                  <Policies>
                      <SizeBasedTriggeringPolicy size="10MB"/>
                      <OnStartupTriggeringPolicy />
                  </Policies>
                  <DefaultRolloverStrategy max="100"/>
              </RollingFile>
          </Appenders>
          <Loggers>
              <Logger name="root" level="debug" additivity="false">
                  <appender-ref ref="RollingFile" level="debug"/>
                  <appender-ref ref="console" level="debug"/>
              </Logger>
              <Root level="debug" additivity="false">
                  <AppenderRef ref="RollingFile"/>
              </Root>
          </Loggers>
      </Configuration>
      

      很适合我

      【讨论】:

        【解决方案3】:

        结合Udo Klimaschewski 的答案和question 的答案以获得所需的结果。

        1. 添加属性 append = false
        2. 添加 current.time 系统属性并在文件名中使用它

        【讨论】:

        • 完美!正是我正在寻找的东西,并且比这样的自定义 FileAppender 简单得多:veerasundar.com/blog/2009/08/… 但是并发执行可能不安全,但这对我来说不是问题
        • 'Udo Klimaschewski 的答案' -> 您只是链接到用户个人资料。我们不知道您指的是什么。
        • 虽然这个答案可能会提供解决方案,但对于新用户来说,找到您所指的内容是非常糟糕的体验。请复制答案中的重要代码,以便用户无需在多个链接之间导航。
        【解决方案4】:

        我在检索 Udo Klimaschewski 的 Udy 所指的答案时遇到了麻烦,所以我在这里提出了我的解决方案。 log4j.properties:

        # Root logger option
        log4j.rootLogger=INFO, fileout
        
        # Direct log messages to file
        log4j.appender.fileout=org.apache.log4j.FileAppender
        log4j.appender.fileout.File=/logs/myapp_${current.date}.log
        log4j.appender.fileout.ImmediateFlush=true
        log4j.appender.fileout.Threshold=debug
        log4j.appender.fileout.Append=false
        log4j.appender.fileout.layout=org.apache.log4j.PatternLayout
        log4j.appender.fileout.layout.conversionPattern=%5p | %d | %m%n
        

        然后把这个块放到主类中:

        public class Starter {
            static{
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hhmmss");
                System.setProperty("current.date", dateFormat.format(new Date()));
            }
        

        【讨论】:

        • 你偷了 Klimaschewski 的答案 :(
        • @salaros:偷了!!!如果您点击之前的链接,您将看不到 Klimaschewsky 的任何回答! Tobia Zambon 的所作所为是完全正确的。他甚至可以诚实地引用他的作者。太棒了!
        • 定义系统属性的代码可以放在已经定义为静态的main()函数的开头。
        • 属性不等于 DOS 环境变量。要在日志文件名中使用 USERNAME,您必须在 static {} bloc 或 main 函数中定义它。 Tobia Zambon 在文件名中添加 USERNAME 会很有趣:-) 在 Windows 7 上,要添加的代码是 `System.setProperty("USERNAME", System.getenv("USERNAME"));`
        • @tobia-zambon -_-
        猜你喜欢
        • 1970-01-01
        • 2015-09-30
        • 2017-07-11
        • 2015-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-20
        • 1970-01-01
        相关资源
        最近更新 更多