java自定义日志_java-自定义日志记录以在运行时收集消息
有没有一种方法可以在运行时创建一个log4j Logger来将日志消息收集到缓冲区中?
我目前有一个记录许多事件的类.对于需要监视记录的事件的远程应用程序,我只想交换记录到缓冲区的记录器,然后检索缓冲区,而不是重构类.例如.给出类似的东西:
Class Foo{
Logger log = ....;
public void doSomething(){
log.debug(...
.. actual code
log.debug(...
}
}
//我想从一些外部代码中做些什么:
String showFooLog(){
Foo f = new Foo();
f.log=new Logger(...
f.doSomething();
return f.log.contents();
}
这可能吗?
编辑:找到了一个简短的解决方案,从贾里德的帖子中指出(尽管它仍然不是线程安全的).谢谢您的帮助.
Logger l = Logger.getLogger( ... );
StringWriter writer = new StringWriter();
WriterAppender appender = new WriterAppender( new HTMLLayout(), writer );
l.addAppender( appender );
... run code here
writer.flush();
l.removeAppender( appender );
return writer.toString()
最佳答案
这绝对有可能-尽管您可能需要创建自己的Appender.不过,这确实很容易做到.这是一个示例的粗略介绍(需要考虑线程安全性……这不是线程安全性…….而且我不确定我是否喜欢静态函数……但这应该足以推动您的工作了.)朝正确的方向):
public class BufferAppender extends org.apache.log4j.AppenderSkeleton {
private static Map buffers = new HashMap();
@Override
protected void append(LoggingEvent evt) {
String toAppend = this.layout.format(evt);
StringBuffer sb = getBuffer(evt.getLoggerName());
buffer.append(toAppend);
}
public static String getBufferContents(String loggerName) {
StringBuffer sb = buffers.get(sb);
if(sb == null) {
return null;
} else {
return sb.toString();
}
}
public static void clearBuffer(String loggerName) {
createBuffer(loggerName);
}
private static StringBuffer getBuffer(String loggerName) {
StringBuffer sb = buffers.get(loggerName);
if(sb == null) {
sb = createBuffer(loggerName);
}
return sb;
}
private static StringBuffer createBuffer(String loggerName) {
StringBuffer sb = new StringBuffer();
buffers.put(loggerName, sb);
return sb;
}
}
java自定义日志_java-自定义日志记录以在运行时收集消息相关推荐
- java gc 时间_Java GC日志查看,GC日志时间分析
Java中的GC有哪几种类型? 参数 描述 UseSerialGC 虚拟机运行在Client模式的默认值,打开此开关参数后, 使用Serial+Serial Old收集器组合进行垃圾收集. UsePa ...
- java 自定义标签_Java自定义标签用法实例分析
本文实例讲述了Java自定义标签用法.分享给大家供大家参考,具体如下: 简单例子 实现一个标签分为两步:(1)继承SimpleTagSupport或TagSupport实现一个控制器(2)创建一个描述 ...
- java自定义字段_Java自定义注解实战
注解简介 注解的本质是一个接口,该接口默认继承Annotation接口,使用@interface进行定义.注解主要有三类:元注解.自定义注解以及框架定义的注解. 接口里面的成员方法称为注解的属性 定义 ...
- 我的世界JAVA版编程语言_Java版版本记录/开发版本
此页面并非官方版本记录或更新日志.官方日志请见Minecraft官网. 关于1.11及此前版本,请见Mojang官网. 关于Beta 1.8及此前版本,请见Notch的博客,Word of Notch ...
- java 编译宏_java – 制作一个“宏”命令来运行程序
(编辑:根据您的评论,让我展开以添加更多情况) 如果您的目标是让其他人运行您没有安装Java的程序,并且您不希望让他们在运行您的应用程序之前安装Java运行时环境,那么您需要的是一个转换.class或 ...
- Java程序员必知必会之JVM运行时数据区
JVM类加载概述 JVM垃圾回收概述 运行时数据区概述 程序计数器(Program Counter Register) 是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器,指向下一个将要 ...
- java runtime类 heap_Java 进阶(一) JVM运行时内存模型
1.JVM运行时数据区域的划分 a.程序计数器(Program Counter Register) 一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.每个线程拥有独立的一个计数器,如果 ...
- Java按包编译jar_java用命令行编译运行时带有包和使用外部jar包的情况
命令行编译运行Java程序时,加载指定目录中的Jar包: 解决方案一: 编译:javac -Djava.ext.dirs=./lib Test.java 或 javac -Djava.ext.dir ...
- java自定义日志_Java 自定义日志写入
/** * 将信息写入到日志 * @param content * @return * @throws IOException */ public static boolean writeLog(St ...
- java自定义线程_Java自定义线程池详解
自定义线程池的核心:ThreadPoolExecutor 为了更好的控制多线程,JDK提供了一套线程框架Executor,帮助开发人员有效的进行线程控制,其中在java.util.concurrent ...
最新文章
- golang 切片 slice 拼接
- Python 闭包详解
- ios 静态方法是否能被重写_小米新系统亮相,比苹果iOS更干净,21款手机支持升级...
- controller怎么调用controller_SpringMVC五大核心组件及调用过程
- 一个文件夹就是一个信息系统
- ubuntu建立向windows一样的快捷方式
- Android 为控件设置阴影
- Ubuntu 18.04.1 搭建Java环境和HelloWorld 1
- dva源码解析(一)
- 英国反垄断监管机构将对音乐流媒体市场展开调查
- python如何下载安装tensorflow_TensorFlow下载与安装
- android 关机 流程_Android 关机(reboot)流程
- 行人重识别论文阅读12-Bi-directional Exponential Angular Triplet Loss for RGB-Infrared Person ReID
- 【综述】矩阵补全问题
- 一个程序员的心路历程
- 在线学习及作业平台管理系统(ssm,mysql)
- 大唐杯简要介绍及备赛事项
- vxe-table vxe-pager 如何使用分页,自定义分页
- 计算机系统对工业相机影响,如何理解工业相机的校准
- 2023校招C++开发oppo笔试
热门文章
- Harmony OS — RadioButton RadioContainer单选按钮单选按钮组
- SQL Server-【知识与实战VIII】触发器(下)
- Flutter报错 使用Column等容器包裹ListView报错的问题
- MFC图形编辑界面工具
- ChengDu University Mental Health Test 需求分析文档
- wrk -- 小巧轻盈的 http 性能测试工具.
- 开源协议的几种类型认识
- 每日英语:A Chinese Soccer Club Has Won Something!
- 一个button同时执行多个有返回值的函数的解决方法(return false; or return true;)...
- HCIE-Security Day25:DSPN+NHRP+Mgre:实验(四)配置shortcut方式DSPN(OSPF路由协议)