純規の暇人趣味ブログ

首を突っ込んで足を洗う

systemd 236からはStandardOutput=fileでログをファイルに出力できる

      HimaJyun

タイトル通りの内容です。systemdで作ったserviceのログ(標準出力)をファイルに出力したい!みたいな奴の、少し新しめなやり方。

スポンサーリンク

先に結論

僕は長話が好きなので、急ぎの人のために先に結論を。

systemdのバージョン236以上からはStandardInput、StandardOutput、StandardErrorにfileを指定可能。

StanderdOutput=file:/absolute/pathみたいに指定する。

systemdのログをファイルに出力したい

みたいな要求、ありますよね?僕はあります。

もちろんsystemctl statusとかjournalctl使えばログ自体は見られるんですけど、ログ見るためにSSHログインしてコマンド打つのだるくない?

crontab時代に自分が何をやってるかも考えずに> /dev/nullとかしてたような悪い人にとってこの仕組みは素晴らしいのかもしれないが、僕はログファイルをSFTPでダウンロードしてエディタとかで読みたい派なのでファイルに出力してほしい。

やり方

こんな感じで、StandardOutputにfileというものが指定できるよ!

[Unit]
Description=test

[Service]
Type=oneshot
ExecStart=/bin/echo "test"
StandardOutput=file:/tmp/test.log
StandardError=file:/tmp/test.log

とっても簡単!せつめいふよう!!

ちなみに、StandardOutputでfileを指定すると逆にjournalには出力されなくなる。journal+consoleみたいな組み合わせはできるが、journal+fileは無理だった。

それと、当然ながらログローテーションなどはされないので、そこは自分で設定する必要がある。

古い方法

これは古い方法。大人の事情で新しいsystemdが使えない人向け。

[Unit]
Description=test

[Service]
Type=oneshot
ExecStart=/bin/sh -c '/bin/echo "test" >> /tmp/test.log 2>&1'

コマンドを/bin/shとかで起動して、そのままリダイレクトでファイルに出力している。邪悪な気がする。やりたくない。

使えるか確かめる

systemd --versionをしてみれば分かる、バージョンが236より新しければ使える。

参考までに、Ubuntu 18.04は対応しており、16.04は非対応。Raspbian Stretchは無理だった。ベースが同じだからDebianも多分無理じゃないかな?RHELは知らん、多分無理。

今(2019/02/01)はUbuntu 18.04くらいしか使える場面がないが、将来的にはバージョン気にせず使えるようになると思う。

参考

この記事は先人の情報を焼き直した邪悪な記事です。

 - サーバー