Amazon EC2 Systems Manager(SSM)エージェントのログローテーション

SSMエージェントは、logrotateなどの仕組みを利用しなくても、自力で自分の出力するログファイルをローテーションすることができるのですが、設定方法が結構謎だったのでメモ。

設定ファイル

/etc/amazon/ssm/seelog.xml.templateというファイルがあるので、これを/etc/amazon/ssm/seelog.xmlと.templateを外してここに設定をします(XMLです)

中を覗いてみると、ファイルの先頭に

<!--amazon-ssm-agent uses seelog logging -->
<!--Seelog has github wiki pages, which contain detailed how-tos references: https://github.com/cihub/seelog/wiki -->
<!--Seelog examples can be found here: https://github.com/cihub/seelog-examples -->

と、https://github.com/cihub/seelog/wiki に説明があるよと書いてあります。

wikiを見てみると、seelogはGo言語用のログ管理フレームワークで、SSM Agentはこの機能を使用してログを出力しているようです。

ローテーションの仕方は、Rolling file writer (or “Rotation file writer”)にあります。

seelog.xmlのデフォルト設定では、

<outputs formatid="fmtinfo">
    <console formatid="fmtinfo"/>
    <rollingfile type="size" filename="/var/log/amazon/ssm/amazon-ssm-agent.log" maxsize="30000000" maxrolls="5"/>
    <filter levels="error,critical" formatid="fmterror">
        <rollingfile type="size" filename="/var/log/amazon/ssm/errors.log" maxsize="10000000" maxrolls="5"/>
    </filter>
</outputs>

のようになっていて、

ログ ファイル名 ローテーションのきっかけ ローテーションする最大サイズ 保持ファイル数
infoログ /var/log/amazon/ssm/amazon-ssm-agent.log サイズがオーバーしたら 30000000byte 5世代
errorログ /var/log/amazon/ssm/errors.log サイズがオーバーしたら 10000000byte 5世代

こんな感じになっています。これを以下のように変更しようと思います。

ログ ファイル名 ローテーションのきっかけ 保持ファイル数
infoログ /var/log/amazon/ssm/amazon-ssm-agent.log 日次で 7世代
errorログ /var/log/amazon/ssm/errors.log 日次で 7世代

あと、ローテーションされたファイルのファイル名の後ろに日付を付けたい。これを適用すると以下のようになります。

<outputs formatid="fmtinfo">
    <console formatid="fmtinfo"/>
    <rollingfile type="date" filename="/var/log/amazon/ssm/amazon-ssm-agent.log" datepattern="20060102" maxrolls="7"/>
    <filter levels="error,critical" formatid="fmterror">
        <rollingfile type="date" filename="/var/log/amazon/ssm/errors.log" datepattern="20060102" maxrolls="7"/>
    </filter>
</outputs>

datepattern="20060102"がかなり謎なのですが、Golangで簡単にログを吐くことを考えるによると、GolangのTimeフォーマットがこうなっているとのこと。yyyymmddとかならわかるのですがなぜ2006年1月2日なのかよくわかりませんが、そういうもののようです。

まとめ

SSMエージェントはデフォルトで「SSM エージェント ログファイルの Amazon CloudWatch Logs への送信」のように、awslogsエージェントに頼ること無く自力でログをCloudWatch Logsへ転送することができます。

ですので、ローカルにログファイルをきっちり保持する必要はあまりないのかもしれませんが、これでローテーションを制御することができました。