`
cuker919
  • 浏览: 88629 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Log4J 在系统运行时更改log4j的配置

 
阅读更多
一、使用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">&lt;%@ page contentType = "text/html;charset=UTF-8" language = "java" %&gt;</span><br style="color:rgb(153,51,204)"><span style="color:#9933cc">&lt;%@ page import = "java.util.*, java.io.*" %&gt;</span><br style="color:rgb(153,51,204)"><span style="color:#9933cc">&lt;%@ page import = "com.kun.TestLog4jReload %&gt;</span><br style="color:rgb(153,51,204)"><br style="color:rgb(153,51,204)"><span style="color:#9933cc">&lt;%</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 &amp;&amp; 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">%&gt;</span><br style="color:rgb(153,51,204)"><span style="color:#9933cc">&lt;HTML&gt;</span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><wbr>&lt;HEAD&gt;</wbr></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><wbr> &lt;TITLE&gt; 动态更新log4j配置 &lt;/TITLE&gt;</wbr></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><wbr>&lt;/HEAD&gt;</wbr></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><wbr>&lt;BODY&gt;</wbr></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><wbr> &lt;A HREF="TestLog4jReload.jsp?state=start"&gt;开始&lt;/A&gt;</wbr></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc"><wbr>&lt;/BODY&gt;</wbr></span><br style="color:rgb(153,51,204)"><span style="color:#9933cc">&lt;/HTML&gt;</span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
分享到:
评论

相关推荐

    Log4j学习和详细配置

    在系统开发阶段可以打印详细的log信息以跟踪系统运行情况,而在系统稳定后可以关闭log输出,从而在能跟踪系统运行情况的同时,又减少了垃圾代码(System.out.println(......)等)。 log4j是一个非常强大的log记录软件,...

    hibernate log4j配置文件

    对于hibernate 的日志配置,只要把下载下来的文件拷贝到src目录下即可运行,日志中包括了对hibernate的日志的注释可以根据自己的不同需求更改日志配置信息

    Loger_slf4j写入数据表Demo

    一、运行部署 1、将LogerWriteMySqlDemo项目导入Eclipse 2、修改db.properties文件中数据库...三、配置文件db.properties、log4j.properties两个配置文件可以通过servlet配置来使用,也可以直接先用DbUtil.java中先测试

    delphi xe5 下的日志类 log4d

    (2)可在软件7*24小时连续运行的情况下,自动生成新的日期LOG文件。 (3)可自动删除指定天数前的LOG文件。 有DEMO,有源码,log4d\test 就是DEMO。 注意:log4d\test\Win32\Debug\log4d.props 文件的配置。

    微信开发框架wechat4j

    创建wechat4j配置文件,在src目录下(java根目录)创建wechat4j.properties文件,配置你微信公众号的相关信息。内容如下: ```properties #you wechat token wechat.token=token #wechat appid wechat.appid=appid ...

    java二八杠源码-solo:我们构建一个Web应用程序的教程,该应用程序可让您在运行时控制log4j记录器

    应用程序),以便您可以在运行时更改日志记录配置,这对于测试、QA 和生产(许多日志记录库和对于此用例 [4],JEE 服务器支持 JMX [3],IBM Websphere 具有对内置日志记录的动态控制)。 本教程是为几乎没有 Clojure...

    JSP在线销售管理系统.rar

    JSP在线销售管理系统,简易java(easyjf)框架开源订销管理系统(测试版),服务器环境,tomcat... 4、系统使用Log4j-1.2 作为日志系统,通过更改Web-inf\classes\log4j.properties 的设置可以查看系统运行的详细日志信息.

    plumelog-master.zip

    无代码入侵的分布式日志系统,基于log4j、log4j2、logback搜集日志,设置链路ID,方便查询关联日志,基于elasticsearch作为查询引擎,高吞吐,查询效率高,全程不占应用程序本地磁盘空间,免维护;对于项目透明,不...

    基于Java的大学网上选课系统源码.zip

    前端使用semanticUI渲染及Ajax动态填写,后端采用基于springboot,涉及的技术栈有mybatis,spring,springMVC,spring security,log4j,swaggerUI等。 适合大学生课设实训等作业。 教程 拉取后, 静待对应jar包下载...

    spring+shiro+ehcache例子

    在web.xml中配置log4j信息打印 (需要自己将log4j的配置文件给打开) 三: 配置文件 查看/src/config/ ,配置文件可观察文件名称理解 四: 登录名为2:可以进行权限的验证,以及shiro的缓存。 登录名为任意...

    tomcat日志配置.docx

    配置Tomcat日志级别及日志查看。1:tomcat中的日志开关文件介绍; 2、Tomcat 日志信息; 3、修改 Tomcat 运行日志的等级;4、使用 log4j 记录应用程序日志或系统日志;

    logwebconfig:使用REST API记录配置

    目前已实现log4j1和log4j2。 使用http服务器的占用空间。 利弊 在运行时配置日志级别的优点是: 更改会立即生效。 无需将配置文件复制到群集中的许多服务器。 更改可以顺利进行。 无需重新启动应用程序。 更改...

    SSM教务管理系统(源码+文档+视频+数据库脚本).rar

    数据源:C3P0 日志:log4j 前端框架:Bootstrap 快速上手 1、运行环境和所需工具 编译器:IntelliJ IDEA 项目构建工具:Maven 数据库:Mysql JDK版本:jdk1.8 Tomcat版本:Tomcat8.x 2、初始化项目 在你的Mysql中,...

    一个简单的教务查询系统(主要技术SpringMVC + Spring + Mybatis + Shiro + Bootstrap

    日志:log4j 前端框架:Bootstrap 快速上手 1、运行环境和所需工具 编译器:IntelliJ IDEA 项目构建工具:Maven 数据库:Mysql JDK版本:jdk1.8 Tomcat版本:Tomcat8.x 2、初始化项目 在你的Mysql中,创建一个名为...

    ice入门例子2

    这是继ice入门例子的第二个例子,主要讲述Ice.Application与配置文件的简单使用 所需jar在lib中 这个例子中集成了日志插件...日志产生的文件在log4j.properties配置中定死为D:/icelogs/文件夹中,你自己可以随意更改

    数据库系统原理课程设计,基于 SSM 框架的医院药品库存管理系统+源代码+文档说明

    - [X] [2.7 配置 log4j](#配置-log4j) - [X] [2.8 集成基于 Bootstrap 前端框架的 ACE 管理系统页面模板](#集成基于-Bootstrap-前端框架的-ACE-管理系统页面模板) - [X] [2.9 导入 Apache Taglibs 的 ja ------...

    springbatch_嵌入式jetty_动态控制的quartz

    支持web接口的批处理框架 ...springmvc4.0.7 springbatch3.0.7 quartz2.2.3 mysql5.6 oracle11g junit4.11 log4j1.2.17 mybatis3.4.1 druid1.0.17 smg3(决策引擎) jetty8.1.5 fastjson1.2.7 springjdbc3.2.14

    MeyboMail Web(Java) 邮件 群发源代码

    3、系统使用Log4j-1.2 作为日志系统 三、系统设置(确保论坛程序正常运行后执行) 修改或增加WEB-INF\classes\mailserver.xml文件中的data节点的内容,可以修改或增加域名。mailserver.xml文件的data节点数据格式如下...

    springboot学习

    chapter4-2-3:对log4j进行多环境不同日志级别的控制 chapter4-2-4:使用AOP统一处理Web请求日志 chapter4-2-5:使用log4j记录日志到MongoDB chapter4-2-6:Spring Boot 1.5.x新特性:动态修改日志级别] 安全管理 ...

Global site tag (gtag.js) - Google Analytics