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?
source to share
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.
source to share