gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:08:18 31 4
gpt4 key购买 nike

根据建议进行了修改,所以现在当我尝试运行应用程序时,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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com