寻求Ruby正则表达式:将Fluentd日志解析为指定JSON格式
解决方案
Ruby正则表达式
针对你的日志格式,对应的Ruby正则表达式如下:
/^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3}) +(\[.+?\]) +(\w+) +(.+?)\.?$/
正则捕获组说明
- 第1组:匹配日志时间,对应
logtime字段,精准匹配YYYY-MM-DD HH:MM:SS,SSS格式 - 第2组:匹配带方括号的Logger名称,对应
Logger Name字段,支持名称内包含空格和任意字符 - 第3组:匹配日志级别(如
DEBUG),对应Log level字段,适配大写字母组成的级别标识 - 第4组:匹配日志消息内容,对应
message字段,末尾的\.?$用于可选匹配并去除日志末尾的句号,和你期望的输出格式完全对齐
Fluentd配置示例
将该正则应用到Fluentd的regexp parser中,配置如下:
<source> @type tail path /path/to/your/log/file.log tag your.log.tag <parse> @type regexp expression /^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3}) +(\[.+?\]) +(\w+) +(.+?)\.?$/ keys logtime,Logger Name,Log level,message </parse> </source>
验证效果
用你提供的两条日志测试,解析后会生成你期望的JSON结构:
第一条日志解析结果:
{ "logtime": "2022-09-22 18:15:09,633", "Logger Name": "[springHikariCP housekeeper ]", "Log level": "DEBUG", "message": "HikariPool - springHikariCP - Fill pool skipped, pool is at sufficient level" }
第二条日志解析结果:
{ "logtime": "2022-09-22 18:15:14,968", "Logger Name": "[ringHikariCP connection closer]", "Log level": "DEBUG", "message": "PoolBase - springHikariCP - Closing connection com.mysql.cj.jdbc.ConnectionImpl@7f535ea4: (connection has passed maxLifetime)" }
内容的提问来源于stack exchange,提问作者John777
相关产品推荐
相关产品推荐

