【问题标题】:Custom Appender in Log4j2 not recieving any logsLog4j2 中的自定义 Appender 未收到任何日志
【发布时间】:2020-11-03 12:28:33
【问题描述】:

我已经设置了一个自定义的附加程序,它将在下面记录到内存中

@Plugin(name = "MemoryAppender",
        category = Core.CATEGORY_NAME,
        elementType = Appender.ELEMENT_TYPE)
class InMemoryAppender(name: String,
                       filter: Filter?) : AbstractAppender(name, filter, null, true, Property.EMPTY_ARRAY) {

    companion object {
        @PluginFactory
        @JvmStatic
        fun createAppender(
                @PluginAttribute("name") name: String,
                @PluginElement("Filter") filter: Filter?): InMemoryAppender {
            return InMemoryAppender(name, filter)
        }
    }

    private val buffer = CircularOverwritingBuffer(allowNonPowerOfTwoSizedBuffer = false)

    override fun append(event: LogEvent?) {
        event?.let {
            buffer.add("[${event.level}] ${DateTimeFormatter.ISO_INSTANT.format(Instant.now())} ${event.message.formattedMessage}")
        }
    }

    fun inOrder(numberOfItems: Int): Iterator<String> {
        return buffer.emitInOrder(numberOfItems).iterator()
    }
}

我已将它添加到我的 log4j conf 文件中的根记录器中,首先是通过创建附加程序

 <appenders>
     .... other appenders
     <MemoryAppender name="In-Memory-Appender"/>
 </appenders>

然后将其加载到根记录器中

 <Loggers>
     <Root level="${defaultLogLevel}">
         .... opther appenders
         <AppenderRef ref="In-Memory-Appender"/>
     </Root>
 </Loggers>

但是,当我现在为这样的类获取记录器时,我的缓冲区中什么也没有

private val log = loggerFor<AClass>()
// or
private val log = contextLog()

但如果我得到这样的记录器,我可以

LoggerContext.getContext().rootLogger.info("REQUESTING LOGS")

如何让我的 appender 正确捕获日志?

【问题讨论】:

    标签: java kotlin logging log4j log4j2


    【解决方案1】:

    以下答案解决了我的问题:https://stackoverflow.com/a/21336499/2341393

    问题是返回的记录器上下文不正确,并且 slf4j 正在包装 Log4J 记录器。

    【讨论】:

      猜你喜欢
      • 2019-11-15
      • 2019-10-10
      • 2015-05-13
      • 1970-01-01
      • 2014-08-03
      • 2014-01-16
      • 2018-06-20
      • 1970-01-01
      相关资源
      最近更新 更多