![使用 Rsyslog 格式化文件名](https://linux22.com/image/715218/%E4%BD%BF%E7%94%A8%20Rsyslog%20%E6%A0%BC%E5%BC%8F%E5%8C%96%E6%96%87%E4%BB%B6%E5%90%8D.png)
我需要格式化 rsyslog 将创建的文件的名称:
现在,在 /etc/rsyslog.d/51-loggingdriver.conf 中我有:
$template DockerLogs,"/var/log/docker/%HOSTNAME%_%FROMHOST-IP%_%PROGRAMMENAME%_syslog.log"
但看起来 programmename 给了我类似的东西:
gitlab_gitlab.1.2rr19xz43unto19ba1sih7jqg_syslog.log
gitlab_gitlab.1.aw2xvfp77i68i2c87szy5n8g9_syslog.log
gitlab_gitlab.1.ig5hk4j3i5x8i6hi07ebqotln_syslog.log
所以它为我提供了同一个应用程序的几个文件,但我只想要一个文件。(随机后缀是由于使用 Docker Swarm 服务)
我希望这个字段等于:gitlab_gitlab
,或者更好的是,只是“gitlab”
可能吗?我该怎么做?有没有办法做子字符串?
答案1
你可以用物业更换者,包括取固定大小的子字符串,或者更有力地匹配正则表达式。例如,
%programmename:R,ERE,1,FIELD:([^_.]+).*--end%
而不是%PROGRAMMENAME%
模板中的 将在第一个_
或.
字符后停止。这R
意味着使用扩展语法的正则表达式ERE
,保留第一个捕获组 1,如果没有匹配,则使用原始 FIELD 值。正则表达式模式有一个捕获组()
,它匹配除前面提到的两个字符之外的任何字符[^_.]+
。--end
显示语法的结尾R
。