【发布时间】:2016-03-09 19:34:55
【问题描述】:
我们有一个日志收集服务,可以自动拆分 64KB 的消息,但是拆分一点也不优雅。我们将单个日志消息打印为带有一些附加元数据的 json blob。有时这些包括我们想要完整保留的大型堆栈跟踪。
所以我正在考虑编写一个自定义记录器或附加程序包装器,它可以接收消息并将其拆分为更小的块并重新记录它,但这看起来并不简单。
如果消息的大小大于某个值,是否有一种简单的方法可以配置 logback 以将其消息拆分为多个单独的消息?
这里是附加器配置:
<!-- Sumo optimized rolling log file -->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Append>true</Append>
<file>${log.dir}/${service.name}-sumo.log</file>
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<fieldName>t</fieldName>
<pattern>yyyy-MM-dd'T'HH:mm:ss.SSS'Z'</pattern>
<timeZone>UTC</timeZone>
</timestamp>
<message/>
<loggerName/>
<threadName/>
<logLevel/>
<stackTrace>
<if condition='isDefined("throwable.converter")'>
<then>
<throwableConverter class="${throwable.converter}"/>
</then>
</if>
</stackTrace>
<mdc/>
<tags/>
</providers>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<maxIndex>1</maxIndex>
<FileNamePattern>${log.dir}/${service.name}-sumo.log.%i</FileNamePattern>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>256MB</MaxFileSize>
</triggeringPolicy>
</appender>
<appender name="sumo" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>500</queueSize>
<discardingThreshold>0</discardingThreshold>
<appender-ref ref="file" />
</appender>
【问题讨论】:
-
这是一个有趣的问题。我认为这没有任何标准,至少我找不到任何标准。如果您自己拆分多行消息并使用带有一些唯一 ID 的映射诊断上下文来关联它们会怎样?
-
此线程正在讨论类似mailman.qos.ch/pipermail/logback-user/2009-September/…的自定义布局@
-
@MarianP 我们已经有一个相关 ID 用于链接与单个 Web 事务相关的消息,所以我不需要做任何事情。我在下面添加了代码来包装记录器并实现我的目标。不像调用
LoggerFactory.getLogger()那样优雅,但它可以完成这项工作