从 rsyslog 配置中读取环境变量(或环境文件)?

从 rsyslog 配置中读取环境变量(或环境文件)?

我正在为我的组织构建 AMI,其中包括默认配置,用于将所有日志从 rsyslogd 发送到 Loggly。它运行良好,但我希望能够从 cloud-init 脚本自定义配置,以便根据每个实例提供自定义日志记录标签。我想在 cloud-init 中执行类似以下操作:

#cloud-config
write_files:
    - path: /etc/sysconfig/rsyslog-loggly
      content: |
          LOGGLY_TAGS=staging,search,solr,staging-search-solr

然后将环境变量/文件读入 rsyslog 配置:

$template LogglyFormat,"<%pri%>%protocol-version% %timestamp:::date-rfc3339% %HOSTNAME% %app-name% %procid% %msgid% [---TOKEN--- tag=\"$LOGGLY_TAGS\"] %msg%"

有没有办法在 rsyslog 配置中获取环境文件或读取环境变量?只要我能读取它,我就可以扩充 rsyslog 的 SystemD 单元以包含环境文件。

我想避免的是做这样的事情:

[Service]
...
ExecStartPre=/usr/local/sbin/rewrite-loggly-conf.py

并在每次启动时使用一些 Python 脚本重写配置。

rsyslog 中有没有办法完成我想要完成的事情?

答案1

是的,你可以使用反引号将环境变量包含进来,类似于 shell 脚本。从 rsyslog 8.33.0 开始,此功能有效

字符串常量在 rsyslog 文档中:

反引号

这是在 8.33.0 中添加的。目的是提供 shell 功能的一个有用子集。目前,仅支持以下内容:

echo $VARNAME - It will evaluate the environment variable and use it as string constant. If the variable is not found, an empty string

已生成(这不是错误)。

Starting with 8.37.0, the echo case has been enhanced. It is now more along the lines of what bash does. It supports multiple

环境变量扩展以及它们之间的常量文本。

An example:
    env SOMEPATH is set to “/var/log/custompath”
    config is: param=echo $SOMEPATH/myfile
    param than is expanded to “/var/log/custompath/myfile”

Note, however, that some common bash features are not supported. Most importantly, ${VAR} does not work. Also, environment variables

仅以空格或 / 结尾。不支持 $(pwd) 之类的东西。此参数的理念不是提供完整的 bash 等效项,而是提供一些通常被认为对使用外部数据自定义 rsyslog 配置有用的功能。话虽如此,如果有明确的需求和理由,我们仍然有兴趣扩展覆盖范围。

cat filename - It will evaluate to the content of the given file. Only a single file name is supported. If the file is not readable, it

将计算为空字符串。

目前,任何其他构造都会导致错误消息。请注意,“echo”或“cat”与其他参数之间必须恰好有一个空格。

反引号对于自动生成但需要包含一小组特殊功能的配置文件特别有用。

有关此操作的示例,请查看以下网址提供的 rsyslog docker 设备 https://github.com/rsyslog/rsyslog-docker/tree/master/appliance/alpine

相关内容