知识大全 Spring 与 Log4J 进行动态日志配置切换

Posted 信息

篇首语:读不在三更五鼓,功只怕一曝十寒。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Spring 与 Log4J 进行动态日志配置切换相关的知识,希望对你有一定的参考价值。

Spring 与 Log4J 进行动态日志配置切换  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  引言     在开发与生产环境中 我们有时候需要对日志的配置进行动态切换 要调试 监控和检查系统的运行时信息        一般有两种方法    通过 Spring 的 Log jConfigListener 在启动时开启定时器进行定时加载配置文件    通过 JMX 动态控制    以上可以从我的《利用Spring来管理控制自己的应用程序》专题演讲资料中获取到更加详细的信息 包括示例的源程序 地址为   

  先说一下上面两种方法的不同与缺点     通过 Spring 的 Log jConfigListener 则必须在后台打开线程 现定时扫描 然后来定时工作 有点浪费     通过 JMX 动态控制的则必须供一个管理的端口 不仅有可能端口被占用(当然有个 workaround 来解决它) 还有存在防火墙等等需要配置这个管理端口进行对外暴露等等

  虽然上述两种方法存在着一些不足 但是这两种方法在特定的场合下 都可以很好地来利用它进行完美地工作     现在 利用它进行封装与扩展 我们可以巧妙地进行定制 并通过 Web Console 界面来更方便地进行动态切换配置信息 而且不需要重新启动正在运行中的应用程序

  二 分析    通过分析 Log jConfigListener 完整的类名为 springframework web util Log jConfigListener 可以得到动态加载的过程与原理     Log jConfigListener java

  public class Log jConfigListener implements ServletContextListener

  public void contextInitialized(ServletContextEvent event)       Log jWebConfigurer initLogging(event getServletContext());     

  public void contextDestroyed(ServletContextEvent event)       Log jWebConfigurer shutdownLogging(event getServletContext());        

  进而可以得知 一切都是由 Log jWebConfigurer 来进行操作了 再分析其中的代码 可以得到 Log jWebConfigurer 的工作过程 并由此进行到 Log jConfigurer 中     最后我们可以得到最直接有用的三个方法 分别如下     Log jConfigurer initLogging(location);    根据给定的配置文件进行初始化日志配置

   Log jConfigurer initLogging(location refreshInterval);    根据给定的配置文件和间隔时间 进行初始化日志配置并定时重新加载配置文件

   Log jConfigurer shutdownLogging();    关闭日志

  根据以上分析 接下来就是需要进行重新封装的工作了 我们同时保留原来的定时加载的功能 但通过开关进行设置 同时对整个功能进行封装与扩展

  三 封装与扩展    设计一个名为 Log JRefreshInterval 的 JavaBean    定义如下可配置选项      private String CLASSPATH = classpath: ;     private String location = CLASSPATH + log j xml ;     private String locationRunning = location;     private long refreshInterval = ;     private long refreshSecond = ;     private long refreshMinute = ;     private long refreshHour = ;     private boolean refreshDaemon = false;

  增加 refreshDaemon 开关 在配置里根据需要要打开是否定时进行加载日志的配置文件     增加一系列的时间配置参数 毫秒 秒 分 时 然后对这些时间进行加和 总和为定时的时间    refreshHour * * + refreshMinute * * + refreshSecond * + refreshInterval;

   封装方法如下方法进行控制    public interface ILog JRefreshInterval         public void init(); // 根据配置信息初始化日志     public void destroy(); // 销毁日志     public void refreshIntervalThread(); // 定时加载日志的配置信息     public void refreshIntervalImmediately(); // 立即加载默认的日志配置信息     public void refreshIntervalImmediatelyByFilePath(String log jFilePath); // 立即加载指定的日志配置文件

  public void refreshIntervalImmediately(boolean isXmlConfig String log jConfigInfo); // 立即加载指定的日志配置文件     public String getRunningConfing() throws Exception;//获取正在运行的日志配置信息        构建页面      由于将通过 Web Console 页面进行管理控制 也更加方便 当然也可以通过 Web Services 等等之类的 因为 POJO 所以可以根据项目的实际情况来加以选择     创建 l 文件 代码如下     <>    <head>    <meta equiv= Content Type content= text/; charset=UTF />    <title>日志动态配置管理控制台</title>    <link rel= stylesheet type= text/css />    </head>    <body>    <img src= logger jpg alt= 日志动态配置管理控制台 />    <form action= log JRefresh do method= post >     <p>配置内容 (两者只取其一)</p>     <p><input checked type= radio name= configMethod onclick= isXmlConfig disabled jConfigInfo value= ;log jConfigInfo disabled jFilePath disabled jFilePath focus(); />1 Log J的文件路径 格式如下 <input name= log jFilePath ondblclick= this value= /var/log j properties size= /></p>     <ul>     <li>classpath:log j properties 或者 classpath:log j xml</li>     <li>file:C:/log j properties 或者 file:C:/log j xml</li>     <li>C:/log j properties 或者 C:/log j xml</li>     </ul>     <p><input type= radio name= configMethod onclick= log jFilePath value= ;log jFilePath disabled disabled jConfigInfo disabled jConfigInfo focus(); />2 Log J的详细配置信息 </p>     <p>配置方式      <select name= isXmlConfig >      <option value= selected>Property</option>      <option value= >XML</option>     </select>(请根据实际的配置内容选择相应的类型)</p>     <textarea name= log jConfigInfo rows= cols= ondblclick= this value= >

  # default layout ConversionPattern = %t [%c ] [% p]:[%L]:%m%n    default layout ConversionPattern = % dyyyy MM dd HH:mm:ss [%t] [%c ] [% p]:[%L]:%m%n

  </textarea>     <input type= submit value= 提 交 />       <input type= reset value= 重 置 />    </form>    <br>    <a title= 查看正在运行的Log J配置信息 >查看配置信息</a>          <a title= 立刻重新加载通过配置文件加载的Log J配置信息 >立刻重新加载</a>          <a title= 立刻停止Log J的服务 所有日志关停 >立刻停止日志</a>          <a title= 调用Servlet来测试Log J信息是否正常 >测试是否正常</a>    </body>    </>    构建 Controller      在此示例中直接采用简单易用的 Spring MVC 进行控制       直接 implements Controller 来创建三个 Controller 分别如下      Log JRefreshController  重新加载日志配置文件的控制器     Log JShutdownController 关闭日志的控制器     Log JRunningController  获取正在运行的日志配置信息的控制器    构建一个 Servlet     用来测试日志配置信息是否成功加载

  public class HelloServlet extends HttpServlet         private static final long serialVersionUID = L;     private static final Logger logger = Logger getLogger(HelloServlet class);

  public void doGet(HttpServletRequest request HttpServletResponse response)           try             ServletOutputStream out = response getOutputStream();      out println( < xmlns=\\ \\ > );       out println( <head> );       out println( <meta equiv=\\ Content Type\\ content=\\ text/; charset=GBK\\ /> );       out println( <title>动态配置测试页面</title> );       out println( <link href=\\ facade css\\ rel=\\ stylesheet\\ type=\\ text/css\\ /> );       out println( </head><body> );       out println( <img src=\\ logger jpg\\ alt=\\ 日志动态配置管理控制台\\ /> );       out println( <p>Begin: + new Date() + <br/> );       if(logger isDebugEnabled())               logger debug( DEBUG级别的信息 debugging<p> );        out println( DEBUG级别的信息 debugging</p> );                  if(logger isInfoEnabled())               ( INFO级别的信息 information<p> );        out println( INFO级别的信息 information</p> );                  logger warn( warning );       logger error( error );       logger fatal( fatal );       out println( End: + new Date() + <br/> );       out println( <p><a href=\\ JavaScript:history go( )\\ >返  回</a> );       out println( </p></body></> );       out flush();            catch(IOException e)             e printStackTrace();              

    构建两个 JSP 页面     一个成功的页面 RefreshSuccess jsp 代码如下    <%@page contentType= text/; charset=UTF pageEncoding= UTF %>    < xmlns= >    <head>    <meta equiv= Content Type content= text/; charset=UTF />    <title>动态配置操作成功</title>    <link rel= stylesheet type= text/css />    </head>

  <body>    <img src= logger jpg alt= 日志动态配置管理控制台 />    <p>    恭喜 动态配置操作成功!    <p>    当前的配置为     <textarea rows= cols= ReadOnly><%=request getAttribute( RunningConfig )%></textarea>    <p>    <a JavaScript:history go( ) >返  回</a>    </body>    </>

  以及一个失败的页面 RefreshFailed jsp 代码略

   配置 Spring 的 Bean 文件(Service)    beanRefLog J xml

  <?xml version= encoding= UTF ?>    <!DOCTYPE beans PUBLIC //SPRING//DTD BEAN//EN beans dtd >    <beans>     <bean id= propertyConfigurer class= springframewonfig PropertyPlaceholderConfigurer >      <property name= locations >       <list>        <value>classpath:LoggerConsole properties</value>       </list>      </property>     </bean>     <bean id= log JRefreshInterval class= net agile springtime logger util Log JRefreshInterval init method= init destroy method= destroy >      <property name= location value= $logger log j location />      <property name= refreshDaemon value= $logger log j refreshDaemon />      <property name= refreshInterval value= $logger log j refreshInterval />      <property name= refreshSecond value= $logger log j refreshSecond />  <property name= refreshMinute value= $logger log j refreshMinute />  <property name= refreshHour value= $logger log j refreshHour /> </bean>    </beans>

   配置 Spring 的 Bean 文件(MVC)    beanRefMVC xml

  <?xml version= encoding= utf ?>    <!DOCTYPE beans PUBLIC //SPRING//DTD BEAN//EN beans dtd >    <beans>      <bean id= urlMapping class= springframework web servlet handler SimpleUrlHandlerMapping >      <property name= mappings >       <props>        <prop key= /log JRefresh do >log JRefreshController</prop>        <prop key= /log JShutdown do >log JShutdownController</prop>        <prop key= /log JRunning do >log JRunningController</prop>       </props>      </property>     </bean>     <bean id= viewResolver class= springframework web servlet view InternalResourceViewResolver >      <property name= prefix >       <value>/WEB INF/jsp/</value>      </property>      <property name= suffix >       <value> jsp</value>      </property>     </bean>     <bean id= log JRefreshController class= net agile springtime logger web Log JRefreshController >      <property name= successView value= RefreshSuccess />      <property name= failedView value= RefreshFailed />      <property name= log JRefreshInterval ref= log JRefreshInterval />     </bean>      <bean id= log JShutdownController class= net agile springtime logger web Log JShutdownController >      <property name= successView value= RefreshSuccess />      <property name= failedView value= RefreshFailed />      <property name= log JRefreshInterval ref= log JRefreshInterval />     </bean>      <bean id= log JRunningController class= net agile springtime logger web Log JRunningController >      <property name= successView value= RefreshSuccess />      <property name= failedView value= RefreshFailed />      <property name= log JRefreshInterval ref= log JRefreshInterval />     </bean>    </beans>

   在你现有的应用中引入这两个 Spring 的配置文件 或者根据你的项目结构进行调整即可

  <?xml version= encoding= utf ?>    <!DOCTYPE beans PUBLIC //SPRING//DTD BEAN//EN beans dtd >    <beans>     <import resource= beanRefLog J xml />     <import resource= beanRefMVC xml />    </beans>

   配置 web xml 文件      在 web xml 中增加 Spring MVC 的配置以及测试用的 Servlet 的配置 完整的配置如下     <!DOCTYPE web app PUBLIC //Sun Microsystems Inc //DTD Web Application //EN app_ _ dtd >    <web app>     <display name>Spring Log J Refresh Web Application</display name>     <description>Spring Log J Refresh Web Application</description>      <context param>      <param name>contextConfigLocation</param name>      <param value>/WEB INF/classes/beanRefApplication xml</param value>     </context param>        <listener>            <listener class> sprntext ContextLoaderListener</listener class>        </listener>      <servlet>      <servlet name>dispatcherServlet</servlet name>      <servlet class> springframework web servlet DispatcherServlet</servlet class>      <load on startup> </load on startup>     </servlet>        <servlet>      <servlet name>HelloServlet</servlet name>      <display name>HelloServlet</display name>      <servlet class>net agile springtime logger web HelloServlet</servlet class>     </servlet>         <servlet mapping>      <servlet name>HelloServlet</servlet name>      <url pattern>/HelloServlet</url pattern>     </servlet mapping>     <servlet mapping>      <servlet name>dispatcherServlet</servlet name>      <url pattern>* do</url pattern>     </servlet mapping>    </web app>    这样 你的项目就具有了动态日志配置切换的功能了

  四 校验日志是否成功改变    启动应用 访问//localhost: /Log J_Spring_Web/  如下图所示  

  

       可以选择 Log J的文件路径 或者直接输入详细的配置文件的 Log J的详细配置信息 方式进行动态切换

       查看配置信息可以查看到当前正在运行的配置信息 如下图

    

   立刻重新加载

  可以立即加载默认的日志配置

  文件 并返回默认的配置内容 如下图

  

  

    立刻停止日志

  可以立即停止日志 并显示停止前的日志配置信息 如下图

  

   测试是否正常

  可通过此测试用的 Servlet 来查看日志是否成功 在重新加载新的配置文件后 建议都调用一下来测试是否切换成功 如下图

  先提交 INFO 等级的配置

  然后查看测试的结果信息 如下

  

  只显示 INFO 级别的信息

  更改为 DEBUG级别 并提交 如下

  

  然后查看测试的结果信息 如下

  

  

  显示出 DEBUG 级别的信息出来了 表明已经成功地进行动态切换

  五 总结

cha138/Article/program/Java/ky/201311/28220

相关参考

知识大全 在spring中应用log4j

  Logj是Apache的一个开放源代码项目通过使用Logj我们可以控制日志信息输送的目的地是控制台文件GUI组件甚至是套接口服务器NT的事件记录器UNIXSyslog守护进程等我们也可以控制每一条

知识大全 使用Log4j进行日志操作

使用Log4j进行日志操作  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  概述  背景    在

知识大全 Log4J 日志管理系统使用心得体会

Log4J日志管理系统使用心得体会  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  简单的Logj

知识大全 Spring 数据源配置与应用

Spring数据源配置与应用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Spring数据源配

知识大全 Spring IOC配置与应用

SpringIOC配置与应用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!   &nbs

知识大全 使用jmx对weblogic进行动态的配置(源代码)

  对weblogic进行配置一般是通过console控制台来进行配置的但有的时候需要自己在程序中需要进行动态的配置比如增加队列显示队列或者配置数据源改写写configxml是可以达到动态配置的效果的

知识大全 配置归档日志,让数据库管理更加顺畅

  一更改日志操作模式三步走  默认情况下Oracle数据库采用的是非归档模式但是非归档模式不能够防止因物理损坏而导致丢失数据问题为此数据库管理员可能需要把日志操作模式从非归档模式转换为归档模式其实要

知识大全 spring事物配置示例

  以前项目中经常用spring事务处理还没有亲自配置过惭愧现在马上上路.  首先在spring容器中配置transactionManager这个有好多实现这里以HibernateTransactio

知识大全 Spring动态加载Hibernate映射文件

Spring动态加载Hibernate映射文件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb

知识大全 详解Spring的配置文件

详解Spring的配置文件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  想必用过Spring的