将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函数指定函数列表并指定自定义函数名称 目录
最新文章
- RT-Thread逐飞-智能车培训之MM32芯片应用
- 成田机场坐access到品川_关西机场交通攻略
- 笔记本电脑linux系统下载,给笔记本电脑装Linux系统
- java大整数的加减乘除_关于大整数的加减乘除求余运算 java
- word2007中如何隐藏工具栏
- 再见,再见,5 * 60 * 1000 //五分钟,再见,再见
- python的神经网络编程_Python神经网络编程 第二章 使用Python进行DIY
- R语言数组array函数
- Git-Credential-Manager-for-Mac-and-Linux
- 如何linux网页修改回80端口,linux下如何修改iptables开启80端口
- 成都睿铂 | 落差区域无人机倾斜摄影航线的规划要点
- 如何发现隐藏的Webshell后门
- 万字长文带来2021最稳C/C++学习路线
- 前端 flex: 1; 到底是什么意思?
- 基于MATLAB的指纹识别系统设计
- 无盘服务器文件管理,云图管家文档图纸管理软件
- 用c语言编写研究生录取程序,C语言_课程设计---研究生初试录取管理系统.doc
- 陌陌前端面试 - 凉面
- 如何成为优秀的软件人才(转贴)
- 药一点医疗器械管理系统——养护功能
热门文章
- 传说中的Markov不过如此”
- JavaScript笔记1基础
- android源码下编译自有工程通用make模板
- micropython logging文档
- jQuery实现tab选项卡
- 18.链表管理内存实现c语言自动释放内存
- 左神-05 二分搜索(多看几遍)
- Linux或Linux虚拟机桥接模式使用Python2认证Drcom
- 《Unix环境高级编程》学习笔记
- fckeditor出现the server didn't send back a proper XML response问题的解决(因为使用了“主题”)...