Java 如何在应用程序运行期间更改log4j设置?

Java 如何在应用程序运行期间更改log4j设置?,java,log4j,Java,Log4j,是否可以在应用程序执行期间更改log4j设置?有几种方法可以做到这一点,方法是通过JMX访问log4j,并使用JMX控制台控制过滤器、记录器、级别、附加器等 我有一个例子,但我需要删减一点,使它可以理解。您想这样做吗?您可以使用log4j生成一个线程来定期检查属性文件的更改 或者,您可以使用本文中描述的JMX:我正在使用: 视窗7 ApacheTomcat 7.0.34 log4j 1.2.17 如果您遵循以下步骤(假设您已经将war文件部署到%CATALINA_HOME%\webapps,

是否可以在应用程序执行期间更改log4j设置?

有几种方法可以做到这一点,方法是通过JMX访问log4j,并使用JMX控制台控制过滤器、记录器、级别、附加器等

我有一个例子,但我需要删减一点,使它可以理解。您想这样做吗?

您可以使用log4j生成一个线程来定期检查属性文件的更改

或者,您可以使用本文中描述的JMX:

我正在使用:

  • 视窗7
  • ApacheTomcat 7.0.34
  • log4j 1.2.17
如果您遵循以下步骤(假设您已经将war文件部署到%CATALINA_HOME%\webapps,并且您已经启动了startup.bat),那么它将自动完成(无需重新启动Tomcat):

  • 转到%CATALINA\u HOME%\webapps\YourApp\WEB-INF\classes
  • 编辑log4j.properties/log4j.xml并更改记录器级别

    例如:

    • log4j.properties:

      log4j.rootLogger=INFO, stdout, file
      
      变成

      log4j.rootLogger=DEBUG, stdout, file
      
      <root>
          <level value="DEBUG" />
          <appender-ref ref="console" />
          <appender-ref ref="file" />
      </root>
      
    • log4j.xml

      <root>
          <level value="INFO" />
          <appender-ref ref="console" />
          <appender-ref ref="file" />
      </root>
      
      
      
      变成

      log4j.rootLogger=DEBUG, stdout, file
      
      <root>
          <level value="DEBUG" />
          <appender-ref ref="console" />
          <appender-ref ref="file" />
      </root>
      
      
      
    如果两个文件都在classes文件夹中,则会考虑XML文件(忽略.properties文件)

  • 在0-10秒内,您将能够在Tomcat控制台和%CATALINA\u HOME%\logs\CATALINA.yourDate.log中看到以下行:

    2015年11月12日下午4:52:49 org.apache.catalina.core.StandardContext

    信息:已开始重新加载名为[/YourApp]的上下文

    2015年11月12日下午4:52:50 org.apache.catalina.loader.WebappClassLoader validateJarFile

    信息

    2015年11月12日下午4:52:50 org.apache.catalina.core.StandardContext

    信息:已完成重新加载名为[/YourApp]的上下文

  • 使用该应用程序并查看新的日志级别(在控制台和/或日志文件中)