![](/img/trans.png)
[英]Log4J2 Configuration fails: Log4J2 RabbitMQ Appender with Spring-AMQP/Spring-Rabbit
[英]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.