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