備忘録

Qiitaに書くほどでもない事をこちらに書きます

rsyslogのconfigで使える変数や引数の覚書

① docker_compose.yml

    logging:
      driver: "syslog"
      options:
        syslog-facility: daemon
        tag: docker/{{.Name}}/{{.ID}}

上記のようにdocker-compose.ymlのloggingでsyslogを指定したあと、
rsyslogのコンフィグとして以下のようにする事がある。

/etc/rsyslog/docker.conf

$template DockerLogs, "/var/log/docker/%programname%_%SYSLOGTAG:R,ERE,1,FIELD:docker/(.*)\[--end:secpath-replace%_%$year%%$month%%$day%.log"
if $programname contains 'docker' then {
    action(type="omfile" DynaFile="DockerLogs")
}
stop

が、これらが何を書いているのかイマイチ分からなかったので調べた。
以下のようにして、ログフォーマットやファイル名などをtemplate_nameに代入できる。

$template <template_name>, <templateの中身>

今回、templateの中身として以下を記述している。
これは①で指定したtagを正規表現でパースして指定するファイル名を生成している一文である。

"/var/log/docker/%programname%_%SYSLOGTAG:R,ERE,1,FIELD:docker/(.*)\[--end:secpath-replace%_%$year%%$month%%$day%.log"

これを分解すると、以下の構成となっている。
%programname%の中には、①で設定したtag: docker/{{.Name}}/{{.ID}}dockerが渡される。

/var/log/docker/%programname%_     

▽ ①で設定したtagを正規表現でパースし、{{.Name}}/{{.ID}}の部分だけを抽出している。
なお、:secpath-replaceによって、{{.Name}}_{{.ID}} に加工される。

%SYSLOGTAG:R,ERE,1,FIELD:docker/(.*)\[--end:secpath-replace%` :   

secpath-replaceの説明は、以下のドキュメントに記載されている。
The Property Replacer — Rsyslog documentation

secpath-replace
Replace slashes inside the field by an underscore. (e.g. “a/b” becomes “a_b”). Useful for secure pathname generation (with dynafiles).

%SYSLOGTAG:R,ERE,1,FIELD:部分は細かいので箇条書きで以下に記載した。

  • SYSLOGTAG:R,ERE,1,FIELD:SYSLOGTAGSYSLOGTAGを操作対象としている。今回①で設定したtagが渡される。
  • SYSLOGTAG:R,ERE,1,FIELD:R 正規表現を使用することを表している。
  • SYSLOGTAG:R,ERE,1,FIELD:ERE 拡張正規表現(ereregex)を使用することを表している。
  • SYSLOGTAG:R,ERE,1,FIELD:1 マッチした正規表現の1番目を使用することを表している。
  • SYSLOGTAG:R,ERE,1,FIELD:FIELD: 右に正規表現のパターンを記載する。