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

时间:2015-04-15 06:42:47

标签: java logging log4j log4j2 appender

根据建议修改,所以现在当我尝试运行应用程序时,尽管我在主应用程序中触发了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()方法,但从未发生过。

我在这里缺少什么?

3 个答案:

答案 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">
相关问题