使用 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 插件,这就是本题的主题。