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

如何使用Spring Boot设置log4j2自定义附加器?

曹渝
2023-03-14

我在为我的Spring Boot应用程序创建一个自定义附加器方面面临着挑战。将引发以下异常:

2019-11-08 10:33:27,897 main ERROR Unable to locate plugin type for 
mycustomhandlerclass
2019-11-08 10:33:27,961 main ERROR Unable to locate plugin for 
mycustomhandlerclass
2019-11-08 10:33:27,961 main ERROR Unable to invoke factory method in 
class org.apache.logging.log4j.core.config.AppendersPlugin for element 
Appenders: java.lang.NullPointerException java.lang.NullPointerException

Spring Boot版本:2.1.7

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.PluginElement;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

@Plugin(category = "Core", name = "Mycustomhandlerclass", elementType = "appender")
public class Mycustomhandlerclass extends AbstractAppender {

    private final Logger logger = LogManager.getLogger(getClass().getName());

    @SuppressWarnings("deprecation")
    protected AmtAppender(String name, Filter filter, Layout<? extends Serializable> layout, boolean ignoreExceptions) {
        super(name, filter, layout,ignoreExceptions);
        // TODO Auto-generated constructor stub
    }

    @PluginFactory
    public static Mycustomhandlerclass createAppender(@PluginAttribute("name") String name, @PluginAttribute("ignoreExceptions") boolean ignore, @PluginElement("Filter") Filter filter, @PluginElement("Layout") Layout<? extends Serializable> layout) { 
        return new Mycustomhandlerclass(name, filter, layout, ignore);    
    }

    @Override
    public void append(LogEvent event) {
        // TODO Auto-generated method stub
        logger.info("Entered CustomAppender");
    }

}

log4j2.properties:

name=PropertiesConfig
appenders = file, errorFile, customAppender
property.filename = D:/logdestinationfolder

appender.file.type = RollingFile
appender.file.name = OUTFILE
appender.file.fileName = ${filename}/console.log
appender.file.filePattern = ${filename}/console%d{yyyy-MM-dd}.log
appender.file.layout.type = PatternLayout
appender.file.layout.pattern = %-5p %d{dd-MM-yyyy HH:mm:ss} %t  %c{1}   %m%n
appender.file.policies.type = Policies
appender.file.policies.time.type = TimeBasedTriggeringPolicy
appender.file.policies.time.interval = 1
appender.file.strategy.type=DefaultRolloverStrategy
appender.file.strategy.max=5

appender.errorFile.type = RollingFile
appender.errorFile.name = ERROROUTFILE
appender.errorFile.fileName = ${filename}/error.log
appender.errorFile.filePattern = ${filename}/error%d{yyyy-MM-dd}.log
appender.errorFile.layout.type = PatternLayout
appender.errorFile.layout.pattern = %-5p %d{dd-MM-yyyy HH:mm:ss} %t %c{1}   %M() :: %L  %m%n
appender.errorFile.policies.type = Policies
appender.errorFile.policies.time.type = TimeBasedTriggeringPolicy
appender.errorFile.policies.time.interval = 1
appender.errorFile.strategy.type=DefaultRolloverStrategy
appender.errorFile.strategy.max=5
appender.errorFile.filter.1.type=ThresholdFilter
appender.errorFile.filter.1.onMatch=ACCEPT
appender.errorFile.filter.1.level=ERROR

appender.customAppender.type = Mycustomhandlerclass
appender.customAppender.name = CUSTOMAPPENDER
appender.customAppender.filter.1.type=ThresholdFilter
appender.customAppender.filter.1.onMatch=ACCEPT
appender.customAppender.filter.1.level=WARN

rootLogger.level = ERROR

loggers=appLogger

logger.appLogger.name = com.solartis
logger.appLogger.level = DEBUG
logger.appLogger.appenderRefs=errorFile,file,customAppender
logger.appLogger.appenderRef.errorFile.ref = ERROROUTFILE
logger.appLogger.appenderRef.file.ref = OUTFILE
logger.appLogger.appenderRef.customAppender.ref = CUSTOMAPPENDER

注意:在删除log4j2.properties中的appender引用时,日志会写入log4j2.properties中提到的路径中的文件。因此,问题在于customappender集成。

共有1个答案

锺霍英
2023-03-14

您必须在log4j.properties中添加appender类的包,例如packages=org.home.appenders

 类似资料:
  • 我创建了一个自定义追加器,但在运行测试时没有调用它。以下是这些属性的外观: 我的appender被称为WindowsEventLogappender。知道我的档案有什么问题吗?我看到了控制台测试消息,但没有看到来自我的appender的消息。现在我只是在我的自定义追加器中做一个system.out.println来验证它是否被调用。

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

  • 如何向Log4J2的JsonLayout添加自定义参数? 还有一种方法可以将模式添加到JsonLayout的消息元素中吗? 我已经尝试了这里列出的选项-> logging.apache.org/log4j/2.x/manual/layouts.html#JSONLayout 请救命!

  • 我正在使用MPAndroidChart显示一个相对简单的条形图。 有2件事我需要设置,我不知道如何自定义: > 我需要为每个条添加文本,而不是简单的值,每个条本身也有样式。 在每个条的顶部,我需要放置各种类型的可绘制材料来覆盖它的宽度(例如一个条中高度为2dp的蓝色,或另一个条上高度相同的黄色渐变)。 下面是我需要做的一个演示: > 我知道我也可以通过使用添加图标,但这似乎不适用于应该使用整个条形

  • 类似地,我们如何在log4j2中创建自定义的appender,因为我们没有AppenderSkelton类要扩展,而所有其他appender都扩展AppenderBase类。

  • 我在我的项目中使用了log4j2,就像控制器塔一样。并使用一些自定义的日志附加器将websocket事件、snmp陷阱事件、insert事件发送到数据库。 数据库追加器:从customObject获取错误代码,从customObject获取消息 对不起,我的英语太差了。任何帮助都将不胜感激。