当前位置: 首页 > 知识库问答 >
问题:

事件数据消息丢失与log4j2作为SLF4J后端?

傅涵忍
2023-03-14

我想使用SLF4J-extEventData和EventLogger来记录我的业务逻辑中的重要事件:

public void onMessage(Message message) {
    EventData messageEvent = new EventData();
    messageEvent.setMessage("Message arrived");
    messageEvent.put("messageID", message.getJMSMessageID());
    EventLogger.logEvent(messageEvent);
}

我还想使用log4j2作为后端。目前,这导致以下工件成为我部署的一部分:slf4j-api-1.7。12,slf4j-ext-1.7。12、log4j-api-2.3、log4j-core-2.3、log4j-slf4j-impl-2.3、log4j-web-2.3——当然还有它们的依赖关系。

我的log4j2配置旨在在常规文件中生成格式化条目:

[...]
<Appenders>
    <RollingFile name="traceFileAppender"
        fileName="${logBase}/trace.log"
        filePattern="${logBase}/trace.log.%d{yyyy-MM-dd}">
        <TimeBasedTriggeringPolicy interval="1" modulate="true" />
        <DefaultRolloverStrategy max="7"/>
        <PatternLayout pattern="%date{ISO8601}[%thread] %level %marker %logger%nThread-Stack: %x%nThread-Map: %X%nMessage-Map: %K%nMessage: %m%n%rEx-- %n%n" />
        <ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY" />
    </RollingFile>
    [...]
</Appenders>
<Loggers>
    [...]
    <Logger name="EventLogger" level="INFO" additivity="true" />
    [...]
    <Root level="TRACE">
        <AppenderRef ref="traceFileAppender" />
        [...]
    </Root>
</Loggers>
[...]

但是,我的日志语句是这样的:

2015-07-31T08:13:55,589[MessageListenerThreadPool : 0] INFO EVENT EventLogger
Thread-Stack: []
Thread-Map: {}
Message-Map: {messageID=ID:c3e2d840d4d8d4f14040404040404040cf522d11eb57d22b}
Message: 
-- 

我错过了什么?

共有1个答案

白学
2023-03-14

log4j-slf4j-impl模块将slf4j EventData对象转换为log4j2 StructuredMessage。输出显示消息ID,证明此转换成功。

但是,输出不显示消息。看起来这是由于结构essage.toString()实现。乍一看,可能无法通过使用%K{key}转换说明符指定消息部分的键来自定义此项...:-(

 类似资料:
  • 所以我和我的Kafka消费者之间有了一些恼人的矛盾。我使用“Kafka节点”为我的项目。我创造了一个话题。在一个使用者组中通过2台服务器创建了2个使用者。自动提交设置为false。对于我的消费者获得的每一个mesaage,他们会启动一个异步进程,该进程可能需要1~20秒,当进程完成时,消费者会提交偏移量。我的问题是:在一个senarios中,消费者1得到一个消息,需要20秒来处理。在过程中间,他得

  • 我在Spring Boot应用程序中从聚合根发布事件时遇到了困难。我基本上想要的是在每次关于一个人的一些信息被更改时发布一个“更新”事件。这方面的代码非常简单: 我正在通过管理器管理实例: 然而,当我调用manager(时,事件似乎“丢失”了:在调用方法时,所有事件仍然存在,但是当Spring调用时,集合是空的。 那么我怎么才能回到正轨呢?

  • 我正在使用Docker启动一个kafka代理集群(例如,5个代理,每个容器一个代理)。Kafka版本2.12-0.11.0.0,动物园管理员3.4.10。 场景: null > 在独立模式下启动Zookeeper,然后启动kafka 创建主题 null 检查邮件 消息被累犯 null null server.properties(broker.id唯一,broker_ip:broker_port对

  • 这篇文章,给不太熟悉MQ技术的同学,介绍一个生产环境中可能会遇到的问题。 目前为止,你的RabbitMQ部署在线上服务器了,对吧?然后订单服务和仓储服务都可以基于RabbitMQ来收发消息,同时仓储服务宕机,不会导致消息丢失。 好,我们来看下目前为止的架构图。 那如果此时出现一个问题,就是说订单服务投递了订单消息到RabbitMQ里去,RabbitMQ暂时放在了自己的内存中,还没来得及投递给下游的

  • 我正在尝试从 kafka 主题中获取消息,并看到如果我将 auto.commit.reset 策略设置为“最早”,则所有消息都会得到正确处理。但是,如果设置为“最新”,则第一条消息将丢失,其余消息将得到正确处理。如果我在这里错过了什么,任何人都可以帮忙吗?

  • 如果一个主题订阅者在向该主题/订阅者发送推送通知时没有在线,那么他/她的消息会丢失还是当他们在线时才收到消息?