0
当我们在syslog中记录某些消息时,我们有应用程序。有时,当我们有巨大的流量(2日志在同一时间)的syslog日志在同一个包2个消息:为什么log4j2系统日志在一个包中发送2条消息
这是从tcpdump的消息:
413 62.346560 127.0.0.1 127.0.0.1 Syslog 698 LOCAL3.INFO: 1 2015-12-21T17:49:14.239+01:00 myserver.i.cz zip:/TestServertmp/_WL_user/my-app/zh0o33/war/WEB-INF/lib/_wl_cls_gen.jar!/log4j2.xml - - - MyService|SD|21.12.2015 17:49:14.239|21.12.2015 13:22:16|8e8c46f5-5112-4fe2-ae27-4d9a1bc6f601|46cf84c9-0135-4e71-9a96-89f3fd6b562c\n<158>1 2015-12-21T17:49:14.239+01:00 myserver.i.cz zip:/TestServertmp/_WL_user/my-app/zh0o33/war/WEB-INF/lib/_wl_cls_gen.jar!/log4j2.xml - - - MyService|SD|21.12.2015 17:49:14.239|21.02.2014 07:56:07|074006c1-8105-4b21-8e2c-cca30cea98b4|36eea480-cc23-4f46-ace1-12839c97f7e6\n
,你可以看到<158>
手段再掀日志消息(优先级)这意味着local3.info,但系统日志发送它在一个包。为什么?这种情况每小时发生1-2次。我使用的UPD这意味着我已经有immediatelyFlush真
UPDATE:
有人能解释我为什么在abstractOutputStream附加数据时log4j2使用readLock代替writeLock?
private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
private final Lock readLock = rwLock.readLock();
@Override
public void append(final LogEvent event) {
readLock.lock();
try {
final byte[] bytes = getLayout().toByteArray(event);
if (bytes.length > 0) {
manager.write(bytes);
if (this.immediateFlush || event.isEndOfBatch()) {
manager.flush();
}
}
} catch (final AppenderLoggingException ex) {
error("Unable to write to stream " + manager.getName() + " for appender " + getName());
throw ex;
} finally {
readLock.unlock();
}
}
的readLock可能是旨在确保阅读getLayout和管理者是原子。 manager.write处理自己的同步。 –
是的,但代码可以做2次写,只是一次冲洗什么是错的。无论如何,它在2.5.1版本中是固定的 – hudi