0
votes

I'm configuring the loggers on our servers to zip logs every day. I also need to make sure that individual log files don't get too large (say 10MB per file).

Neither has worked yet, but first I'd like to tackle the problem of file size.

Here is my log4j.properties file:

log4j.rootLogger=DEBUG, file

log4j.appender.file=org.apache.log4j.rolling.RollingFileAppender
log4j.appender.file.rollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
log4j.appender.file.rollingPolicy.fileNamePattern=./log/logging.%d.log.zip
log4j.appender.file.TriggeringPolicy=org.apache.log4j.rolling.SizeBasedTriggeringPolicy
log4j.appender.file.TriggeringPolicy.maxFileSize=1000000
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

We use log4j 1.2.17, and now I added log4j extras of the same version.

When I test the logging, it creates arbitrary large files. I tried maximumFileSize and MaxFileSize instead of maxFileSize, "10MB" instead of a number, but nothing worked.

I also tried setting the property programmatically, although it would make things difficult, as we have lots of classes that use the logger.

But this also didn't work. It turns out, there are no Appenders in my Logger instance (?). Here is my code:

logger = Logger.getLogger(LogTest.class);
//        RollingFileAppender app = (RollingFileAppender) logger.getAppender("file");
//        app.setMaxFileSize("1000000");
Enumeration allAppenders = logger.getAllAppenders();
System.out.println(allAppenders);
for (Enumeration<Object> iter = allAppenders; iter.hasMoreElements();) {
    Object elem = iter.nextElement();
    System.out.println(elem);
}

The output is a null Enumeration:

org.apache.log4j.helpers.NullEnumeration@1161fded

I did not find another post that was useful for my problem. Any ideas?

1

1 Answers

0
votes

@GregT As you have known, log4j has three major constructs - Appenders, priority (logger) and pattern layout. By default, the root Logger is set when we instantiate the log4j such as Logger log = Logger.getInstance(Somclass.class) -> it adds the addiviity of the rootlogger (means that the priority and level set in the rootlogger is inherited by this child logger by default). Now you can choose to define your own priority and level in the lo4j configuration (either in xml or properties file).

Here is what I have configured for the same. Eliminating the triggering policy and dynamic naming, here is a sample configuration using the .properties file

log4j.threshold = INFO
#Specify the appender and the priority
log4j.rootLogger = DEBUG, Appender1, Appender2

log4j.appender.Appender1 = org.apache.log4j.ConsoleAppender

log4j.appender.Appender2 = org.apache.log4j.RollingFileAppender
log4j.appender.Appender2.File = app/log1.log

log4j.appender.Appender1.layout = org.apache.log4j.PatternLayout
log4j.appender.Appender2.layout = org.apache.log4j.PatternLayout

# Print the date in ISO 8601 format
log4j.appender.Appender1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.Appender2.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

Note: Here if you set the threshold to INFO and even if the priority is set to DEBUG level, it just prints out the statements complying upto INFO level in the "log" instance.

Note we could also set different loggings for different modules

log4j.rootLogger=DEBUG

# AdminFileAppender - used to log messages in the admin.log file.
log4j.appender.AdminFileAppender=org.apache.log4j.FileAppender
log4j.appender.AdminFileAppender.File=app/admin.log
log4j.appender.AdminFileAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.AdminFileAppender.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

# ReportFileAppender - used to log messages in the report.log file.
log4j.appender.ReportFileAppender=org.apache.log4j.FileAppender
log4j.appender.ReportFileAppender.File=app/report.log
log4j.appender.ReportFileAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.ReportFileAppender.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

**log4j.logger.com.vaannila.admin=,AdminFileAppender 
log4j.logger.com.vaannila.report=,ReportFileAppender** 

You could use RollingFileAppender if incase you wanted to roll out new files if you reach the threashold size configured. Here Admin module logs are written to "admin.log" file and report module are written "report.log" file

Hope this helps

EDIT: I fear that Timebased/Sizebased triggering policy works well and only with xml configuration rather than property file configuration. Please check on that. And also you dont have to include apache-log4j-extras dependency. 1.2.17 comes shipped with it. here is an XML based config that I use

 <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>

        <RollingFile name="info" filepattern="apps/logs/${hostName}-info-%i.log"
            filename="apps/logs/${hostName}-info.log">

            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%-5p] %X{userName} [%C] %F:%L - %m%n" />
            <Policies>

                <SizeBasedTriggeringPolicy size="20 MB" />

            </Policies>

            <DefaultRolloverStrategy max="1" min="1" />

        </RollingFile>
        <RollingFile name="debug" filepattern="apps/logs/${hostName}-debug-%i.log"
            filename="apps/logs/${hostName}-debug.log">

            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%-5p] %X{userName} [%C] %F:%L - %m%n" />
            <Policies>

                <SizeBasedTriggeringPolicy size="20 MB" />

            </Policies>

            <DefaultRolloverStrategy max="1" min="1" />

        </RollingFile>
        <Routing name="RoutingAppender">
            <Routes pattern="${ctx:logFileName}">
                <Route>
                    <RollingFile name="${ctx:logFileName}-logfile"
                        fileName="apps/logs/${hostName}-${ctx:logFileName}.log"
                        filePattern="apps/logs/${hostName}-${ctx:logFileName}-%i.log">
                        <PatternLayout>
                            <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS}[%X{logTrackingId}] [%t] %c{1} - %msg%n
                            </pattern>
                        </PatternLayout>
                        <Policies>
                            <SizeBasedTriggeringPolicy size="20 MB" />
                        </Policies>
                        <DefaultRolloverStrategy max="1" min="1" />
                    </RollingFile>
                </Route>
            </Routes>
        </Routing>

        <RollingFile name="RollingFileMonitor" filepattern="apps/logs/${hostName}-monitor-%i.log"
            filename="apps/logs/${hostName}-monitor.log">

            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%-5p] %X{userName} [%C] %F:%L - %m%n" />
            <Policies>
                <SizeBasedTriggeringPolicy size="20 MB" />
            </Policies>

        </RollingFile>

        <RollingFile name="RollingFileAPM" filename="apps/logs/${hostName}-apm.log"
            filepattern="apps/logs/${hostName}-apm-%i.log">
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%-5p] %X{userName} [%C] %F:%L - %m%n" />
            <Policies>
                <SizeBasedTriggeringPolicy size="20 MB" />
            </Policies>
            <DefaultRolloverStrategy min="1" max="1" />
        </RollingFile>
    </Appenders>


    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console" />
        </Root>
        <Logger name="com.XXXX.app.service" additivity="false">
            <AppenderRef ref="RollingFileMonitor" />
        </Logger>
        <Logger name="com.XXXX.apm" additivity="false">
            <AppenderRef ref="RollingFileAPM" />
        </Logger>

        <Logger name="com.XXXX,config" level="info" additivity="false">
            <AppenderRef ref="info" />
        </Logger>

        <Logger name="com.XXXXXX.controller" level="info" additivity="false">
            <AppenderRef ref="RoutingAppender" />
        </Logger>
        <Logger name="com.XXXXX.impl" level="info" additivity="false">
            <AppenderRef ref="RoutingAppender" />
        </Logger>
        <Logger name="com.XXXXX.impl" level="info" additivity="false">
            <AppenderRef ref="RoutingAppender" />
        </Logger>
        <Logger name="com.XXXX.logging" level="info" additivity="false">
            <AppenderRef ref="RoutingAppender" />
        </Logger>
        <Logger name="com.zaxxer.hikari" level="debug" additivity="false">
            <AppenderRef ref="debug" />
        </Logger>
    </Loggers>

Hope this answers your question.