Log4J更改配置运行时

时间:2020-10-12 09:55:43

标签: log4j tomcat9

在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来检查现有的追加程序,在Windows env中,我可以找到新配置的追加程序,对于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>

1 个答案:

答案 0 :(得分:0)

问题是Ubuntu中tomcat服务的沙箱文件系统。 看看https://www.freedesktop.org/software/systemd/man/systemd.exec.html

我不得不明确设置此配置:

ReadWritePaths=/var/mypath

/lib/systemd/system/tomcat.service 文件中