我正在使用SystemPropertiesLookup查找来配置Log4J2配置。在我的main方法中,系统属性设置为第一行。问题在于,当Log4J加载配置时,尚未调用main方法,因此系统属性尚未填写。
这是我的log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?> <configuration status="WARN" packages="org.base"> <appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%highlight{%d [%c{1}] %-5level: %msg%n}{STYLE=Logback}"/> </Console> <File name="AppLog" fileName="logs/app-${sys:MIGRATION_ENV:-UNKNOWN}-${sys:MIGRATION_TITLE:-UNKNOWN}.log" append="false"> <PatternLayout pattern="%d [%c{1}] %-5level: %msg%n"/> </File> </appenders> <loggers> <root level="error"> <appender-ref ref="Console" level="error"/> <appender-ref ref="AppLog" level="error"/> </root> <logger name="org.base" level="debug" additivity="false"> <appender-ref ref="Console" level="debug"/> <appender-ref ref="AppLog" level="debug"/> </logger> </loggers> </configuration>
该文件将称为app-UNKNOWN-UNKNOWN,因为在Log4J填写文件时,该属性尚不可用。
有没有办法让Log4J等待,最好不要将配置转移到Java代码?
必须在运行时(主方法的第一行)设置属性。
可能的解决getLogger(..)方法是只调用该方法之后,而不用变量来对其进行初始化,但这实际上不适合我的任务。
getLogger(..)
您可以使用来做自己想做的事情RoutingAppender。这是一些示例代码:
RoutingAppender
package example; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class SomeClass { private static final Logger log = LogManager.getLogger(); public static void main(String[] args){ System.setProperty("myProperty", "myFile.log"); if(log.isDebugEnabled()) log.debug("This is some debug!"); log.info("Here's some info!"); log.error("Some erorr happened!"); } }
这是log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> </Console> <Routing name="Routing"> <Routes pattern="$${sys:myProperty}"> <Route> <File name="File" fileName="logs/${sys:myProperty}" immediateFlush="false" append="false"> <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> </File> </Route> </Routes> </Routing> </Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="Console" level="debug" /> <AppenderRef ref="Routing" level="debug" /> </Root> </Loggers> </Configuration>
运行上面的Java代码,在当前工作目录内的日志文件夹中创建一个名为myFile.log的文件。日志文件的内容如下所示:
2018-05-21 22:13:29.147 [main] DEBUG example.SomeClass - This is some debug! 2018-05-21 22:13:29.160 [main] INFO example.SomeClass - Here's some info! 2018-05-21 22:13:29.161 [main] ERROR example.SomeClass - Some erorr happened!