捕获 log4j 输出

2024-03-01

我们正在使用log4j2广泛地存在于我们的系统中,并对其进行配置log4j2.xml.

现在我需要一个可以运行的新应用程序jobs,我想单独捕获时间 X 和 Y 之间产生的所有日志并将其放入数据库中。我们框架的正常日志记录应该照常发生(记录到文件或 log4j2.xml 指向的任何地方),但是从时间 X 到时间 Y。

我还希望所有日志记录都应该被捕获,最好是字符串列表或可以保存在数据库表中的内容。

我的想法是创建一个新的 Appender(捕获所有日志输出)并动态添加/删除该 Appender 以启动和停止日志记录?那行得通吗?我也可以在框架类中重新配置记录器吗?


有可能的。您需要创建一个自定义附加程序。例如。:

public class CustomAppender extends AbstractAppender {

    private List<String> list = new ArrayList<>();

    public CustomAppender(String name, Filter filter, Layout<? extends Serializable> layout) {
        super(name, filter, layout);
    }

    public CustomAppender(String name, Filter filter, Layout<? extends Serializable> layout, boolean ignoreExceptions) {
        super(name, filter, layout, ignoreExceptions);
    }

    @Override
    public void append(LogEvent event) {
        byte[] data = getLayout().toByteArray(event);
        list.add(new String(data).trim()); // optional trim
    }

    @Override
    public void stop() {
        // Write to the database
        System.out.println(list);
    }

}

每个事件都会转换为字符串,然后添加到列表中。这stop删除appender后自动执行方法。

以下代码示例了此附加程序的使用。

public static void main(String[] args) {
    // Execute some jobs
    for (int n = 0; n < 10; n++) {
        dummyJob(n);
    }
}

private static void dummyJob(int n) {
    final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
    final AbstractConfiguration config = (AbstractConfiguration) ctx.getConfiguration();

    // Create and add the appender
    CustomAppender appender = new CustomAppender("Custom", null, PatternLayout.createDefaultLayout());
    appender.start();
    config.addAppender(appender);

    // Create and add the logger
    AppenderRef[] refs = new AppenderRef[]{AppenderRef.createAppenderRef("Custom", null, null)};
    LoggerConfig loggerConfig = LoggerConfig.createLogger("false", Level.INFO, "com.company", "true", refs, null, config, null);
    loggerConfig.addAppender(appender, null, null);
    config.addLogger("com.company", loggerConfig);
    ctx.updateLoggers();

    // Run the job
    Logger logger = LogManager.getLogger("com.company");
    logger.info("Job {}", n);
    logger.info("Hello, World!");
    logger.info("This is awesome!");
    logger.info("Hope it works!");
    logger.info("Hope it helps!");

    // Remove the logger and appender
    config.removeLogger("com.company");
    config.removeAppender("Custom");
    ctx.updateLoggers();

}

后者的输出:

[Job 0, Hello, World!, This is awesome!, Hope it works!, Hope it helps!]
[Job 1, Hello, World!, This is awesome!, Hope it works!, Hope it helps!]
[Job 2, Hello, World!, This is awesome!, Hope it works!, Hope it helps!]
[Job 3, Hello, World!, This is awesome!, Hope it works!, Hope it helps!]
[Job 4, Hello, World!, This is awesome!, Hope it works!, Hope it helps!]
[Job 5, Hello, World!, This is awesome!, Hope it works!, Hope it helps!]
[Job 6, Hello, World!, This is awesome!, Hope it works!, Hope it helps!]
[Job 7, Hello, World!, This is awesome!, Hope it works!, Hope it helps!]
[Job 8, Hello, World!, This is awesome!, Hope it works!, Hope it helps!]
[Job 9, Hello, World!, This is awesome!, Hope it works!, Hope it helps!]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

捕获 log4j 输出 的相关文章

  • 部署程序集:当前显示的页面包含无效值

    我从 Sourceforge 导入了一个 Java Web 应用程序 我花了三个工作周的时间来消除项目名称和包上附加的所有红叉 但现在我无法使该应用程序在我的 Eclipse 和 tomcat6 开发环境上运行 在项目属性中 当我尝试设置部
  • 如何将TabLayout与Recyclerview同步?

    我有一个TabLayout with Recyclerview这样当单击选项卡时Recyclerview滚动到特定位置 我也想要相反的过程 这样当Recyclerview滚动到特定位置 然后该特定选项卡会突出显示 例如 如果有 4 个选项卡
  • Thread.yield()之后线程的Thread.State是什么?

    是什么Thread State之后的一个线程Thread yield 是不是一个Thread State WAITING 谢谢 不 线程仍会在RUNNABLE http download oracle com docs cd E17409
  • Java 中的递归回溯解决填字游戏

    我需要在给定初始网格和单词的情况下解决填字游戏 单词可以多次使用或根本不使用 初始网格如下所示 这是一个单词列表示例 pain nice pal id 任务是填充占位符 水平或垂直长度 gt 1 像那样 p pain pal id i c
  • 生成固定长度的随机数组[重复]

    这个问题在这里已经有答案了 我只是想更改我的代码 以便每次运行代码时都会生成固定长度 100 个整数的随机数组 而不仅仅是在代码中包含一个预先设置的数组 我对此很陌生 所以只需要正确方向的指导 谢谢 public class Selecti
  • 通过 ant 构建脚本将命令行参数传递给 Java

    运行以下命令时 ant targetname Dk1 v1 Dk2 v2 我想要将命令行参数传递给java like java whatever Dk1 v1 Dk2 v2 我需要从 Java 代码访问这些参数System getPrope
  • Java switch case 抛出 nullPointer 异常

    我有一个枚举声明如下 public enum Status REQ URL1 NOT URL2 GET URL3 String getURL Status String getURL this getURL getURL 我班上的一个领域
  • WAR 文件在 Tomcat 服务器中抛出 OutOfMemoryError

    我有一个 Spring MVC WAR 文件 可以在我的本地计算机 程序和网站 中完美运行 一旦我将文件上传到服务器 aTomcat 7 并尝试访问它 catalina 日志文件表明java lang OutOfMemoryError 我尝
  • 如何将 Google proto 时间戳转换为 Java LocalDate?

    我们需要将 Google Protobuf 时间戳转换为正常日期 在这种情况下 有没有办法将 Google Proto 缓冲区时间戳转换为 JavaLocalDate直接地 tl dr 作为 UTC 时刻 转换为java time Inst
  • Spring框架中的DAO和Service层到底是什么?

    Spring框架中的DAO和Service层到底是什么 我正在寻找理论答案 就 Spring 而言 没有区别 按照惯例 您可以使用以下方式标记 DAO 类 Repository和服务 Service 前者还进行一些持久层异常转换 既然您在理
  • 实现一个java UDF并从pyspark调用它

    我需要创建一个在 pyspark python 中使用的 UDF 它使用 java 对象进行内部计算 如果它是一个简单的 python 我会做类似的事情 def f x return 7 fudf pyspark sql functions
  • 从命令行将 clojure 源代码编译为类(AOT)(不使用 lein)

    我正在尝试将 clojure 源代码编译成类文件 并仅使用命令行运行它 没有 lein 也没有 可能 回复 我有 core cljsrc hello目录 src hello core clj 这是源代码 ns hello core defn
  • 尽管设置为 1.7,IntelliJ IDEA 13 仍使用 Java 1.5

    尽管在所有项目设置中指定了 JDK 1 7 包括File gt Project Structure gt Project Project SDK 则产生以下错误IntelliJ 13当尝试编译一些使用菱形运算符的简单 Java 7 代码时
  • Spring MVC - 从 JSP 提交对象

    我有一个显示客户列表的 JSP ArrayList searchResults 我希望能够选择其中之一 并将其 提交给 Spring MVC 控制器 但是 我似乎无法传递所选对象 只能传递它的属性 例如 customerId 我真的需要传递
  • 什么时候使用弱引用? [复制]

    这个问题在这里已经有答案了 我了解什么是 Java WeakReference 我想知道的是它通常用于解决哪种具体问题 有没有包含它们的模式 WeakReference and SoftReference当您想保留某些东西以备再次需要时使用
  • 序列化/反序列化 LinkedHashMap (android) java

    所以我想将 LinkedHashMap 传递给意图 SEND THE MAP Intent singlechannel new Intent getBaseContext singlechannel class singlechannel
  • 为什么这个 eclipse 错误显示以及它的解决方案应该是什么

    缺少库 xdoclet 1 2 1 jar 选择 XDoclet 的主目录 1 2 1 为什么这个 eclipse 错误显示以及它的解决方案应该是什么alz 这可能是因为该 jar 没有添加到您的项目构建路径中 请按照以下步骤操作 Righ
  • 三角形未在 OSX 上的 OpenGL 2.1 中绘制

    我正在学习有关使用 OpenGL 在 Java 中创建游戏引擎的教程 我正在尝试在屏幕上渲染一个三角形 一切运行良好 我可以更改背景颜色 但三角形不会显示 我还尝试运行作为教程系列的一部分提供的代码 但它仍然不起作用 教程链接 http b
  • 缓冲区溢出(与)缓冲区溢出(与)堆栈溢出[重复]

    这个问题在这里已经有答案了 可能的重复 堆栈溢出和缓冲区溢出有什么区别 https stackoverflow com questions 1120575 what is the difference between a stack ove
  • 使用java读取行并映射过滤数据[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions publi

随机推荐

  • 我可以使用 Firestore 获取使用 batch().set 创建的文档的生成 ID 吗?

    有没有一种方法可以获取使用 Firestore 批量创建的文档的自动生成 ID 使用时 add 我可以轻松获得 ID db collection posts add title Hello World then function docRe
  • 部署在 Web 服务器上时 Crystal Report 图标/工具栏不起作用

    我构建了一个网页 其中包含使用 Visual Studio 2008 中包含的 Crystal 库构建的 Crystal Report It 在我的机器上工作 http jcooney net archive 2007 02 01 4299
  • JSF 读取托管 bean 中的动态输入元素

    我有一个非常复杂的 JSF 页面 我们使用带有 Facelet 的 JSF2 我必须在其中 插入 一个纯 html 表单部分 它代表稍后将创建为 Pdf 的文档的所见即所得模板 页面看起来非常简化
  • 从字符中获取 KeyCode?

    我需要能够读取字符并获取与其语言和键盘布局相关的键 我知道如何看待文化背景和语言 但是我怎样才能知道像英语中的 S 这样的字母并且知道它在键盘上是什么键呢 或者对于更难的问题 我如何取出字母 并知道它在键盘上的键是什么 用一个示例程序可能比
  • 无法使用 iOS6.1 sdk 构建 Google Maps SDK for IOS 版本 1.7.0

    我刚刚更新到 GMS 版本 1 7 0 无法成功构建基础SDK iOS6 1 我可以使用 Base SDK iOS7 0 成功构建 GMS 版本 1 7 0 我还可以使用 Base SDK iOS6 0 或 7 0 成功构建旧的 GMS 版
  • MongoDb 区域副本集 - 每个区域的主节点?

    给定一个具有区域用户 区域为北美 欧洲 亚洲 的应用程序 如何创建允许 HK 用户写入最近节点的副本集 目标是香港的用户读取和写入其本地节点 而不会遭受写入美国的延迟 我的假设是 我可以在每个区域设置一个应用程序堆栈 通过副本集在所有区域之
  • 两种颜色的背景 - React Native

    有没有办法让背景有两种颜色 如下所示 两种颜色 https i stack imgur com 0DPHC png我尝试过使用线性渐变 但那只是渐变 我不知道如何在主视图标签中放置两种颜色作为背景 有什么建议么 如果视图的尺寸无法帮助您 请
  • go中如何将[][]byte转换为**char

    我想从 go byte 转换为 C char 换句话说 我在 go 中有一个字节矩阵 我想将其转换为 C 中的 char 双指针 请假设我必须有一个 byte 作为输入和一个 char 作为输出 我知道可以通过执行以下操作从 byte 转换
  • Lambda 的结果角色定义中的可信实体是什么?

    下面是 SAM 模板 Resources HelloWorldFunction Type AWS Serverless Function Properties CodeUri hello world Handler app LambdaHa
  • 在 Visual Studio 中哪里可以修改详细的 C# 编译器优化设置?

    在Visual Studio C C 项目中 可以很容易地在 属性页 C C 优化 中修改编译器的优化设置 例如 我们可能会给出不同的优化级别 例如 O2和 O3 以及高级优化 例如 省略帧指针 但是 我无法简单地在 Visual Stud
  • 减去具有不同时间戳的两个文档之间的数字字段

    假设我有这些数据样本 date 2019 06 16 rank 150 name doc 1 date 2019 07 16 rank 100 name doc 1 date 2019 06 16 rank 50 name doc 2 da
  • 为什么我的 KeyPressEvent 不能与右/左/上/下一起使用?

    在 C 中 我试图查看用户是否按下了正确的键 以便玩家向右移动 但是当我尝试时 它没有注册按键 private void KeyPressed object sender KeyPressEventArgs e if e KeyChar C
  • 与其活动相关的片段生命周期

    情况我的活动等待异步操作 在收到异步操作的回复后 它需要将信息传递给其中的 2 个片段 要求1 两个片段都需要它们的onCreateView为加载布局而进行的调用 2 他们需要全身心地投入到自己的活动中 以便getActivity work
  • 如何将 JUnit 测试用例导出到可执行的 .jar 中?

    我正在使用 Selenium 和 JUnit 来自动化一些测试 我希望能够将其导出到可运行的 jar 文件中 我无法做到这一点 我假设这是因为没有 main 方法 JVM 不知道要运行什么 我看到了这个帖子如何将 JUnit 测试套件导出为
  • 在 main() 之前、之后或内部声明函数有什么优点?

    我正在尝试学习嵌入式系统的C语言 目前我正在学习基础知识 但无法找到一个基本问题的答案 当我编写一个简单的 C 程序时 我用三种方式声明了一个名为 Maximum 的函数 我将通过以下示例进行解释 1 在下面的程序中 函数在 main 外部
  • 用于自动化的 User32 API 自定义 PostMessage

    我想用 C 自动化一个名为 Spotify 的程序 我认为 最好的方法是触发假按键 我想编程来暂停播放 但我对这个东西了解不够 无法找到按键以外的其他方法 因此 我使用 Visual Studio 的 Spy 来查看按下键盘上的播放按钮时
  • 当单词超过2亿时,如何使用Java去除重复单词?

    我有一个文件 大小 1 9 GB 其中包含 220 000 000 2 2 亿 个单词 字符串 它们有重复 几乎每 100 个单词就有 1 个重复单词 在我的第二个程序中 我想读取该文件 我成功使用 BufferedReader 逐行读取文
  • pitest 找不到测试

    我在 SonarQube 项目中遇到问题 我想计算一些有关测试质量的统计数据 我正在使用pitest 不幸的是 它没有找到任何变异的测试 这是pom xml我正在分析的模块
  • 在 Xcode 中禁用 AdMob 日志记录

    当我安装 Google Mobile Ads SDK cocoapod 时 我收到了大量日志记录 有些似乎完全无关 但不知何故 因为完全删除 Google Mobile Ads SDK pod 会删除所有日志记录 这是我所拥有的 Podfi
  • 捕获 log4j 输出

    我们正在使用log4j2广泛地存在于我们的系统中 并对其进行配置log4j2 xml 现在我需要一个可以运行的新应用程序jobs 我想单独捕获时间 X 和 Y 之间产生的所有日志并将其放入数据库中 我们框架的正常日志记录应该照常发生 记录到