Logstash 转发器缺少频繁滚动日志文件的日志事件。
我的 java 应用程序有很多批处理作业和实时数据馈送。基本上它是一个企业集成应用程序。
我的应用程序为每个批处理作业创建日志文件,并使用 log4j2 作为日志框架。log4j2 被定制为根据我通过 bash 脚本调用提供的提要名称动态创建日志文件,并使用 log4j2 路由适配器来创建日志文件。
这是 log4j2 配置。
<?xml version="1.0" encoding="UTF-8"?> <Configuration xmlns="http://logging.apache.org/log4j/2.0/config" shutdownHook="disable"> <Properties>
<Property name="log-path">${env:LOGPATH}</Property> </Properties> <Appenders>
<Routing name="RoutingAppender" ignoreExceptions="true">
<Routes pattern="${ctx:logFileName}">
<Route>
<RollingFile name="${ctx:logFileName}"
fileName="${log-path}/${ctx:logFileName}.log"
filePattern="${log-path}/${ctx:logFileName}_%i.log.gz">
<BurstFilter level="DEBUG" rate="16" maxBurst="100"/>
<PatternLayout pattern="%d{MM-dd-yyyy HH:mm:ss,SSS}|%level|[%thread]|[${env:USERNAME}]|[%C]|- %msg%n"/>
<SizeBasedTriggeringPolicy size="50MB" />
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</Route>
</Routes>
</Routing> </Appenders> <Loggers>
<Root level="INFO">
<AppenderRef ref="RoutingAppender"/>
</Root> </Loggers> </Configuration>
此配置运行良好,并根据提供的 loggerFile 名称创建日志文件。
很少有批处理作业可以运行更长时间并处理数百万个数据。业务需求是捕获流经我的应用程序的数据并将其记录下来以供审计。
但是,对于大多数工作,我没有看到大多数提要丢失任何日志事件。但是对于某些提要,基于大小的汇总每 3 分钟发生一次。由于处理的数据量大,有日志事件丢失。
我可能无法创建 sizeBasedTriggeringPoicy因为在任何给定时间可能有超过 1500 个提要处理,并且增加sizeBasedTriggeringPolicy 可能会导致磁盘空间问题。
这是我的logstash转发器配置
{
"network": {
"servers": [ "Server1:5004","Server2:5004","Server3:5004"],
"ssl certificate": "./certs/logstash.crt",
"ssl key": "./certs/logstash.key",
"ssl ca": "./certs/logstash.crt",
"timeout": 15
},
"files": [
{
"paths": [
"/opt/logs/*.log"],
"fields": { "type": "application" },
"dead time": "10m"
}
]
}
这是为 logstash 转发器设置的参数
./logstash-forwarder -quiet=true -config=./logstash-forwarder.conf
Kibana,显示证据,每 2 分钟收到一次日志。但是我的应用程序正在连续处理数据,并且可以看到记录在我的日志文件中的事件。根据我的分析,我发现先前滚动文件的偏移量已被获取并用于当前日志文件
为了捕获所有日志事件,应将哪些配置添加到 logstash 转发器。
我试过-tail=true,但没用。
我正在使用 0.4.0 版本的 logstash-forwarder,我的操作系统是 RHEL 5.X