Closed captmjc closed 6 years ago
LoghubAppender#DateFormat 用的是SDF,而SDF里面有calendar字段用以存储需要format或者parse的日期。多线程环境下存在线程不安全问题。 好在这个只是理论上,实际上由于append里面format的都是event时间,相隔很少会超过1毫秒,所以即使发生线程不安全问题,也只是理论上的。
重现方式: 使用多线程,使用同一个log对象循环打印。按如下配置:
增加比较耗时的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>
另外,这样使用SDF也是违反阿里的Java开发规范的。 BUG截图
@captmjc 感谢支持,我们检查下代码。
Fixed at version 4e8765165b6c12665fcd934483c27ccc8e97e952.
LoghubAppender#DateFormat 用的是SDF,而SDF里面有calendar字段用以存储需要format或者parse的日期。多线程环境下存在线程不安全问题。 好在这个只是理论上,实际上由于append里面format的都是event时间,相隔很少会超过1毫秒,所以即使发生线程不安全问题,也只是理论上的。
重现方式: 使用多线程,使用同一个log对象循环打印。按如下配置:
增加比较耗时的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">