log4j2-test.properties文件模式布局

ubby3x7f  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(451)

我正在编写一个单元测试,它使用slf4j作为api,使用log4j2作为日志实现。我有一个习惯 AbstractAppender (不使用 LogEvent 到目前为止)但我正在尝试输出 LogEvent 消息和格式化消息首先使用 System.out 为了确保我得到我所期望的——在这种情况下我没有。
我期待着见到你 "---WCustomAppender---" 作为根据我的属性文件模式输出消息的前缀,但该模式似乎没有被提取到我的appender中。
有什么东西是我缺少的,比如一处房产等吗?
所有代码如下:
test/resources/log4j2-test.properties

  1. packages = learning.logging
  2. appenders=WCustomAppender
  3. rootLogger.level=ERROR
  4. rootLogger.appenderRefs=WCustomAppender
  5. rootLogger.appenderRef.stdout.ref=WCustomAppender
  6. appender.WCustomAppender.name=WCustomAppender
  7. appender.WCustomAppender.type=WCustomAppender
  8. appender.WCustomAppender.layout.type=PatternLayout
  9. appender.WCustomAppender.layout.pattern=---WCustomAppender--- %m %n

测试/学习/记录/wcustomappender

  1. package learning.logging;
  2. import org.apache.logging.log4j.core.Appender;
  3. import org.apache.logging.log4j.core.Core;
  4. import org.apache.logging.log4j.core.Filter;
  5. import org.apache.logging.log4j.core.Layout;
  6. import org.apache.logging.log4j.core.LogEvent;
  7. import org.apache.logging.log4j.core.appender.AbstractAppender;
  8. import org.apache.logging.log4j.core.config.Property;
  9. import org.apache.logging.log4j.core.config.plugins.Plugin;
  10. import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
  11. import org.apache.logging.log4j.core.config.plugins.PluginElement;
  12. import org.apache.logging.log4j.core.config.plugins.PluginFactory;
  13. import java.io.Serializable;
  14. import java.util.ArrayList;
  15. import java.util.List;
  16. @Plugin(
  17. name = "WCustomAppender",
  18. category = Core.CATEGORY_NAME,
  19. elementType = Appender.ELEMENT_TYPE)
  20. class WCustomAppender extends AbstractAppender {
  21. private static final List<LogEvent> LOG_EVENTS = new ArrayList<>();
  22. protected WCustomAppender(String name, Filter filter, Layout<? extends Serializable> layout, boolean ignoreExceptions, Property[] properties) {
  23. System.out.println("layout loaded in appender from constructor: " + layout);
  24. super(name, filter, layout, ignoreExceptions, properties);
  25. }
  26. @PluginFactory
  27. public static WCustomAppender createAppender(
  28. @PluginAttribute("name") String name,
  29. @PluginElement("Filter") Filter filter,
  30. @PluginElement("Layout") Layout<? extends Serializable> layout) {
  31. return new WCustomAppender(name, filter, layout, false, Property.EMPTY_ARRAY);
  32. }
  33. public List<LogEvent> getLogEvents() {
  34. return LOG_EVENTS;
  35. }
  36. @Override
  37. public void append(LogEvent event) {
  38. System.out.println("message: " + event.getMessage());
  39. System.out.println("message (formatted): " + event.getMessage().getFormattedMessage());
  40. LOG_EVENTS.add(event);
  41. }
  42. }

测试/学习/记录/日志测试仪

  1. package learning.logging;
  2. import lab.error.logging.ErrorLogger;
  3. import lab.error.logging.ErrorStatus;
  4. import org.junit.Test;
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. public class LogTester {
  8. private Logger log = LoggerFactory.getILoggerFactory().getLogger("LogTester");
  9. @Test
  10. public void appenderPOC() {
  11. log.error("My custom appender POC");
  12. }
  13. }

控制台输出:

  1. layout loaded in appender from constructor: ---WCustomAppender--- %m %n
  2. message: My custom appender POC
  3. message (formatted): My custom appender POC
5gfr0r5j

5gfr0r5j1#

我可能发现了这个问题:
我发现 AbstractAppender 有一个名为 toSerializable 检查是否存在布局(在我的例子中是这样),然后将其应用于 LogEvent . 所以在我的 WCustomAppender 我关掉了电视 getLogEvents 返回 Serializable 而是在测试中进行验证。

  1. /**
  2. * Serializes the given event using the appender's layout if present.
  3. *
  4. * @param event
  5. * the event to serialize.
  6. * @return the serialized event or null if no layout is present.
  7. */
  8. protected Serializable toSerializable(final LogEvent event) {
  9. return layout != null ? layout.toSerializable(event) : null;
  10. }

控制台输出:

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

相关问题