当前位置: 首页 > 知识库问答 >
问题:

Log4j2自定义包装器

徐高懿
2023-03-14

我基于此主题为log4j2记录器做了一个包装:如何向log4j消息添加前缀(在对象级别)

以下是我所拥有的:

进口org.apache.log4j.记录仪;

public class LogWrapper
{
    private Logger log;
    private String prefix;

    public LogWrapper(Logger log, String prefix) {
        this.log = log;
        this.prefix = prefix;
    }

    public void info(String msg)
    {
        log.error(prefix + "| " + msg);
    }
    public void error(String msg)
    {
        log.error(prefix + "| " + msg);
    }
}

用法:

public class MyClass {
    private final LogWrapper logger;
    public MyClass(String username) {
        logger = new LogWrapper(Logger.getLogger(MyClass.class.getName()), username);
    }
}

问题:

作为输出,我有一个到LogWrapper类的链接

2016-07-12 21:15:17,543 ERROR [pool-3-thread-1] global.LogWrapper (LogWrapper.java:17) - blab bla bla

"LogWrapper.java:17"它没有指向MyClass中调用记录器的行。

如何解决?

共有2个答案

顾曾笑
2023-03-14

事实上,问题是位置信息不是你想要的。当你像之前那样创建一个包装器时,就会发生这种情况。为了修复它,Log4j需要记录器类的完全限定类名(FQCN)。手动创建这样的类并不难,但简单的方法是按照http://logging.apache.org/log4j/2.x/manual/customloglevels.html#CustomLoggers

蔡修远
2023-03-14

Log4j提供的在日志输出中放置前缀的内置机制是ThreadContext映射。如何做到这一点:

代码:

// usually at some entry point from where these values won't change 
ThreadContext.put("user.ip", ipAdr);
ThreadContext.put("user.account", userAccount);

配置:

<PatternLayout pattern="%d %p %c{1.} [%t] %X{user.ip} %X{user.account} %m%n"/>

现在,将值放入ThreadContext之后的任何日志记录都将显示所需的前缀。

自定义记录器包装器可以用来实现类似的功能,但工作量要大得多。

Log4j会记住记录器的完全限定类名(FQCN),并在配置为打印位置时,使用它来遍历每个日志事件的堆栈跟踪。(请注意,使用location进行日志记录的速度很慢,可能会影响应用程序的性能。)

定义记录器包装的问题是,它的FQCN与实际记录器不同,因此Log4j找不到调用自定义记录器的位置。

解决方案是提供正确的FQCN。最简单的方法是让Log4j为您生成记录器包装器。Log4j附带了一个记录器包装生成器工具。此工具最初用于支持自定义日志级别,并记录在以下位置:https://logging.apache.org/log4j/2.x/manual/customloglevels.html#CustomLoggers

生成的记录器代码将处理FQCN,您可以将其用作进一步增强功能的基础。

 类似资料:
  • 我正在为log4j2编写一个自定义包装器。使用https://logging.apache.org/log4j/2.x/manual/customloglevels.html#Customlogggers 要求是根据要记录的对象类型选择追加器。我想的方法是扩展log4j2记录器并覆盖log方法(如info),在这些方法中检查对象类型并调用所需的appender。 现在我想让我的应用程序使用slf4

  • 问题内容: 我试图在Log4J2中实现和配置自定义过滤器- 基于ThresholdFilter,但打算做更多。我已经看到了有关自定义追加程序的主题,这些主题遵循相同的插件注释语法,但是还没有找到有关自定义拟合程序的主题。 MyCustomFilter.java (基于ThresholdFilter) log4j2.xml LoggingRunner.java 配置语法似乎与Apache文档中的语法

  • 问题内容: 我们使用log4j 1.2.x登录我们的产品,并希望在不久的将来迁移到log4j2.x。我们已实现的功能之一是将系统信息和其他重要参数记录在生成的每个新翻转日志文件上。在log4j 1.2.x中实现的方式是扩展了log4j类并覆盖了该方法,下面是实现的部分代码段 现在,当我们要迁移到log4j2时,我们正在寻找一种实现相同功能的新解决方案。但是,正如我看到的log4j2的源代码与旧的源

  • 我已经为log4j2编写了一个自定义触发策略,该策略将被回滚。在每小时/天/你的工作时间间隔结束时,按照本SO帖子的建议记录文件。 虽然我遵循基于时间的触发策略约定(命名等),但我无法看到我的策略被实例化和使用。 解决方案由3个java文件和一个maven文件组成,可在github上获得 在这里,您可以从政策本身找到主要内容: log4j2。xml文件: 编辑: 在调试过程中,我了解到在log4j

  • 本文向大家介绍php自定义apk安装包实例,包括了php自定义apk安装包实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php自定义apk安装包的方法,分享给大家供大家参考。具体实现方法如下: 众所周知,apk格式安装文件是android智能系统的安装文件,下面我们来看一个利用php实现自定义apk安装包实例。 一、需求: 需要实现对产品进行一次推荐好友安装的活动,每个会员下载自己的