使用 spring 引导创建用于将日志消息输出到文本区域的自定义附加程序
Create custom appender for output log messages to text area with spring boot
我无法创建 class 的实例,因为我不知道如何在 log4j.xml.
的 createAppender 方法中传递所需的参数
异常:
Parameter 0 of constructor in ru.appliedtech.desktopapp.client.ui.menu.JTextAreaAppender required a bean of type 'java.lang.String' that could not be found. Consider defining a bean of type 'java.lang.String' in your configuration.
@Plugin(name = "JTextAreaAppender", category = "Core", elementType = "appender", printObject = true)
@Configuration
@ComponentScan("ru.appliedtech")
public class JTextAreaAppender extends AbstractAppender
{
private int maxLines = 0;
private static volatile ArrayList<JTextArea> jTextAreaList = new ArrayList<>();
protected JTextAreaAppender(String name, Filter filter, Layout<? extends Serializable> layout, boolean ignoreExceptions, Property[] properties)
{
super(name, filter, layout, ignoreExceptions, properties);
}
@PluginFactory
public static JTextAreaAppender createAppender(@PluginAttribute("name") String name,
@PluginAttribute("ignoreExceptions") boolean ignoreExceptions,
@PluginElement("Layout") Layout<?> layout,
@PluginElement("Filters") Filter filter,
@PluginElement("Properties") Property[] properties) {
return new JTextAreaAppender(name, filter, layout, ignoreExceptions, properties);
}
/**
* add the target JTextArea to be populated and updated by the logging information
* @param textArea text area
*/
public static void addTextArea(final JTextArea textArea) {
JTextAreaAppender.jTextAreaList.add(textArea);
}
@Override
public void append(LogEvent event)
{
//
}
}
log4j.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="ERROR" packages="ru.appliedtech.desktopapp.client.ui.menu">
<Properties>
<Property name="APP_LOG_ROOT">ru.appliedtech</Property>
</Properties>
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<JTextAreaAppender name="textArea">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss} %msg%n">
</PatternLayout>
</JTextAreaAppender>
</Appenders>
<Loggers>
<Root level="ERROR">
<AppenderRef ref="console" level="ERROR"/>
<AppenderRef ref="textArea" level="ERROR"/>
</Root>
</Loggers>
</Configuration>
该错误消息是来自 Log4j 还是 Spring?为什么在应该由 Log4j 实例化的 class 上有 Spring 注释?
rgoers 是对的,您的 Log4j 插件 class 上有 Spring 注释很奇怪。
@Configuration
和 @ComponentScan
不应该存在。先把那些去掉。
顺便说一句,有时(在调试 log4j2 配置时)将状态设置为 DEBUG
like
很有用
<Configuration status="ERROR"
如果您的插件未被识别,可能是您没有进行注释处理。如果您使用 Gradle,请务必添加 log4j-core
作为 annotationProcessor
依赖项。
annotationProcessor 'org.apache.logging.log4j:log4j-core'
如果您使用的是 IntelliJ,请确保在 Preferences -> Build,Execution, Deployment -> Compiler -> Annotation Processors -> Enable annotation processing 中启用注解处理。
如果没问题,Log4J 应该会检测到您的 Appender 插件,这就是本题的主题。
我无法创建 class 的实例,因为我不知道如何在 log4j.xml.
的 createAppender 方法中传递所需的参数异常:
Parameter 0 of constructor in ru.appliedtech.desktopapp.client.ui.menu.JTextAreaAppender required a bean of type 'java.lang.String' that could not be found. Consider defining a bean of type 'java.lang.String' in your configuration.
@Plugin(name = "JTextAreaAppender", category = "Core", elementType = "appender", printObject = true)
@Configuration
@ComponentScan("ru.appliedtech")
public class JTextAreaAppender extends AbstractAppender
{
private int maxLines = 0;
private static volatile ArrayList<JTextArea> jTextAreaList = new ArrayList<>();
protected JTextAreaAppender(String name, Filter filter, Layout<? extends Serializable> layout, boolean ignoreExceptions, Property[] properties)
{
super(name, filter, layout, ignoreExceptions, properties);
}
@PluginFactory
public static JTextAreaAppender createAppender(@PluginAttribute("name") String name,
@PluginAttribute("ignoreExceptions") boolean ignoreExceptions,
@PluginElement("Layout") Layout<?> layout,
@PluginElement("Filters") Filter filter,
@PluginElement("Properties") Property[] properties) {
return new JTextAreaAppender(name, filter, layout, ignoreExceptions, properties);
}
/**
* add the target JTextArea to be populated and updated by the logging information
* @param textArea text area
*/
public static void addTextArea(final JTextArea textArea) {
JTextAreaAppender.jTextAreaList.add(textArea);
}
@Override
public void append(LogEvent event)
{
//
}
}
log4j.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="ERROR" packages="ru.appliedtech.desktopapp.client.ui.menu">
<Properties>
<Property name="APP_LOG_ROOT">ru.appliedtech</Property>
</Properties>
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<JTextAreaAppender name="textArea">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss} %msg%n">
</PatternLayout>
</JTextAreaAppender>
</Appenders>
<Loggers>
<Root level="ERROR">
<AppenderRef ref="console" level="ERROR"/>
<AppenderRef ref="textArea" level="ERROR"/>
</Root>
</Loggers>
</Configuration>
该错误消息是来自 Log4j 还是 Spring?为什么在应该由 Log4j 实例化的 class 上有 Spring 注释?
rgoers 是对的,您的 Log4j 插件 class 上有 Spring 注释很奇怪。
@Configuration
和 @ComponentScan
不应该存在。先把那些去掉。
顺便说一句,有时(在调试 log4j2 配置时)将状态设置为 DEBUG
like
<Configuration status="ERROR"
如果您的插件未被识别,可能是您没有进行注释处理。如果您使用 Gradle,请务必添加 log4j-core
作为 annotationProcessor
依赖项。
annotationProcessor 'org.apache.logging.log4j:log4j-core'
如果您使用的是 IntelliJ,请确保在 Preferences -> Build,Execution, Deployment -> Compiler -> Annotation Processors -> Enable annotation processing 中启用注解处理。
如果没问题,Log4J 应该会检测到您的 Appender 插件,这就是本题的主题。