2015-12-21 40 views
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(); 
    } 
} 
+0

的readLock可能是旨在確保閱讀getLayout和管理者是原子。 manager.write處理自己的同步。 –

+0

是的,但代碼可以做2次寫,只是一次沖洗什麼是錯的。無論如何,它在2.5.1版本中是固定的 – hudi

回答

相關問題