有没有一种方法可以在运行时创建一个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-自定义日志记录以在运行时收集消息相关推荐

  1. java gc 时间_Java GC日志查看,GC日志时间分析

    Java中的GC有哪几种类型? 参数 描述 UseSerialGC 虚拟机运行在Client模式的默认值,打开此开关参数后, 使用Serial+Serial Old收集器组合进行垃圾收集. UsePa ...

  2. java 自定义标签_Java自定义标签用法实例分析

    本文实例讲述了Java自定义标签用法.分享给大家供大家参考,具体如下: 简单例子 实现一个标签分为两步:(1)继承SimpleTagSupport或TagSupport实现一个控制器(2)创建一个描述 ...

  3. java自定义字段_Java自定义注解实战

    注解简介 注解的本质是一个接口,该接口默认继承Annotation接口,使用@interface进行定义.注解主要有三类:元注解.自定义注解以及框架定义的注解. 接口里面的成员方法称为注解的属性 定义 ...

  4. 我的世界JAVA版编程语言_Java版版本记录/开发版本

    此页面并非官方版本记录或更新日志.官方日志请见Minecraft官网. 关于1.11及此前版本,请见Mojang官网. 关于Beta 1.8及此前版本,请见Notch的博客,Word of Notch ...

  5. java 编译宏_java – 制作一个“宏”命令来运行程序

    (编辑:根据您的评论,让我展开以添加更多情况) 如果您的目标是让其他人运行您没有安装Java的程序,并且您不希望让他们在运行您的应用程序之前安装Java运行时环境,那么您需要的是一个转换.class或 ...

  6. Java程序员必知必会之JVM运行时数据区

    JVM类加载概述 JVM垃圾回收概述 运行时数据区概述 程序计数器(Program Counter Register) 是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器,指向下一个将要 ...

  7. java runtime类 heap_Java 进阶(一) JVM运行时内存模型

    1.JVM运行时数据区域的划分 a.程序计数器(Program Counter Register) 一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.每个线程拥有独立的一个计数器,如果 ...

  8. Java按包编译jar_java用命令行编译运行时带有包和使用外部jar包的情况

    命令行编译运行Java程序时,加载指定目录中的Jar包: 解决方案一: 编译:javac -Djava.ext.dirs=./lib Test.java  或 javac -Djava.ext.dir ...

  9. java自定义日志_Java 自定义日志写入

    /** * 将信息写入到日志 * @param content * @return * @throws IOException */ public static boolean writeLog(St ...

  10. java自定义线程_Java自定义线程池详解

    自定义线程池的核心:ThreadPoolExecutor 为了更好的控制多线程,JDK提供了一套线程框架Executor,帮助开发人员有效的进行线程控制,其中在java.util.concurrent ...

最新文章

  1. golang 切片 slice 拼接
  2. Python 闭包详解
  3. ios 静态方法是否能被重写_小米新系统亮相,比苹果iOS更干净,21款手机支持升级...
  4. controller怎么调用controller_SpringMVC五大核心组件及调用过程
  5. 一个文件夹就是一个信息系统
  6. ubuntu建立向windows一样的快捷方式
  7. Android 为控件设置阴影
  8. Ubuntu 18.04.1 搭建Java环境和HelloWorld 1
  9. dva源码解析(一)
  10. 英国反垄断监管机构将对音乐流媒体市场展开调查
  11. python如何下载安装tensorflow_TensorFlow下载与安装
  12. android 关机 流程_Android 关机(reboot)流程
  13. 行人重识别论文阅读12-Bi-directional Exponential Angular Triplet Loss for RGB-Infrared Person ReID
  14. 【综述】矩阵补全问题
  15. 一个程序员的心路历程
  16. 在线学习及作业平台管理系统(ssm,mysql)
  17. 大唐杯简要介绍及备赛事项
  18. vxe-table vxe-pager 如何使用分页,自定义分页
  19. 计算机系统对工业相机影响,如何理解工业相机的校准
  20. 2023校招C++开发oppo笔试

热门文章

  1. Harmony OS — RadioButton RadioContainer单选按钮单选按钮组
  2. SQL Server-【知识与实战VIII】触发器(下)
  3. Flutter报错 使用Column等容器包裹ListView报错的问题
  4. MFC图形编辑界面工具
  5. ChengDu University Mental Health Test 需求分析文档
  6. wrk -- 小巧轻盈的 http 性能测试工具.
  7. 开源协议的几种类型认识
  8. 每日英语:A Chinese Soccer Club Has Won Something!
  9. 一个button同时执行多个有返回值的函数的解决方法(return false; or return true;)...
  10. HCIE-Security Day25:DSPN+NHRP+Mgre:实验(四)配置shortcut方式DSPN(OSPF路由协议)