将log4j重定向到指定函数

测试程序源代码

[java] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import org.apache.log4j.Logger;  
  2.   
  3. /** 
  4.  * 使Log4j的log输出重定向到指定函数 
  5.  * Last Update Date: 2014-01-23 
  6.  * 依赖库 
  7.  * [1]log4j-1.2.9.jar 
  8.  * [2]JDK 1.6.x 
  9.  * @author lijun 
  10.  * 
  11.  */  
  12. public class TestMain{  
  13.     static Logger log = Logger.getLogger(TestMain.class.getName());    
  14.       
  15.     public static void main(String[] args)  
  16.     {  
  17.         try  
  18.         {  
  19.             TestMain tm = new TestMain();  
  20.               
  21.             /* 
  22.              打印所有的Appender实例 
  23.              Enumeration enumd=log.getRootLogger().getAllAppenders(); 
  24.              while(enumd.hasMoreElements()){ 
  25.                  Appender app=(Appender)enumd.nextElement(); 
  26.                  System.out.println(app.getName()); 
  27.                  System.out.println("in appender"); 
  28.              } 
  29.             */  
  30.               
  31.             /* 
  32.             取Class的Method的方法 
  33.             Class ptypes[] = new Class[1]; 
  34.             ptypes[0] = Class.forName("java.lang.String"); 
  35.             Method m = TestMain.class.getMethod("DebugMsg",ptypes); 
  36.             */  
  37.             {  
  38.                 CallbackAppender ca = (CallbackAppender)Logger.  
  39.                 getRootLogger().getAppender("ca");  
  40.                 if(ca!=null)  
  41.                     ca.SetCallback(tm.getClass().getMethod("DebugMsg",  
  42.                             new Class[] {String.class}));  
  43.             }  
  44.               
  45.             log.debug("from my appender!");  
  46.         }catch(Exception ex)  
  47.         {  
  48.             ex.printStackTrace();         
  49.         }  
  50.     }  
  51.   
  52.     public static void DebugMsg(String msg) {  
  53.         System.out.println("现在log输出被指定到这里了 => "+msg);  
  54.     }  
  55. }  

Appender源代码
[java] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import java.lang.reflect.Method;  
  2.   
  3. import org.apache.log4j.AppenderSkeleton;  
  4. import org.apache.log4j.spi.LoggingEvent;  
  5.   
  6. /** 
  7.  *  
  8.  * 这个Appender的作用,是使log输出重定向到某个函数里去 
  9.  * @author lijun 
  10.  * 
  11.  */  
  12. public class CallbackAppender extends AppenderSkeleton {  
  13.     Method m_ian;  
  14.       
  15.     @Override  
  16.     protected void append(LoggingEvent event) {  
  17.         try {  
  18.             String msg =  this.getLayout().format(event);  
  19.   
  20.             //调用方法重定向log输出.begin  
  21.             if( m_ian!=null )  
  22.             {  
  23.                 Object[] args = {msg};  
  24.                 m_ian.invoke(null, args);  
  25.             }  
  26.             //调用方法重定向log输出.end  
  27.         } catch (Exception ie) {  
  28.             ie.printStackTrace();  
  29.         }  
  30.     }     
  31.       
  32.     @Override  
  33.     public void close() {  
  34.         if (closed)  
  35.             return;  
  36.           
  37.         //Close动作  
  38.   
  39.         //Close标记  
  40.         closed = true;  
  41.     }  
  42.       
  43.     @Override  
  44.     public boolean requiresLayout() {  
  45.         return true;  
  46.     }  
  47.       
  48.     public void SetCallback(Method ian)  
  49.     {  
  50.         m_ian = ian;  
  51.     }  
  52. }  

log4j.xml的配置清单
[html] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>       
  2. <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">       
  3.           
  4. <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' >       
  5.           
  6.     <appender name="myConsole" class="org.apache.log4j.ConsoleAppender">       
  7.         <layout class="org.apache.log4j.PatternLayout">       
  8.             <param name="ConversionPattern"          
  9.                 value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" />       
  10.         </layout>       
  11.         <!--过滤器设置输出的级别-->       
  12.         <filter class="org.apache.log4j.varia.LevelRangeFilter">       
  13.             <param name="levelMin" value="debug" />       
  14.             <param name="levelMax" value="warn" />       
  15.             <param name="AcceptOnMatch" value="true" />       
  16.         </filter>       
  17.     </appender>              
  18.           
  19.     <!-- 指定logger的设置,additivity指示是否遵循缺省的继承机制-->       
  20.     <appender name="ca" class="CallbackAppender">  
  21.         <layout class="org.apache.log4j.PatternLayout">       
  22.             <param name="ConversionPattern"          
  23.                 value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" />       
  24.         </layout>        
  25.     </appender>       
  26.        
  27.     <!-- 根logger的设置-->       
  28.     <root>       
  29.         <priority value ="debug"/>       
  30.         <!--   <appender-ref ref="myConsole"/>  -->  
  31.         <appender-ref ref="ca"/>  
  32.     </root>       
  33. </log4j:configuration> 

转载于:https://my.oschina.net/u/1398304/blog/381398

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值