使得“Log4J日志文件保存路径”可配置

时间:2022-04-28 09:51:38

使用Log4J日志框架,可以配置将日志记录到文件中,示例配置如下:

log4j.appender.A1=org.apache.log4j.RollingFileAppender
log4j.appender.A1.Threshold=INFO
log4j.appender.A1.File=log/info.log
log4j.appender.A1.Append=true
log4j.appender.A1.Encoding=GBK
log4j.appender.A1.MaxFileSize=256MB
log4j.appender.A1.MaxBackupIndex=60
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%d{yy-MM-dd HH:mm:ss}], [%p] [%l] -%m%n

上述配置中日志文件的保存路径是:当前项目路径下“/log/info.log”。
有些应用场景中,日志文件的保存路径需要可配置。Log4J支持这种应用场景,具体是采用如下两种配置形式:
log4j.appender.A1.File=${LOGDIR}/log/info.loglog4j.appender.A1.File=${env:LOGDIR}/log/info.log

一、第一种形式

Log4J日志框架在加载的时候会使用相应的Java进程变量值去进行替换。比如说现在“LOGDIR”这个Java进程变量的值为“/home/dsl”,那么log4j.appender.A1.File=${LOGDIR}/log/info.log最后会被替换成“log4j.appender.A1.File=/home/dsl/log/info.log”。

二、第二种形式

Log4J日志框架在加载的时候会使用相应的系统环境变量值去进行替换。比如说现在“LOGDIR”这个系统环境变量的值为“/home/dsl”,那么log4j.appender.A1.File=${env:LOGDIR}/log/info.log最后会被替换成“log4j.appender.A1.File=/home/dsl/log/info.log”。
“Log4J 2.x”才支持第二种形式。其实“Log4J 2.x”不支持“Log4J 1.x”的“properties文件格式”的配置形式,而只支持“XML文件格式”的配置形式,示例如下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
<Appenders>
<File name="MyFile" fileName="${env:LOGDIR}/logs/app.log">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
</File>
<Async name="Async">
<AppenderRef ref="MyFile"/>
</Async>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Async"/>
</Root>
</Loggers>
</Configuration>



备注:
关于Java进程变量和系统环境变量可见“Java中System.getenv()和System.getProperties()的区别



参考文献:
[1]http://*.com/questions/2975289/log4j-relative-file-path
[2]http://*.com/questions/13066042/how-to-give-environmental-variable-path-for-file-appender-in-configuration-file
[3]https://logging.apache.org/log4j/2.x/manual/appenders.html