我收到如下系统日志消息:
[[电子邮件保护]net_id="325" station="431"ault="16384"] [NotificationHandler] NMS 错误:STCRC/NOTTS 网络:Enas 站:CED Elmas 序列号:11347
没有 Python 解析器,我也能正确接收日志。
现在,我需要从上面的 MESSAGE 中提取一些值,并且我配置了 syslog-ng.conf 如下:
source s_network {
udp();
tcp();
};
python {
import re
class SngRegexParser(object):
def init(self, options):
pattern = options["regex"]
self.regex = re.compile(pattern)
self.counter = 0
return True
def deinit(self):
pass
def parse(self, log_message):
decoded_msg = log_message['MESSAGE'].decode('utf-8')
match = self.regex.match(decoded_msg)
if match:
for key, value in match.groupdict().items():
log_message[key] = value
log_message['MY_COUNTER'] = str(self.counter)
self.counter += 1
return True
return False
};
parser my_python_parser{
python(
class("SngRegexParser")
options("regex", "station: (?P<station>\\d+), error: (?P<error>\\d+), Net: (?P<Net>\\d+), Station: (?P<Station>\\d+), serial-num: (?P<serial-num>\\d+) (?P<padding>.*$)")
);
};
destination d_file { file("/var/log/app_network.log"); };
destination d_mysql {
sql(
type(mysql)
host ("127.0.0.1")
username("USER")
password("PASSWORD")
database("syslog")
table("logs")
columns("host", "facility", "priority", "datetime", "program", "msg", "StNum", “Error”, “Network”, “StName”, “Serial”)
values("${HOST}", "${FACILITY_NUM}", "${LEVEL_NUM}", "${R_YEAR}-${R_MONTH}-${R_DAY} ${R_HOUR}:${R_MIN}:${R_SEC}", "${PROGRAM}", "${MSGONLY}", "${station}", "${error}", "${Net}", "${Station}", "${serial-num}")
indexes("host", "program", "datetime", "facility", "priority")
null("")
);
};
log { source(s_local); source(s_network); parser(my_python_parser); destination(d_file); destination(d_mysql); };
但是重新加载 Syslog-NG 后,我没有收到任何日志,并且 Syslog-NG 状态显示此错误:
初始化新配置时出错,使用旧配置
怎么了?
感谢你们
答案1
这里有多个问题。
解决第一个问题就可以使用新配置启动 syslog-ng。
- 捕获组的组名必须是有效的 Python 标识符:
调用 Python 函数时出现异常;caller='my_python_parser'、class='SngRegexParser'、function='init'、exception='error: 组名 'serial-num' 位置 112 处的字符不正确' ``` 修复:使用(?P<serial_num>\\d+)
而不是(?P<serial-num>\\d+)
正则表达式与提供的消息不匹配。请进行相应调整。
消息的开头看起来像
structured-data
来自RFC 5424. syslog-ng 有针对此格式的原生/快速解析器,请查看syslog-procotol
的旗帜network()
。如果您共享的是完整配置,而不仅仅是片段:
不要忘记
@version: 3.19
在顶部添加配置版本(),并定义s_local
源。
答案2
感谢你的回复。
1-我昨天做了这个手术。
2-我昨天做了这个操作,现在我正在使用:
@version: 3.19
source s_network {
syslog(transport(udp) port(514));
syslog(transport(tcp) port(514));
};
3- modified.
Unfortunately, the configuration with the correction is not working.
Now the configuration file is as follows:
source s_network {
syslog(transport(udp) port(514));
syslog(transport(tcp) port(514));
};
python {
import re
class SngRegexParser(object):
def init(self, options):
pattern = options["regex"]
self.regex = re.compile(pattern)
self.counter = 0
return True
def deinit(self):
pass
def parse(self, log_message):
decoded_msg = log_message['MESSAGE'].decode('utf-8')
match = self.regex.match(decoded_msg)
if match:
for key, value in match.groupdict().items():
log_message[key] = value
log_message['MY_COUNTER'] = str(self.counter)
self.counter += 1
return True
return False
};
parser my_python_parser{
python(
class("SngRegexParser")
options("regex", "station: (?P<station>\\d+), error: (?P<error>\\d+), Net: (?P<Net>\\d+), Station: (?P<Station>\\d+) (?P<padding>.*$)")
);
};
destination d_file { file("/var/log/app_network.log" template("error: $error Net: $Net Station: $Station my_counter: $MY_COUNTER\n")); };
log { source(s_network); parser(my_python_parser); destination(d_file); };
还有其他想法吗?