我正在将 log4j 库从 1.2.17 迁移到 2.14.1 并面临自定义附加程序的问题。 我已经尝试了所有其他解决方案来解决我可以找到的有关语法、类加载器、使用“包”属性的问题。但我仍然无法初始化自定义 appender。
请让我知道我在这里做错了什么。粘贴下面的配置文件
这是我的自定义 Appender:
@Plugin(name = "BWLogFile", category = Core.CATEGORY_NAME, elementType = AbstractAppender.ELEMENT_TYPE)
public class BWLogFileAppender extends AbstractAppender {
private BWLogFileAppender(String name, Filter filter,
Layout<? extends Serializable> layout, final boolean ignoreExceptions) {
super(name, filter, layout, ignoreExceptions);
}
public void append(LogEvent event) {
//custom code here
}
@PluginFactory
public static BWLogFileAppender createAppender(
@PluginAttribute("name") String name,
@PluginElement("Layout") Layout<? extends Serializable> layout,
@PluginElement("Filter") final Filter filter) {
if (name == null) {
LOGGER.error("No name provided for BWLogFileAppender");
return null;
}
if (layout == null) {
layout = PatternLayout.createDefaultLayout();
}
return new BWLogFileAppender(name, filter, layout, true);
}}
这是我的 XML 文件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="trace" packages="com.share.util">
<properties>
<property name="log-pattern">"%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} %msg%n"</property>
</properties>
<appenders>
<BWLogFile name="bw_log">
<PatternLayout pattern="%msg%n" />
</BWLogFile>
<console name="bw_console" target="SYSTEM_OUT">
<patternLayout>
<pattern>${log-pattern}</pattern>
</patternLayout>
</console>
</appenders>
<loggers>
<logger name="httpclient.wire" level="warn">
<AppenderRef ref="bw_console"/>
</logger>
<logger name="org.apache.http.wire" level="debug">
<AppenderRef ref="bw_log"/>
</logger>
<root level="warn">
<AppenderRef ref="bw_console" />
</root>
</loggers>
</configuration>
这是我的属性文件:
#Define
status = trace
name = PropertiesConfig
appenders = bw_console,bw_log
#Package to search for Custom Appenders
packages = com.share.util
#Appenders
appender.bw_console.type = Console
appender.bw_console.name = bw_console
appender.bw_console.target = SYSTEM_OUT
appender.bw_console.layout.type = PatternLayout
appender.bw_console.layout.pattern = %d{yyyy MMM dd HH:mm:ss:SSS z} %X{engine} %X{role} %m %n
appender.bw_log.type = BWLogFile
appender.bw_log.name = bw_log
appender.bw_log.layout.type = PatternLayout
appender.bw_log.layout.pattern = %msg%n
#Root-Logger
rootLogger.level = WARN
rootLogger.appenderRef.bw_console.ref = bw_console
#Jakarta HttpClient Logger
logger.bw_console.name = httpclient.wire
logger.bw_console.level = WARN
logger.bw_console.appenderRef.bw_console.ref = bw_console
logger.bw_log.name = org.apache.http.wire
logger.bw_log.level = DEBUG
logger.bw_log.appenderRef.bw_log.ref = bw_log
我正在通过以下代码初始化 log4j:
private void initlog4j2System() {
String log4jConfigFile = "URI/to/log4j2.xml";
ConfigurationSource source = null;
try {
source = new ConfigurationSource(new FileInputStream(log4jConfigFile)); //for XML file
//source = new ConfigurationSource(new FileInputStream(log4jConfigFile), new File(log4jConfigFile)); //for properties file
} catch (FileNotFoundException e) {
System.out.println(e.getStackTrace());
} catch (IOException e) {
System.out.println(e.getStackTrace());
}
Configurator.initialize(null, source);
}
我通过 XML 初始化时得到的错误是:
Error processing element BWLogFile ([appenders: null]): CLASS_NOT_FOUND
我通过属性文件初始化时遇到的错误是:
2021-06-30 18:27:59,879 main ERROR Unable to locate plugin for BWLogFile
2021-06-30 18:27:59,880 main DEBUG Building Plugin[name=appenders, class=org.apache.logging.log4j.core.config.AppendersPlugin].
2021-06-30 18:27:59,882 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
at org.apache.logging.log4j.core.config.plugins.visitors.PluginElementVisitor.visit(PluginElementVisitor.java:52)
at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.generateParameters(PluginBuilder.java:258)
at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:135)
at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:1000)
at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:940)
at org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:551)
at org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:241)
at org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:287)
at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:627)
at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:700)
at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:717)
at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:272)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:155)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:47)
at org.apache.logging.log4j.LogManager.getContext(LogManager.java:196)
at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getContext(AbstractLoggerAdapter.java:137)
at org.apache.logging.slf4j.Log4jLoggerFactory.getContext(Log4jLoggerFactory.java:45)
at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:47)
at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:30)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:363)
答案 0 :(得分:0)
我从 Apache 开发邮件列表中找到了一个解决方案。感谢拉尔夫·戈尔斯。
解决方案: 存在于 log4j-core-2.14.1 jar 中的 Log4jPlugins.dat 文件需要提取并添加到包含自定义 appender 的 jar 中,并放置在 META-INF 目录下。 一旦你放置它,项目就会开始识别自定义 appender 插件。
附注: 我正在使用非 Maven/Gradle 项目并手动处理依赖项。