我想排除 serive_name 为空的行"service_name":""。这是我流利的 conf
## match tag=debug.** and dump to console
<match debug.**>
@type stdout
</match>
<source>
@type tail
path /opt/wso2esb-4.9.0-wkr-1/repository/logs/wso2carbon.log
pos_file /var/log/td-agent/tmp/wso2carbon.log.pos
tag debug.wso2.esb
format /^([TID:]* [^ ]* [^ ]* \[(?<time>[^\]]*)\]) ([^ ]* (?<level>[^ ]*))([^***]*[^=]*[^ ]*(?<service_name>[^,]*)[^=]*[^ ]*(?<step>[^,]*)[^ ]*[^=]*[^ ]*(?<message_id>[^,]*))/
time_format %Y-%m-%d %H:%M:%S
# keep_time_key true
</source>
Run Code Online (Sandbox Code Playgroud)
这是日志输出
2017-08-21 09:57:10 +0700 debug.wso2.esb: {"level":"INFO","service_name":" SA_VasGWLogSeq","step":" before vasgwInsertlog","message_id":" urn:uuid:2046f0ed-690d-47b1-aa86-d4a71c021a74"}
2017-08-21 09:57:10 +0700 debug.wso2.esb: {"level":"INFO","service_name":"","step":"","message_id":""}
2017-08-21 09:57:10 +0700 debug.wso2.esb: {"level":"INFO","service_name":" SA_VasGWLogSeq","step":" after vasgwInsertlog","message_id":" urn:uuid:2046f0ed-690d-47b1-aa86-d4a71c021a74"}
2017-08-21 10:16:10 +0700 debug.wso2.esb: {"level":"INFO","service_name":" SERVICE_NAME","step":" Before - SA_ServiceApiDSEp","message_id":" urn:uuid:39e0ecc1-dda5-4cd9-91fc-90e7ed4f5233"}
Run Code Online (Sandbox Code Playgroud)
我想排除下面的行。怎么做?
{"level":"INFO","service_name":"","step":"","message_id":""}
Run Code Online (Sandbox Code Playgroud)
第二个问题是为什么我在 value 之前有一个空格"service_name":" SERVICE_NAME",当我尝试Fluentular 时,我得到了一个没有空格的不错的输出。
我已经通过向正则表达式添加一个空格解决了第二个任务。例如改变
[^=]*[^ ]*(?<service_name>[^,]*)到[^=]*[^ ]* (?<service_name>[^,]*)。
但我不知道如何编写过滤器以通过 key_name 排除具有空值的记录,例如"service_name":"".
grep过滤器插件exclude指令的使用似乎相当简单。
匹配一条空消息并使用“开始”( ^)排除它,后跟空消息和结束( $) 可以通过以下方式完成。
<filter **>
@type grep
<exclude>
key service_name
pattern /^$/
# or, to exclude all messages that are empty or include only white-space:
# pattern /^\s*$/
</exclude>
</filter>
Run Code Online (Sandbox Code Playgroud)
请注意,0.12 和 1.x 之间的正则表达式符号发生了变化(现在使用前导和尾随斜杠)。