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文件中