java - 如何在 spring 中为 log4j2 创建自定义 appender

标签 java logging log4j log4j2 appender

根据建议进行了修改,所以现在当我尝试运行应用程序时,MyCustomAppender 中的 append() 函数仍然根本没有被调用,尽管我在主应用程序中触发了 log.error。也许我错过了什么? 这是 Spring 的问题吗?我在 MyCustomAppender 中放置了断点,根本没有调用任何东西。

谢谢

下面是原始问题:

我在 google 上搜索了很多关于为 log4j2 创建自定义附加程序的信息,因为我需要处理日志信息并发送到我们的日志服务器,我在 google 上搜索了很多,但没有任何效果,这就是我所做的,希望你能就在哪里提出建议是错误。

package demo;

import java.io.Serializable;

import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;

@Plugin(category = "Core", name = "MyCustomAppender")
public class MyCustomAppender extends AbstractAppender {

    protected MyCustomAppender(String name, Filter filter,
            Layout<? extends Serializable> layout) {
        super(name, filter, layout);
        // TODO Auto-generated constructor stub
    }

    @PluginFactory
    public static MyCustomAppender createAppender(
            @PluginAttribute("name") String name) {
        // note: in this example the class name matches the @Plugin name,
        // but this is not required.
        return new MyCustomAppender(name, null, null);
    }

    @Override
    public void append(LogEvent arg0) {
        // TODO Auto-generated method stub
        System.out.print("inside here 123");
    }

}

这是 spring 中的 log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!-- status = level of INTERNAL Log4j events that should be logged to the console, used to debug log4j itself -->
<Configuration status="TRACE" packages="demo">
    <Properties>
        <Property name="PID">????</Property>
        <Property name="LOG_PATTERN">[%d{yyyy-MM-dd HH:mm:ss.SSS}] log4j2%X{context} - ${sys:PID} %5p [%t] --- %c{1}: %m%n</Property>
        <!-- Default logging level, can override with system property: -DlogLevel=xxx -->
        <Property name="EXEC_SVC_LOGLEVEL">info</Property>
    </Properties>
    <Appenders>
       <MyCustomAppender name="ABC"/>
    </Appenders>
    <Loggers>
        <Root level="WARN">
            <AppenderRef ref="ABC" />
        </Root>
    </Loggers>
</Configuration>

现在当我运行主应用程序时:

@SpringBootApplication
public class DemoLoggerApplication {
        //private static final Logger logger = LogManager.getLogger("HelloWorld");
    private static final Logger logger = LogManager.getLogger("HelloWorld");
        public static void main(String[] args) {
        logger.warn("This is information!");
        SpringApplication.run(DemoLoggerApplication.class, args);
    }
}

我希望警告消息可以触发 myCustomAppender 类中的 append() 方法,但从未发生过。

我在这里遗漏了什么吗?

最佳答案

您的配置有 <Configuration status="WARN" packages="demo"> ,但是你的 MyCustomAppender在“演示”包中?换句话说,是自定义附加程序的完全限定类名 demo.MyCustomAppender

如果不是,请将自定义附加程序的正确包名称放入 <Configuration packages="CORRECT-PACKAGE-HERE">包属性。

其次,您将自定义插件的名称声明为“MyCustomAppender”(在 @Plugin(category = "Core", name = "MyCustomAppender") 中)。但是,您的配置引用了一个未知的 <StubAppender name="ABC"/> .将 StubAppender 替换为 <MyCustomAppender name="ABC"/> .

为了帮助排除故障,您可以在配置中将内部 log4j 状态日志级别设置为 TRACE:<Configuration status="TRACE"...这将在控制台上显示内部 log4j 日志消息。例如,StubAppender 等未知插件应在此处生成错误消息。

关于java - 如何在 spring 中为 log4j2 创建自定义 appender,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29643273/

相关文章:

java - 如何配置过滤器在 servlet 处理后工作?

java.util.logging.Logger 打印方法/类名称

logging - Sidekiq 记录 Redis 查询

regex - perl正则表达式通过关键字查找Java StackTrace

java - Java中具有相同属性值的不同对象可以具有相同的哈希码吗

java - 窗口应用程序无法在 Eclipse 中打开

Java最终抽象类

java - 如何在 $TOMCAT_HOME/logs 中为我的 servlet 创建命名日志?

java - Log4j 线程上的 Tomcat 内存泄漏问题

java - 如何配置gradle在不同的环境中使用不同的log4j.properties文件?