簡體   English   中英

Spring-rabbit使用log4j2 AmqpAppender

[英]Spring-rabbit use log4j2 AmqpAppender

庫的版本

軟版:spring-rabbit 1.7.1.RELEASE

log4j2:2.8.2

slf4j:1.7.7

log4j2配置

<appenders>
    <console name="console" target="SYSTEM_OUT">
        <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
    </console>
    <!--<Kafka name="Kafka" topic="log-test">-->
        <!--<PatternLayout pattern="%date %message"/>-->
        <!--<Property name="bootstrap.servers">192.168.3.166:9090,192.168.3.166:9091,192.168.3.166:9092</Property>-->
    <!--</Kafka>-->
    <RabbitMQ name="rabbitmq_logdata_tojson"
              host="${sys:rabbitmq_host}"
              port="${sys:rabbitmq_port}"
              user="${sys:rabbitmq_user}"
              password="${sys:rabbitmq_password}"
              virtualHost="/"
              exchange="${sys:rabbitmq_exchange}"
              exchangeType="${sys:rabbitmq_exchangeType}"
              declareExchange="true"
              durable="true"
              autoDelete="false"
              applicationId="${sys:rabbitmq_qname_4logdata.json}"
              routingKeyPattern="${sys:rabbitmq_qname_4logdata.json}"
              contentType="text/plain"
              contentEncoding="${sys:log4j2_charset}"
              generateId="false"
              deliveryMode="NON_PERSISTENT"
              charset="${sys:log4j2_charset}"
              senderPoolSize="1" maxSenderRetries="5">
    </RabbitMQ>

    <!--flume appender的配置,此處采用Avro類型 -->
    <!--<Flume name="flume_logdata_in" compress="false" type="Avro" >-->
        <!--<Agent host="192.168.2.111" port="4444"/>-->
    <!--</Flume>-->

</appenders>

<loggers>

    <logger name="${sys:rabbitmq_qname_4logdata.json}" level="info">
        <appender-ref ref="rabbitmq_logdata_tojson"/>
    </logger>

    <!--<logger name="${sys:rabbitmq_qname_4logdata}" level="info">-->
        <!--<appender-ref ref="rabbitmq_logdata_tobyte"/>-->
    <!--</logger>-->

    <root level="debug">
        <appender-ref ref="console"/>
        <!--<appender-ref ref="Kafka"/>-->
    </root>
</loggers>

Java代碼

private static final Logger writeQueueLog= LoggerFactory.getLogger(System.getProperty("rabbitmq_qname_4logdata.json"));
writeQueueLog.info(jsonObject.toString());

系統屬性

rabbitmq_qname_4logdata.json=user.behavior.countmessage.queue
rabbitmq_qname_4logdata=user.behavior.logdatainfo.queue

當我使用AMQPAppender將消息發送到Rabbitmq時,總是會有一些其他記錄器消息。

我調試了APQPAppender源代碼,當調用方法“ append”時,所有事件均正確。 但是發件人正在運行,總是有來自其他記錄器的一些事件,最后,消息計數是正確的。

然后,我將追加隊列更改為String,如下所示: private final LinkedBlockingQueue<String> eventsStrs = new LinkedBlockingQueue<String>(); ,並在方法append()中添加數據,

我看到所有值都是正確的,但是來自事件的值有一些錯誤信息。

我猜事件在其他地方已經更改。

我不知道,你能幫我嗎?

我在Log4J2中找到了此代碼...

    if (LOG_EVENT_FACTORY == null) {
        LOG_EVENT_FACTORY = Constants.ENABLE_THREADLOCALS
                ? new ReusableLogEventFactory()
                : new DefaultLogEventFactory();
    }

如果使用-Dlog4j2.enable.threadlocals=false運行,它將是線程安全的。

我將向Spring附加程序添加一個選項,以在調用線程上發送消息,而不是移交給另一個線程,這將使使用ReusableLogEventFactory安全。

您還可以使用Log4jLogEventFactory顯式設置事件工廠。

請參閱此處的 系統屬性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM