根据建议修改,所以现在当我尝试运行应用程序时,尽管我在主应用程序中触发了log.error,但MyCustomAppender中的append()函数仍然没有被调用。也许我错过了什么? 这是春天的问题吗?我在MyCustomAppender中设置了断点,根本没有任何调用。
由于
以下是原始问题:
我已经google了很多为log4j2创建自定义appender,因为我需要处理日志信息并发送到我们的日志服务器,我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");
}
}
这是春天的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()方法,但从未发生过。
我在这里缺少什么?
答案 0 :(得分:3)
您的配置有<Configuration status="WARN" packages="demo">
,但是您的MyCustomAppender
包“演示”?要改写,是自定义appender的完全限定类名demo.MyCustomAppender
?
如果没有,请将自定义appender的正确包名放在<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这样的未知插件应该在这里生成错误消息。
答案 1 :(得分:0)
我仔细检查了我的pom文件,那里是错误的。我必须把
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
在spring-boot里面,谢谢
答案 2 :(得分:0)
@Plugin(name = "MyCustomAppender", category = Node.CATEGORY, elementType = "appender", printObject = true)
你需要改变这样的注释。
不要忘记在log4j2.xml中添加配置,如下所示
<Configuration packages="yourAppenderPackageName">