使用Spring Boot创建用于将输出日志消息输出到文本区域的自定义追加程序

时间:2019-08-07 12:26:35

标签: java spring-boot log4j2 appender

我无法创建类的实例,因为不知道如何通过log4j.xml在createAppender方法中传递所需的参数。

例外:

  

ru.appliedtech.desktopapp.client.ui.menu.JTextAreaAppender中的构造函数的参数0需要找不到类型为'java.lang.String'的bean。考虑在配置中定义类型为“ java.lang.String”的bean。

@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>

2 个答案:

答案 0 :(得分:0)

该错误消息是来自Log4j还是Spring?为什么在应该由Log4j实例化的类上具有Spring注释?

答案 1 :(得分:0)

rgoers是正确的,您在Log4j Plugin类上具有Spring注释很奇怪。 @Configuration@ComponentScan不应该在那里。首先删除那些。 顺便说一句,有时(在调试log4j2配置时)将状态设置为DEBUG就像

<Configuration status="ERROR" 

如果无法识别您的插件,则可能是您的注释处理无效。如果您使用的是Gradle,请确保将log4j-core添加为annotationProcessor依赖项。

annotationProcessor 'org.apache.logging.log4j:log4j-core'

如果使用的是IntelliJ,请确保在“首选项”->“构建,执行,部署”->“编译器”->“注释处理器”->“启用注释处理”中启用注释处理。

如果还好,Log4J应该检测到您的Appender插件,这是此问题的主题。