One logfile per run with log4j

java logging log4j slf4j appender

19168 просмотра

3 ответа

1625 Репутация автора

How do you configure log4j.properties to have exactly one logfile per run of an app. I've read that you should use a timestamp in the filename but that will create many files per run as time goes by.

I tried DailyRollingFileAppender and RollingFileAppender but can't find a way to configure exctly one log per run. The log should not be broken into multiple logs and it shouldn't be truncated and files of old runs should be preserved.

Each class has a static org.slf4j.Logger for it's own class name:

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

This is my current 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
Автор: lilalinux Источник Размещён: 02.10.2013 08:00

Ответы (3)


2 плюса

1992 Репутация автора

Решение

Combine the answer of Udo Klimaschewski and the answer from this question in order to get the desired result.

  1. add the property append = false
  2. add a current.time system property and use it in the file name
Автор: Udy Размещён: 02.10.2013 09:25

13 плюса

6460 Репутация автора

I had troubles retrieving which Udo Klimaschewski's answer Udy was referring so I put here my solution. 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

Then put in the main class this block:

public class Starter {
    static{
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hhmmss");
        System.setProperty("current.date", dateFormat.format(new Date()));
    }
Автор: Tobia Zambon Размещён: 08.04.2016 09:56

2 плюса

1255 Репутация автора

To start a new log file on app startup you may want to use OnStartupTriggeringPolicy

Triggering Policies

Example of XML config:

<?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>

Works well for me

Автор: Vadim Zin4uk Размещён: 13.06.2018 11:16
Вопросы из категории :
32x32