一、使用log4j自带的动态更新配置文件的方法
使用log4j自带的动态更新配置很简单,只要调用 PropertyConfigurator 或者 DOMConfigurator类的 configureAndWatch(String configFileName)或者 configureAndWatch(String configFileName, long delay)方法就可以了。
<wbr></wbr>实现的原理
在调用PropertyConfigurator 或者 DOMConfigurator类的configureAndWatch方法时log4j会创建一个线程,定时的去检查配置文件是否改变,如果改变的话就重新加载配置文件。
configureAndWatch方法参数的介绍:
String configFileName:配置文件的路径加文件名。
long delay:扫描配置文件是否改变的间隔时间。默认值是 60 秒。
注意:在log4j中每调用一次configureAndWatch方法都会启动一个新的扫描线程。
实例代码:package com.kun;<wbr><br><span style="color:#993399">import org.apache.log4j.Logger;</span><br style="color:rgb(153,51,153)"><br style="color:rgb(153,51,153)"><span style="color:#993399">import org.apache.log4j.PropertyConfigurator;</span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399">public class TestLog4j</span><br style="color:rgb(153,51,153)"><span style="color:#993399">{</span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr> public static Logger logger = Logger.getLogger(TestLog4j.class);</wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr> static</wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr> {</wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr><wbr><wbr><wbr><wbr> PropertyConfigurator.configureAndWatch("./log4j.properties", 60000);</wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr> }</wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr> public static void printLog()</wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr> {</wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr><wbr><wbr><wbr><wbr> if (logger.isDebugEnabled())</wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr><wbr><wbr><wbr><wbr> {</wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> logger.debug("debug!!");</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr><wbr><wbr><wbr><wbr> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr><wbr><wbr><wbr><wbr> if (logger.isInfoEnabled())</wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr><wbr><wbr><wbr><wbr> {</wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> logger.info("info!!");</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr><wbr><wbr><wbr><wbr> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr><wbr><wbr><wbr><wbr> logger.error("error!!");</wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr> }</wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr> public static void main(String[] args)</wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr> {</wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr><wbr><wbr><wbr><wbr> while (!Thread.interrupted())</wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr><wbr><wbr><wbr><wbr> {</wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> TestLog4j.printLog();</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> try</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> {</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> Thread.sleep(1000);</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> } catch (InterruptedException e)</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> {</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr><wbr><wbr><wbr><wbr> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399"><wbr><wbr><wbr> }</wbr></wbr></wbr></span><br style="color:rgb(153,51,153)"><span style="color:#993399">}</span><br><br><br><span style="font-weight:bold">二、自己创建动态更新配置文件的类和方法</span><br><br><wbr><wbr><wbr><wbr> 在第一章中我们可以通过PropertyConfigurator的 configureAndWatch(String configFileName, long delay)方法来进行动态的改变log4j的配置,但是他采用了轮询方式来实现的,现在我们需要触发机制来完成这个功能。<br><br><span style="font-weight:bold">实现的原理</span><br><br><wbr><wbr><wbr> 开始的思考中,认为应该通过自定义一套log4j的配置信息,然后启动log4j的同时启动一个server ,socket或者web service一类的服务,然后再通过消息来进行log4j的配置。后来发现当调用PropertyConfigurator对象的configure(String configFilename)方法时就可以重新配置log4j。<br><br><wbr><wbr><wbr> 但是我们还不能确定log4j系统正在运行时,再次调用configure(String configFilename)方法,会不会对系统运行的产生其他的影响?当查看log4j源码后这个问题被解决了。因为 PropertyConfigurator的 configureAndWatch(String configFileName, long delay)方法就是启动一个线程并在这个线程中反复的实例化一个PropertyConfigurator对象,并调用他的 doConfigure(String
configFileName, LoggerRepository hierarchy)方法,而PropertyConfigurator对象的configure(String configFilename)也是实例化一个PropertyConfigurator对象,并调用他的doConfigure(String configFileName, LoggerRepository hierarchy)方法。所以可以确定在log4j运行时调用configure(String configFilename)方法是不会对系统造成什么不良影响的,除非log4j本身就存在问题。<br><br><wbr><wbr><wbr><wbr> 现在问题就比较简单了,就是如何调用configure(String configFilename)方法了。这个当然就和实际的业务分不开了,如果是一个web应用,那当然是通过页面来调用。如果是web service应用,那当然是使用开发的服务来调用。这个就要根据实际的应用来确定了。<br><br><span style="font-weight:bold">实例代码:</span><br>
这是一个WEB方式的调用代码:<br>
TestLog4jReload.java:<br><br><span style="color:#9933cc">package com.kun;</span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><wbr></wbr></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc">import org.apache.log4j.PropertyConfigurator;</span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><wbr></wbr></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc">public class TestLog4jReload</span><br style="color:rgb(153,51,204)"><span style="color:#9933cc">{</span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><wbr><wbr><wbr><wbr> public static void reloadLog4jConfig()</wbr></wbr></wbr></wbr></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><wbr><wbr><wbr> {</wbr></wbr></wbr></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><wbr><wbr><wbr><wbr><wbr><wbr><wbr> PropertyConfigurator.configure("./log4j.properties");</wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><wbr><wbr><wbr> }<wbr></wbr></wbr></wbr></wbr></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc">}</span><br><br>
TestLog4jReload.jsp:<br><br><span style="color:#9933cc"><%@ page contentType = "text/html;charset=UTF-8" language = "java" %></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><%@ page import = "java.util.*, java.io.*" %></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><%@ page import = "com.kun.TestLog4jReload %></span><br style="color:rgb(153,51,204)"><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><%</span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><wbr><wbr><wbr> String state = request.getParameter("state");</wbr></wbr></wbr></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><wbr><wbr><wbr> if(state != null && state.trim().equals("start"))</wbr></wbr></wbr></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><wbr><wbr><wbr> {</wbr></wbr></wbr></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><wbr><wbr><wbr><wbr><wbr><wbr><wbr> TestLog4jReload.reloadLog4jConfig();</wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><wbr><wbr><wbr> }</wbr></wbr></wbr></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc">%></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><HTML></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><wbr><HEAD></wbr></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><wbr> <TITLE> 动态更新log4j配置 </TITLE></wbr></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><wbr></HEAD></wbr></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><wbr><BODY></wbr></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><wbr> <A HREF="TestLog4jReload.jsp?state=start">开始</A></wbr></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><wbr></BODY></wbr></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"></HTML></span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
分享到:
相关推荐
在使用 Apache Tomcat 作为服务器时,合理配置日志框架(如 Log4j)能够极大地提高开发效率和系统的可维护性。本文将详细介绍两种常见的 Log4j 配置方式:Tomcat 级别的统一日志管理和每个 web 应用分别配置 Log4j,...
log4j的主要优势在于其灵活性和可扩展性,允许用户通过配置文件自定义日志记录的方式,无需修改应用程序代码。 #### 二、日志记录的目的 在应用程序中记录日志主要有以下三个目的: 1. **监视代码中变量的变化...
--monitorInterval:Log4j 能够自动检测修改配置 文件和重新配置本身,设置间隔秒数--> <!--先定义所有的 appender--> <!--这个输出控制台的配置--> <!--输出日志的格式--> [%d{HH:mm:ss:SSS}] [%p] - %l -...
Log4j是一个广泛使用的Java日志记录框架,它允许开发者在应用程序中插入日志语句,以便跟踪程序的运行情况、调试错误、监控性能等。这个框架由Apache软件基金会开发,是许多Java项目的首选日志解决方案,因为它具有...
在Web应用中,如使用的是Servlet环境,可以通过在`web.xml`中配置`ContextLoaderListener`来加载Log4j配置,同时,我们还可以创建一个Servlet,当接收到特定请求时,更新Log4j配置。 ```xml <!-- web.xml 示例 --> ...
### Log4j中配置日志文件相对路径方法详解 #### 概述 在软件开发过程中,日志记录是一项重要的功能,它有助于开发者调试程序、监控应用程序的运行状态以及追踪问题。`Log4j`作为一款优秀的日志管理工具,被广泛应用...
4. **运行测试**:在`test-log4j`目录中的测试代码,应该是用来验证上述配置和日志记录功能是否正常工作的。它可能包含了针对`TestClass`的测试用例,调用`testMethod()`并在控制台查看输出的日志信息。 总结,SLF4...
#### log4j配置 在Java应用中,我们可以通过修改`log4j.properties`文件来集成syslog。具体步骤如下: 1. 在`log4j.rootLogger`中增加一个新的appender,例如命名为`syslog`。 2. 设置appender的相关属性: ```...
3. **配置Tomcat**:在`$CATALINA_HOME/lib`目录下添加`log4j-api.jar`和`log4j-slf4j-impl.jar`,这将使Tomcat使用Log4j2作为其内部的日志系统。 4. **排除其他日志实现**:确保你的应用中没有引入其他的日志实现...
本文将详细介绍如何通过修改`log4j.properties`配置文件来解决log4j中的乱码问题。 #### 二、问题背景 在使用log4j时,经常会在控制台或日志文件中看到乱码,尤其是在涉及中文字符的情况下。这通常是由于日志系统...
在“log4j按功能保存日志”的场景中,我们通常会利用Log4j的配置灵活性,将不同功能的日志分别写入不同的文件,以便于后期分析、排查问题和监控系统状态。 1. **Log4j基本概念** - **Logger**: 日志记录器,是Log4...
确保Log4J的库被正确地引入到项目中,是能够正确运行Log4J配置的关键。 总结,Log4J的XML配置提供了强大的灵活性,通过定义日志级别、输出目的地、布局格式以及日志分类,可以满足各种日志记录需求。在实际开发中,...
动态配置允许应用程序在运行时读取和修改配置文件,从而无需重启服务即可调整日志行为,大大提高了系统的灵活性和可维护性。 #### 三、Log4j动态配置实现方法 1. **使用`configureAndWatch`方法** 在Java中,...
这样,当Tomcat服务器启动时,会自动读取并应用指定的Log4j配置,从而为整个应用提供日志服务。 在Struts2框架中,由于它集成了Log4j,你可以通过配置Struts2的配置文件(如`struts.xml`)来进一步控制日志行为,...
在使用Log4j2时,需要注意的是,由于部分jar包默认的日志系统可能是Log4j,因此,在集成到像Tomcat这样的Java应用服务器或者是JDK环境中时,可能需要设置默认的日志为Log4j2。这通常通过修改服务器或JDK的启动脚本,...
- 日志级别动态调整:在运行时可以通过JMX(Java Management Extensions)或者修改配置文件动态改变日志级别。 - 异步日志记录:通过使用AsyncAppender,可以实现日志记录的异步化,提高系统性能。 - 日志归档:...
Log4j的灵活性体现在它可以通过配置文件调整日志行为,而无需修改代码,这极大地提高了开发效率。 二、Log4j核心组件 1. **Logger**:日志器是Log4j的基本组件,负责接收日志事件并将其传递给适当的输出。开发者...
配置文件`log4j.properties`是Log4j的核心,通过修改这个文件可以调整日志行为。以下是一个基础配置示例: ```properties # 设置全局日志级别 log4j.rootLogger=DEBUG, console, file # ConsoleAppender配置 ...
使用这两个库时,通常需要一个配置文件(如`log4j2.xml`或`log4j2.json`)来定义日志行为,包括日志输出级别(如DEBUG、INFO、WARN、ERROR)、输出目的地(控制台、文件、数据库等)、以及布局格式(如PatternLayout...
5. **定制日志级别和输出**:根据需要,可以通过修改log4j2.xml配置文件来调整日志级别,或者添加其他Appender,比如文件Appender,将日志记录到特定文件中。 6. **性能考虑**:在生产环境中,通常会将日志级别设置...