2015-12-21 46 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

回答

相关问题