【发布时间】:2022-01-14 18:34:49
【问题描述】:
我正在容器 balabit/syslog-ng:3.35.1 中运行 syslog-ng
我想为vpnrd变量中的值做值映射
下面是值映射配置 + CSV 文件示例
parser p_json {
json-parser(prefix(".json."));
};
parser p_acd_vrf {
add-contextual-data(
selector("${.json.vpnrd}")
database("vrf_map.csv")
default-selector("UNKNOWN")
prefix(".meta_vrf.")
);
};
CSV 文件内容:
111,vrf_id,vrf_1
222,vrf_id,vrf_2
zzz,vrf_id,vrf_example
UNKNOWN,vrf_id,[No VRF; Global Instance peer]
...
问题在于vpnrd 包含格式为xxx:yyy:zzz 的字符串,我需要将其拆分(分隔符:)并仅使用最后一部分zzz,因为只有该部分与值映射相关。
有没有办法在 syslog-ng 中做到这一点?
我正在查看自定义 python 解析器,它可以很容易地执行这种操作,但是我不知道如何将 python 解析器的结果与值映射解析器连接起来。
感谢大家的指点
更新:我基于this blog 编写了python 解析器,但不幸的是映射仍然不起作用,我总是得到[No VRF; Global Instance peer],它被映射为默认值。
我也看不到来自 python 脚本的日志(它们发送到哪里?)所以很难判断发生了什么
parser p_py_vrf_id {
python(
class("GetVrfId")
);
};
python {
from syslogng import Logger
logger = Logger()
class GetVrfId(object):
def parse(self, log_message):
"""
extract vrf_id from rd variable
"""
logger.info(f'log: {log_message}')
try:
vpnrd = log_message['.json.rd'].split(':')[-1].strip()
log_message['.json.vpnrd'] = vpnrd
logger.info(f'vpnrd: {vpnrd}')
except KeyError:
log_message['.json.vpnrd'] = 'UNKNOWN'
logger.error(f'key-error: rd not present')
except Exception as e:
logger.error(f'catch-all-error: {e}')
# return True, other way message is dropped
return True
};
【问题讨论】:
-
log_message['.json.vpnrd'] = vpnrd应该可以解决问题。请注意,LogMessage字段是 Python 3 中的字节对象,因此您可能希望在转换它们之前将它们解码为字符串(例如:log_message['.json.vpnrd'].decode("utf8"))。