自定义日志记录以在运行时收集消息

2023-11-26

有没有办法在运行时创建一个 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();
}

这可能吗?

编辑:找到了一个更短的解决方案,从 Jared 的帖子中指出(尽管它仍然不是线程安全的)。谢谢您的帮助。

 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<String, StringBuffer> buffers = new HashMap<String, StringBuffer>();

    @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;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义日志记录以在运行时收集消息 的相关文章

随机推荐

  • 在 Google Apps 脚本中从服务器到客户端进行通信

    我正在尝试编写一个具有客户端和服务器端组件的 Google Apps 脚本 客户端组件显示进度条 客户端调用服务器端函数 异步调用 其进度必须显示在客户端进度栏中 现在 我想要的是能够根据服务器端功能的反馈来更新客户端进度条 这可能吗 由于
  • 获取容器的 docker run 命令

    我有一个我创建的容器 但我不记得确切的内容docker run我用来启动它的命令 有什么办法可以找回吗 这与查看 Docker 中运行 停止容器的完整命令我想知道的是生成容器的完整 docker 命令 而不是容器内的命令 您可以通过查看输出
  • Matplotlib 中的非线性第二轴

    我想知道如果没有任何解析公式 是否有一种方法可以在 Matplotlib 中添加第二个非线性 x 轴 或者简化是否有办法为原始 x 轴中的每个数字创建不同的标签 下图解释了我正在寻找的内容 不幸的是类似question之前已被问过但未得到答
  • 如何在Java中使用Collections.sort()?

    我得到了一个物体Recipe实现Comparable
  • 需要在每个 cron 作业之前设置 rvm 环境

    我大致按照这组说明的第一部分中概述的模式安装和配置 RVM http blog ninjahideout com posts a guide to a nginx passenger and rvm server 基本上 这意味着没有预构建
  • 带有单击事件处理程序的 WPF 命令

    当我使用Command in a Button控制加入的事件处理程序Click事件永远不会引发 我怎样才能使用Command并处理Click事件处理程序 您可以将 ICommand 附加到另一个属性并从 Click 处理程序中执行它
  • Chrome DevTools - 性能选项卡摘要

    在 Chrome DevTools 的 性能 选项卡上 摘要 面板显示多个活动类别的计时 加载 脚本编写 渲染 绘画 系统 空闲 我似乎无法在 DevTools 文档中找到每个类别所代表的内容的简明描述 我觉得我必须忽略一些显而易见的事情
  • 如何将两个div并排放置? [复制]

    这个问题在这里已经有答案了 考虑以下代码 wrapper width 500px border 1px solid black first width 300px border 1px solid red second border 1px
  • 如何将 package.json 数组传递给 grunt.js

    有没有办法将数组从 package json 文件传递 给 grunt js 我尝试了几种不同的方法 但似乎都不起作用 我目前有 global module false module exports function grunt Proje
  • 如何制作模块向量?

    我想实例化一个一维元素数组 并且元素扩展模块 我该怎么做 如果我说我最好的猜测 那就是 val elements Vec 64 new element 我收到以下错误消息 error Users mykland work chisel ar
  • 如何从 PHP 调用 Perl 脚本?

    我有兴趣了解如何在 PHP 中调用 运行 Perl 脚本 您可以在 Php 代码中使用简单的 Php Perl 扩展 这将允许您执行代码和 Perl 变量 函数以及实例化对象 perl new Perl perl gt require te
  • 如何在启动repl时默认加载ns

    我用的是lein2 我想在 repl 启动时默认加载一些 ns 当为该项目执行 lein2 repl 时 是否可以在 project clj 中指定应加载的 ns 你会在其中找到很多答案示例项目 Options to change the
  • Bootstrap:在标签内输入

    为了避免表单上的每个输入元素都有一个 ID 我想将表单输入放在label 引导程序 3 我的问题是 这导致行之间有额外的垂直间距 输入没有填充其父级的整个宽度 并且输入未对齐
  • 使用UINT64_C的目的?

    我在 boost 源中找到了这一行 const boost uint64 t m UINT64 C 0xc6a4a7935bd1e995 我想知道这里使用宏的目的是什么 这一切所做的就是添加ULL到提供的常数 我认为它可能会被用来让人们更难
  • 剃须刀要求;当使用(Html.BeginForm())时

    using Html BeginForm Name Html TextBoxFor o gt o Name
  • C# 中的拍手声检测

    我希望能够检测到拍手声 对于任何形式的声音识别都很陌生 有什么简单的方法可以做到这一点吗 如果没有 有什么好的 C 声音识别 检测资源吗 我的目标是通过一些基本的基于拍手的控制来实现客户媒体中心的自动化 以前也有人问过类似的问题 给定音频流
  • NoSuchMethodException: springframework.boot.autoconfigure.http.HttpMessageConverters

    我想将 Java 9 与 Spring 一起使用 但我得到例外 Caused by org springframework aop framework AopConfigException Unable to instantiate pro
  • 使用 Gradle 从现有 pom.xml 文件中读取信息?

    在蚂蚁金服中Maven Ant 任务可用于读取 Maven 属性 如下所示
  • 减慢音频文件的播放速度而不改变其音调?

    我正在申请大学音乐专业 我正在考虑的一个功能是减慢音乐播放速度而不改变其音调 我已经在商业软件中看到了这一点 但找不到任何库或开源应用程序可以执行类似的操作 那里有图书馆吗 如何从头开始从各种文件格式完成此操作 注意 我正在使用java工作
  • 自定义日志记录以在运行时收集消息

    有没有办法在运行时创建一个 log4j Logger 将日志消息收集到缓冲区中 我目前有一个记录许多事件的类 对于需要监视记录的事件的远程应用程序 我想只交换记录到缓冲区的记录器 然后检索缓冲区 而不是重构该类 例如 给定类似的东西 Cla