Log4j.properties FileAppender File

I've been using slf4j / logback for a while now and our configured filename in the logback.xml file is:

<timestamp key="ymd" datePattern="yyyyMMdd" />
<timestamp key="hms" datePattern="HHmmss" />
... ...
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>/var/log/${ymd}/${HOSTNAME}-${USER}-${hms}.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
        <fileNamePattern>/var/log/${ymd}/${HOSTNAME}-${USER}-${hms}.%i.log</fileNamePattern>

      

Now I am switching to slf4j / log4j. How can I get a similar pattern of the log file name in log4j.properties?

log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File=/var/log/${ymd}/${HOSTNAME}-${USER}-${hms}.log?

      

+3


source to share


1 answer


With Log4J 2, the equivalent configuration (log4j2.properties) would be:

name = MyApp

property.ymd=$${date:yyyyMMdd}
property.hms=$${date:HHmmss}

appender.rolling.type = RollingFile
appender.rolling.name = RollingFile
appender.rolling.fileName =/var/log/${ymd}/${env:HOSTNAME}-${env:USER}-${hms}.log
appender.rolling.filePattern =/var/log/${ymd}/${env:HOSTNAME}-${env:USER}-${hms}.%i.log

appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d %p %C{1.} [%t] %m%n

appender.rolling.policies.type = Policies
appender.rolling.policies.size.type=SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=1KB

rootLogger.level=debug
rootLogger.appenderRef.rolling.ref=RollingFile

      

You didn't specify a trigger policy for logback, so I used a simple SizeBasedTriggerPolicy for demonstration purposes.

With Log4J 1, it is not possible (at least for my best knowledge) to achieve the same by pure configuration means, so you will have to resort to software configuration like:



//Parameters
String user = System.getenv("USER2");
String host = System.getenv("HOSTNAME");

Date now = new Date();
String day = new SimpleDateFormat("yyyyMMdd").format(now);
String time = new SimpleDateFormat("HHmmss").format(now);

//Filename pattern
String pattern = String.format("/var/log/%s/%s-%s-%s",day,host,user,time);

//Create a new RollingFileAppender instance
RollingFileAppender appender = new RollingFileAppender();
appender.setName("ROLLING");
appender.setFile(pattern+".log");

FixedWindowRollingPolicy policy = new FixedWindowRollingPolicy();
    policy.setFileNamePattern(pattern+".%i.log");
    policy.setMinIndex(1);
    policy.setMaxIndex(5);
    policy.activateOptions();
appender.setRollingPolicy(policy);

appender.setTriggeringPolicy(
    new SizeBasedTriggeringPolicy(1000)
);

appender.setLayout(
    new PatternLayout("%d %m%n")
);

appender.activateOptions();

//Attach it to the ROOT logger
Logger.getRootLogger().addAppender(
    appender
);

      

Note that Log4J 1 officially reached its "end of life" back in 2015:

On August 5, 2015, the Logging Project Management Committee announced that Log4j 1.x had reached the end of its life. The full text of the announcement can be found on the Apache blog. Log4j 1 users are advised to upgrade to Apache Log4j 2

Therefore, it is highly recommended that you upgrade to 2.X unless for some reason that is not an option.

+1


source







All Articles