将log4j重定向到指定函数
2019独角兽企业重金招聘Python工程师标准>>>
测试程序源代码
![](http://static.oschina.net/uploads/img/201503/02182959_GhEF.png)
![](http://static.oschina.net/uploads/img/201503/02182959_xsFx.jpg)
- import org.apache.log4j.Logger;
- /**
- * 使Log4j的log输出重定向到指定函数
- * Last Update Date: 2014-01-23
- * 依赖库
- * [1]log4j-1.2.9.jar
- * [2]JDK 1.6.x
- * @author lijun
- *
- */
- public class TestMain{
- static Logger log = Logger.getLogger(TestMain.class.getName());
- public static void main(String[] args)
- {
- try
- {
- TestMain tm = new TestMain();
- /*
- 打印所有的Appender实例
- Enumeration enumd=log.getRootLogger().getAllAppenders();
- while(enumd.hasMoreElements()){
- Appender app=(Appender)enumd.nextElement();
- System.out.println(app.getName());
- System.out.println("in appender");
- }
- */
- /*
- 取Class的Method的方法
- Class ptypes[] = new Class[1];
- ptypes[0] = Class.forName("java.lang.String");
- Method m = TestMain.class.getMethod("DebugMsg",ptypes);
- */
- {
- CallbackAppender ca = (CallbackAppender)Logger.
- getRootLogger().getAppender("ca");
- if(ca!=null)
- ca.SetCallback(tm.getClass().getMethod("DebugMsg",
- new Class[] {String.class}));
- }
- log.debug("from my appender!");
- }catch(Exception ex)
- {
- ex.printStackTrace();
- }
- }
- public static void DebugMsg(String msg) {
- System.out.println("现在log输出被指定到这里了 => "+msg);
- }
- }
Appender源代码
![](http://static.oschina.net/uploads/img/201503/02182959_GhEF.png)
![](http://static.oschina.net/uploads/img/201503/02182959_xsFx.jpg)
- import java.lang.reflect.Method;
- import org.apache.log4j.AppenderSkeleton;
- import org.apache.log4j.spi.LoggingEvent;
- /**
- *
- * 这个Appender的作用,是使log输出重定向到某个函数里去
- * @author lijun
- *
- */
- public class CallbackAppender extends AppenderSkeleton {
- Method m_ian;
- @Override
- protected void append(LoggingEvent event) {
- try {
- String msg = this.getLayout().format(event);
- //调用方法重定向log输出.begin
- if( m_ian!=null )
- {
- Object[] args = {msg};
- m_ian.invoke(null, args);
- }
- //调用方法重定向log输出.end
- } catch (Exception ie) {
- ie.printStackTrace();
- }
- }
- @Override
- public void close() {
- if (closed)
- return;
- //Close动作
- //Close标记
- closed = true;
- }
- @Override
- public boolean requiresLayout() {
- return true;
- }
- public void SetCallback(Method ian)
- {
- m_ian = ian;
- }
- }
log4j.xml的配置清单
![](http://static.oschina.net/uploads/img/201503/02182959_GhEF.png)
![](http://static.oschina.net/uploads/img/201503/02182959_xsFx.jpg)
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
- <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' >
- <appender name="myConsole" class="org.apache.log4j.ConsoleAppender">
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern"
- value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" />
- </layout>
- <!--过滤器设置输出的级别-->
- <filter class="org.apache.log4j.varia.LevelRangeFilter">
- <param name="levelMin" value="debug" />
- <param name="levelMax" value="warn" />
- <param name="AcceptOnMatch" value="true" />
- </filter>
- </appender>
- <!-- 指定logger的设置,additivity指示是否遵循缺省的继承机制-->
- <appender name="ca" class="CallbackAppender">
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern"
- value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" />
- </layout>
- </appender>
- <!-- 根logger的设置-->
- <root>
- <priority value ="debug"/>
- <!-- <appender-ref ref="myConsole"/> -->
- <appender-ref ref="ca"/>
- </root>
- </log4j:configuration>
转载于:https://my.oschina.net/u/1398304/blog/381398
将log4j重定向到指定函数相关推荐
- C#编码实践:使用委托和特性调用指定函数
2019独角兽企业重金招聘Python工程师标准>>> 建立一个C#控制台应用程序AttributeTest. 建立一个类Operations,代码如下: namespace Att ...
- 【Android NDK 开发】NDK 交叉编译 ( NDK 函数库目录 | Linux 交叉编译环境搭建 | 指定头文件目录 | 指定函数库目录 | 编译 Android 命令行可执行文件 )
文章目录 I . NDK platforms 目录下的 函数库 II . Ubuntu 配置 NDK 交叉编译环境 III . 同时指定编译的头文件和库文件 IV . 指定编译的头文件 V . 指定编 ...
- Python json序列化时default/object_hook指定函数处理
在Python中,json.dumps函数接受参数default用于指定一个函数,该函数能够把自定义类型的对象转换成可序列化的基本类型.json.loads函数接受参数objec_thook用于指定函 ...
- python、中循环功能可通过什么命令实现_python定时执行指定函数的方法 Python如何定时循环执行命令?...
python中如何定时执行某一个函数 = =怎么连接..先调用注册函数 然后调用登录函数就行.顺序执行.至于如果你说注册失败不进行登录的话 直接在注册函数里面处理 注册失败 return def si ...
- php调用其他文件数组的值,PHP递归调用数组值并用其执行指定函数
0 PHP递归调用数组值并用其执行指定函数 围观:259℉更新时间:2014-10-29 function function_deep($function,$value) { try { if(!fu ...
- 一.关于实现浏览器弹窗提示内容几秒后自动消失重定向执行其他函数的两种方法
一.关于实现浏览器弹窗提示内容几秒后自动消失重定向执行其他函数的两种方法 第一种方法–向body动态写入div标签调用css效果显示: (新建***.jsp放在WebContent根目录下直接访问ip ...
- 吕文翰 php,自己动手打造基于 WKWebView 的混合开发框架(二)——js 向 Native 一句话传值并反射出 Swift 对象执行指定函数...
自己动手打造基于 WKWebView 的混合开发框架(二)--js 向 Native 一句话传值并反射出 Swift 对象执行指定函数 2015-9-2 / 阅读数:39757 / 分类: iOS & ...
- R语言dplyr包summarise_at函数计算dataframe数据中多个数据列(通过向量指定)的计数个数、均值和中位数、使用funs函数指定函数列表
R语言dplyr包summarise_at函数计算dataframe数据中多个数据列(通过向量指定)的计数个数.均值和中位数.使用funs函数指定函数列表 目录
- R语言使用rnorm函数生成正太分布数据、使用curve函数绘制根据指定函数绘制指定范围的曲线图、绘制函数曲线图
R语言使用rnorm函数生成正太分布数据.使用curve函数绘制根据指定函数绘制指定范围的曲线图.绘制函数曲线图 目录 R语言使用rnorm函数生成正太分布数据.使用curve函数绘制根据指定函数绘制 ...
- R语言dplyr包summarise_at函数计算dataframe数据中多个数据列(通过向量指定)的计数个数、均值和中位数、使用list函数指定函数列表并指定自定义函数名称
R语言dplyr包summarise_at函数计算dataframe数据中多个数据列(通过向量指定)的计数个数.均值和中位数.使用list函数指定函数列表并指定自定义函数名称 目录
最新文章
- Java NIO系列教程(一) Java NIO 概述
- 很多人都不知道的小秘密,c++中拷贝分为两种
- inotify+rsync实现实时同步部署
- 【.NET Core项目实战-统一认证平台】第十三章 授权篇-如何强制有效令牌过期
- HTTP/2 协议入门
- [TypeScript] vs code TSLint常见错误解决方案
- python爬取网页停止_Python爬虫之爬取静态网页
- R语言预测shibor走势:prophet
- logback整合Logstash
- 重标极差法(R/S)在matlab上的实现
- python基础——求两个数的最大公因数和最小公倍数
- win10系统盘清理彻底的方法
- android自定义打电话界面,两种Android打电话实现方法
- 【django】图形验证码接口设计、后端逻辑、前端逻辑【15】
- 侍魂胧月传说服务器维护,侍魂胧月传说手游7月15日停机维护更新预告
- 12弦原声大吉他音源 Orange Tree Samples Evolution Jumbo 12 Kontakt
- 关于理性形象的塑造——歇洛克·福尔摩斯眼中的世界
- 17joys用户管理功能-模型
- 99行C++代码实现光线追踪-算法
- H.264嵌入式视频监控系统项目指导