版本的库
软版:弹簧-兔子1.7.1
log4j2 : 2.8.2
slf4j : 1.7.7
log4j2 config
<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());System.properties
rabbitmq_qname_4logdata.json=user.behavior.countmessage.queue
rabbitmq_qname_4logdata=user.behavior.logdatainfo.queue当我用户AMQPAppender发送消息到rabbitmq时,总是有一些其他的记录器消息。
我已经调试了APQPAppender源代码,当方法“追加”被调用时,所有的事件都是正确的。但是发件人正在运行,总是有来自其他记录器的一些事件,最后,消息计数是正确的。
然后,我将追加队列更改为如下字符串:private final LinkedBlockingQueue<String> eventsStrs = new LinkedBlockingQueue<String>();,并在方法append()中添加数据,
我看到所有的值都是正确的,但是事件中的值有一些错误的信息。
我想这件事在别的地方已经变了。
我不知道,你能帮我吗?
发布于 2017-05-19 12:59:43
我在Log4J2中找到了这个代码..。
if (LOG_EVENT_FACTORY == null) {
LOG_EVENT_FACTORY = Constants.ENABLE_THREADLOCALS
? new ReusableLogEventFactory()
: new DefaultLogEventFactory();
}如果您使用-Dlog4j2.enable.threadlocals=false运行,它将是线程安全的。
我将向Spring添加一个选项,以在调用线程上发送消息,而不是传递到另一个线程,这将使使用ReusableLogEventFactory安全。
还可以使用Log4jLogEventFactory显式设置事件工厂。
请参见系统属性 这里。
https://stackoverflow.com/questions/44064369
复制相似问题