Java 使用log4j每次运行一个日志文件

Java 使用log4j每次运行一个日志文件,java,logging,log4j,slf4j,appender,Java,Logging,Log4j,Slf4j,Appender,如何将log4j.properties配置为每次运行应用程序都有一个日志文件。 我已经读到,您应该在文件名中使用时间戳,但随着时间的推移,每次运行都会创建许多文件 我尝试了DailyRollingFileAppender和RollingFileAppender,但找不到一种方法来为每次运行配置一个日志。不应将日志拆分为多个日志,也不应将其截断,并且应保留旧运行的文件 每个类都有一个静态org.slf4j.Logger作为其自己的类名: private static final Logger lo

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

我尝试了DailyRollingFileAppender和RollingFileAppender,但找不到一种方法来为每次运行配置一个日志。不应将日志拆分为多个日志,也不应将其截断,并且应保留旧运行的文件

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

private static final Logger log = LoggerFactory.getLogger(Foo.class);
这是我当前的log4j属性

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
log4j.rootLogger=错误,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.patternalyout
log4j.appender.qspaBackendAppender.layout.ConversionPattern=%-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.patternalyout
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.patternalyout
log4j.appender.RootAppender.layout.ConversionPattern=%-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.patternalyout
log4j.appender.RootErrorAppender.layout.ConversionPattern=%-5p:%C{1}%C{2}:%m%n
log4j.appender.RootErrorAppender.threshold=错误
将的答案与此答案相结合,以获得所需的结果

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

  • 我很难找到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()));
        }
    

    要在应用程序启动时启动新日志文件,您可能需要使用OnStartupRiggeringPolicy

    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>
    
    
    C:/log/
    %d{dd/MM/yyyy HH:MM:ss}[%-5p/%t]:%C{1}(%L):%m%n
    

    使用filePattern属性对我很有效

    
    ${日期:yyyy-MM-dd-HH_-MM_-ss}
    
    完美!这正是我想要的,而且比像这样的自定义FileAppender简单得多:但并发执行可能不安全,但这对我来说不是问题“Udo Klimaschewski的答案”->您只是链接到用户配置文件。我们不知道你指的是什么。虽然这个答案可能提供了解决方案,但对于新用户来说,找到你指的是什么是非常糟糕的体验。请复制答案中的重要代码,以便用户无需在多个链接之间导航。您窃取了Klimaschewski的答案:(@salaros:Sleet!!!如果你关注上一个链接,你看不到Klimaschewsky的任何答案!Tobia Zambon所做的是完全正确的。他甚至诚实地引用了他的作者。太棒了!定义系统属性的代码可以放在main()的开头已定义为静态的函数。属性不等于DOS环境变量。若要在日志文件名中使用用户名,必须在静态{}bloc或主函数中定义它。有趣的是,在Windows 7上,Tobia Zambon在文件名:-)中添加用户名,要添加的代码是`System.setProperty(“用户名”,System.getenv(“用户名”))“托比娅·赞本-_-