Log4J 更改配置运行时
Log4J change configuration runtime
我必须在 tomcat webapp 启动期间在运行时切换 Log4J 配置,我试过这个解决方案:
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
ctx.setConfigLocation(ResourceUtils.toURI(getClass().getResource("/mynewconfig.xml")));
ctx.start();
ctx.reconfigure();
它似乎适用于 Windows 环境,但这不适用于 ubuntu/linux。
我在这段代码之后添加了一个 System.out 来检查现有的 appender,在 windows env 中我可以找到我新配置的 appender,因为 linux 我只能看到默认的启动器。
我已经检查过文件路径权限。
这是默认的 log4j.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
<Appenders>
<Console name="console-log" target="SYSTEM_OUT">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
</Console>
</Appenders>
<Loggers>
<Root level="warn" additivity="false">
<AppenderRef ref="console-log" />
</Root>
</Loggers>
</Configuration>
这是新的 (mynewconfig.xml)
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
<Appenders>
<Console name="console-log" target="SYSTEM_OUT" >
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
</Console>
<RollingFile name="file-log" fileName="${sys:home}/log/app.log" filePattern="${sys:home}/log/app.%i.log">
<PatternLayout>
<pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="10MB" />
</Policies>
<DefaultRolloverStrategy max="5"/>
</RollingFile>
<RollingFile name="file-critico-log" fileName="${sys:home}/log/critico.log" filePattern="${sys:home}/log/critico.%i.log">
<PatternLayout>
<pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="10MB" />
</Policies>
<DefaultRolloverStrategy max="5"/>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="com.mypackage" level="info" additivity="false">
<appender-ref ref="file-log" />
<appender-ref ref="console-log" />
</Logger>
<Logger name="critico" level="info" additivity="false">
<appender-ref ref="file-log" level="error" />
<appender-ref ref="file-critico-log" level="error" />
<!-- appender-ref ref="console-log" level="error" / -->
</Logger>
<!-- Logger name="org.springframework.jdbc.core.JdbcTemplate" level="debug">
<appender-ref ref="console-log" />
</Logger-->
<Root level="warn" additivity="false">
<AppenderRef ref="file-log" />
<AppenderRef ref="console-log" />
</Root>
</Loggers>
</Configuration>
问题出在 Ubuntu 中 tomcat 服务的沙盒文件系统。
看看https://www.freedesktop.org/software/systemd/man/systemd.exec.html
我必须明确设置此配置:
ReadWritePaths=/var/mypath
在/lib/systemd/system/tomcat.service文件中
我必须在 tomcat webapp 启动期间在运行时切换 Log4J 配置,我试过这个解决方案:
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
ctx.setConfigLocation(ResourceUtils.toURI(getClass().getResource("/mynewconfig.xml")));
ctx.start();
ctx.reconfigure();
它似乎适用于 Windows 环境,但这不适用于 ubuntu/linux。 我在这段代码之后添加了一个 System.out 来检查现有的 appender,在 windows env 中我可以找到我新配置的 appender,因为 linux 我只能看到默认的启动器。
我已经检查过文件路径权限。
这是默认的 log4j.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
<Appenders>
<Console name="console-log" target="SYSTEM_OUT">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
</Console>
</Appenders>
<Loggers>
<Root level="warn" additivity="false">
<AppenderRef ref="console-log" />
</Root>
</Loggers>
</Configuration>
这是新的 (mynewconfig.xml)
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
<Appenders>
<Console name="console-log" target="SYSTEM_OUT" >
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
</Console>
<RollingFile name="file-log" fileName="${sys:home}/log/app.log" filePattern="${sys:home}/log/app.%i.log">
<PatternLayout>
<pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="10MB" />
</Policies>
<DefaultRolloverStrategy max="5"/>
</RollingFile>
<RollingFile name="file-critico-log" fileName="${sys:home}/log/critico.log" filePattern="${sys:home}/log/critico.%i.log">
<PatternLayout>
<pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="10MB" />
</Policies>
<DefaultRolloverStrategy max="5"/>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="com.mypackage" level="info" additivity="false">
<appender-ref ref="file-log" />
<appender-ref ref="console-log" />
</Logger>
<Logger name="critico" level="info" additivity="false">
<appender-ref ref="file-log" level="error" />
<appender-ref ref="file-critico-log" level="error" />
<!-- appender-ref ref="console-log" level="error" / -->
</Logger>
<!-- Logger name="org.springframework.jdbc.core.JdbcTemplate" level="debug">
<appender-ref ref="console-log" />
</Logger-->
<Root level="warn" additivity="false">
<AppenderRef ref="file-log" />
<AppenderRef ref="console-log" />
</Root>
</Loggers>
</Configuration>
问题出在 Ubuntu 中 tomcat 服务的沙盒文件系统。 看看https://www.freedesktop.org/software/systemd/man/systemd.exec.html
我必须明确设置此配置:
ReadWritePaths=/var/mypath
在/lib/systemd/system/tomcat.service文件中