【问题标题】:log4j2-test.properties file pattern layout not being picked up by custom AbstractAppender自定义 AbstractAppender 未拾取 log4j2-test.properties 文件模式布局
【发布时间】:2021-07-05 11:56:41
【问题描述】:

我正在编写一个使用 SLF4J 作为 API 和 Log4J2 作为日志记录实现的单元测试。 我有一个自定义的AbstractAppender(目前还没有使用LogEvent),但我正在尝试输出LogEvent消息并首先使用System.out来格式化消息,以确保我得到我所期望的——我不在这个案例。

根据我的属性文件模式,我希望看到 "---WCustomAppender---" 作为我的输出消息的前缀,但似乎该模式没有被添加到我的附加程序中。

我是否缺少某些东西,例如财产等?

以下所有代码:

test/resources/log4j2-test.properties

packages = learning.logging
appenders=WCustomAppender

rootLogger.level=ERROR
rootLogger.appenderRefs=WCustomAppender
rootLogger.appenderRef.stdout.ref=WCustomAppender

appender.WCustomAppender.name=WCustomAppender
appender.WCustomAppender.type=WCustomAppender
appender.WCustomAppender.layout.type=PatternLayout
appender.WCustomAppender.layout.pattern=---WCustomAppender--- %m %n

测试/学习/记录/WCustomAppender

package learning.logging;

import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.config.Property;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginElement;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

@Plugin(
        name = "WCustomAppender",
        category = Core.CATEGORY_NAME,
        elementType = Appender.ELEMENT_TYPE)
class WCustomAppender extends AbstractAppender {

  private static final List<LogEvent> LOG_EVENTS = new ArrayList<>();

  protected WCustomAppender(String name, Filter filter, Layout<? extends Serializable> layout, boolean ignoreExceptions, Property[] properties) {
    System.out.println("layout loaded in appender from constructor: " + layout);
    super(name, filter, layout, ignoreExceptions, properties);
  }

  @PluginFactory
  public static WCustomAppender createAppender(
          @PluginAttribute("name") String name,
          @PluginElement("Filter") Filter filter,
          @PluginElement("Layout") Layout<? extends Serializable> layout) {
    return new WCustomAppender(name, filter, layout, false, Property.EMPTY_ARRAY);
  }

  public List<LogEvent> getLogEvents() {
    return LOG_EVENTS;
  }

  @Override
  public void append(LogEvent event) {
    System.out.println("message: " + event.getMessage());
    System.out.println("message (formatted): " + event.getMessage().getFormattedMessage());
    LOG_EVENTS.add(event);
  }
}

测试/学习/记录/LogTester

package learning.logging;


import lab.error.logging.ErrorLogger;
import lab.error.logging.ErrorStatus;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class LogTester {

  private Logger log = LoggerFactory.getILoggerFactory().getLogger("LogTester");

  @Test
  public void appenderPOC() {
    log.error("My custom appender POC");
  }
}

控制台输出:

layout loaded in appender from constructor: ---WCustomAppender--- %m %n
message: My custom appender POC
message (formatted): My custom appender POC

【问题讨论】:

    标签: java unit-testing logging log4j2


    【解决方案1】:

    我可能发现了问题:

    我发现AbstractAppender 有一个名为toSerializable 的方法,它检查是否存在布局(在我的情况下是这样),然后将其应用于LogEvent。所以在我的WCustomAppender 中,我切换了getLogEvents 以返回Serializable 的列表,而不是在测试中进行验证。

        /**
         * Serializes the given event using the appender's layout if present.
         *
         * @param event
         *            the event to serialize.
         * @return the serialized event or null if no layout is present.
         */
        protected Serializable toSerializable(final LogEvent event) {
            return layout != null ? layout.toSerializable(event) : null;
        }
    

    控制台输出:

    message: ---WCustomAppender--- My custom appender POC 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-15
      • 2016-01-05
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多