gpt4 book ai didi

java - 自定义 log4j2 附加程序在 java 11 中不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 09:20:13 32 4
gpt4 key购买 nike

我正在使用 JAVA-11 开发 spring-boot (2.1.9.RELEASE) 应用程序,并使用 log4j2,版本为 2.12.1。我正在使用自定义 log4j2 附加程序,它实际上将日志保存在数据库中。我尝试使用下面的代码片段,但它不起作用。

public class TestApplication {
static {
System.setProperty("org.springframework.boot.logging.LoggingSystem", "none");
}
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
@Bean
public ApplicationContextProvider applicationContextProvider() {
return new ApplicationContextProvider();
}
}

log4j2.xml 是

<?xml version="1.0" encoding="UTF-8"?>

<Configuration status="warn" monitorInterval="30" packages="test.package">
<Appenders>
<Console name="ConsoleAppender" target="system_out" packages="test.package">
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %t %x [%X{process-param}] %c - %m%n" />
</Console>
<AccessLog name="accessLogAppender" />
<Async name="asyncAccessLogAppender">
<AppenderRef ref="accessLogAppender" />
</Async>

<Loggers>
<Logger name="AccessFileLogger" level="debug" additivity="false">
<AppenderRef ref="ConsoleAppender" />
<AppenderRef ref="asyncAccessLogAppender" />
</Logger>
<Root level="off" />
</Loggers>
</Configuration>

自定义日志附加器是

package test.package
@Plugin(name = "AccessLog", category = "Core", elementType = "appender", printObject = true)
public final class AccessLogAppender extends AbstractAppender
{
private static final long serialVersionUID = 1L;
private final ReadWriteLock rwLock = new ReentrantReadWriteLock ();
private final Lock readLock = rwLock.readLock ();

private Connection connection = null;

protected AccessLogAppender (final String name)
{
super (name, null, null);

try
{

connection = // code snippet to get the DB Connection

}
catch (SQLException e)
{

}
}

@PluginFactory
public static AccessLogAppender createAppender (
@PluginAttribute("name") String name)
{
return new AccessLogAppender (name);
}

@Override
public void append (LogEvent event)
{
readLock.lock ();

PreparedStatement ps = null;

try
{
// code snippet to save the log into the DB

}
catch (SQLException e)
{

}
finally
{
readLock.unlock ();
}
}

@Override
public void stop ()
{
if (connection != null)
{
try
{
connection.close ();
}
catch (SQLException e)
{
System.out.println (e.getMessage ());
}
}
}
}

并且出现以下错误。

Caused by: org.apache.logging.log4j.core.config.ConfigurationException: No appenders are available for AsyncAppender asyncAccessLogAppender

最佳答案

我通过将 DBConnection 片段设置为附加程序中的延迟加载来解决此问题。然后,当第一次调用 appeners 时,将建立 DBConnection。它按预期工作。

package test.package
@Plugin(name = "AccessLog", category = "Core", elementType = "appender")
public final class AccessLogAppender extends AbstractAppender
{
private static final long serialVersionUID = 1L;
private final ReadWriteLock rwLock = new ReentrantReadWriteLock ();
private final Lock readLock = rwLock.readLock ();

private Connection connection = null;

protected AccessLogAppender (final String name)
{
super (name, null, null);
}
private void init() {
if(connection == null) {
try
{

connection = // code snippet to get the DB Connection

}
catch (SQLException e)
{

}
}
}

@PluginFactory
public static AccessLogAppender createAppender (
@PluginAttribute("name") String name)
{
return new AccessLogAppender (name);
}

@Override
public void append (LogEvent event)
{
init();
readLock.lock ();

PreparedStatement ps = null;

try
{
// code snippet to save the log into the DB

}
catch (SQLException e)
{

}
finally
{
readLock.unlock ();
}
}

@Override
public void stop ()
{
if (connection != null)
{
try
{
connection.close ();
}
catch (SQLException e)
{
System.out.println (e.getMessage ());
}
}
}
}

关于java - 自定义 log4j2 附加程序在 java 11 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58399444/

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