aliyun / aliyun-log-log4j-appender

aliyun-log-log4j-appender
Apache License 2.0
63 stars 32 forks source link

LoghubAppender的SDF存在线程不安全问题 #4

Closed captmjc closed 6 years ago

captmjc commented 6 years ago

LoghubAppender#DateFormat 用的是SDF,而SDF里面有calendar字段用以存储需要format或者parse的日期。多线程环境下存在线程不安全问题。 好在这个只是理论上,实际上由于append里面format的都是event时间,相隔很少会超过1毫秒,所以即使发生线程不安全问题,也只是理论上的。

重现方式: 使用多线程,使用同一个log对象循环打印。按如下配置:

  1. timeFormat尽量加长,以增加每次SDF#format的时间同时方便看出异常情况
  2. 增加比较耗时的Filter操作(这里使用很多个正则测试),以便使得相同时间进行append操作的不同LogEvent,其时间戳可能是不一致的(append之前先filter)

    <Loghub name="loghub" projectName="xxx" logstore="xxx" endpoint="xxx" accessKeyId="xxxx" accessKey="xxx" packageTimeoutInMS="100" logsCountPerPackage="4096" logsBytesPerPackage="3145728" memPoolSizeInByte="104857600" retryTimes="3" maxIOThreadSizeInPool="16" topic="xxx" source="xxx" timeFormat="yyyy-MM-dd'T'HH:mm:ss.SSSZ yyyy-MM-dd'T'HH:mm:ss.SSSZ yyyy-MM-dd'T'HH:mm:ss.SSSZ yyyy-MM-dd'T'HH:mm:ss.SSSZ yyyy-MM-dd'T'HH:mm:ss.SSSZ yyyy-MM-dd'T'HH:mm:ss.SSSZ yyyy-MM-dd'T'HH:mm:ss.SSSZ yyyy-MM-dd'T'HH:mm:ss.SSSZ " timeZone="Asia/Shanghai" ignoreExceptions="true">

    </Loghub>
captmjc commented 6 years ago

另外,这样使用SDF也是违反阿里的Java开发规范的。 BUG截图

brucewu-fly commented 6 years ago

@captmjc 感谢支持,我们检查下代码。

brucewu-fly commented 6 years ago

Fixed at version 4e8765165b6c12665fcd934483c27ccc8e97e952.