我有几台服务器登录到中央系统日志服务器,它们使用 syslog-ng 收集日志。
我使用 logger 命令发送带有标签的日志:
$ logger -n 01.02.03.04 "Hello from $HOST at $(date)" -t MY_SPECIFIC_TAG -p local2.error
使用 syslog-ng,消息将如下所示:
Mar 5 23:36:04 05.06.07.08 MY_SPECIFIC_TAG: Hello from vps1234567 at Tue Mar 5 23:36:04 CET 2019
我的目标是让所有应用程序(java、apache、mysql 等)使用标识生成消息的应用程序的标签发送其日志,这样我就可以将日志写入与应用程序名称匹配的文件中的系统日志服务器中。
是否可以提取字符串我的特定标签从消息中,并将其用作文件路径中的变量?
此提取需要在 syslog-ng 配置文件中执行,因此我可以按如下方式写入目标:
destination dst_custom{
file("${MY_SPECIFIC_TAG}-${FACILITY}-${LEVEL}-${YEAR}-${MONTH}-${DAY}.log");
};
答案1
好的,我解决了:
syslog-ng 宏${PROGRAM}
提取该信息。
答案2
BLUF:是的。
问:如果你已经知道标签,为什么还需要提取它?
假设1:我知道我的特定标签并希望从消息文件中提取它: 这应该会让您获得 MY_SPECIFIC_TAG(或至少非常接近)。YMMV
grep MY_SPECIFC_TAG /var/log/messages | sed -n "1s/^[A-Z][a-z][a-z] [0-9:.]* (.): ./\1/p"
论点2:我知道我的特定标签但我不知道它前面的路径(即 /path/to/program/MY_SPECIFIC_TAG) 这是你要找的吗? 要将其设置为变量,请将整个命令放在里面
grep MY_SPECIFC_TAG /var/log/messages | sed -n "1s+^[A-Z][a-z][a-z] [0-9:.]* (/[a-zA-Z0-9/]/.): .*+\1+p"
$()并将其作为作业的右侧。
my_path_var=$( {command from above} )
更新:
如果你不知道我的特定标签是,并且您想找到它们: 这不会打印任何没有标签的行。
cat /var/log/messages | sed -n "s/^[A-Z][a-z][a-z] [0-9:.]* (.): ./\1/p" | sort -u
现在,在你对我大喊“UUOC!”之前,我这样做是为了展示此命令与旧命令的比较。这样,OP(和其他未来的读者)就可以轻松地根据他们的系统定制这些命令。
注意:UUOC = 不必要的 Cat 使用。文件名可以放在頁面”并删除了 cat 命令。但为了演示目的,这里使用了 cat。