syslogdとlogrotatedを使ってシェルログを出力&ローテートする
最終更新日:2020/11/19 | 公開日:2013/10/30
目次
概要
シェルスクリプトを作成するに当たって、処理の進行状況や処理結果をログファイルに記録するために echo コマンドでファイルにメッセージを書き出すことがあります。
echo "Apache started." >> /var/log/shell.log
しかし、複数のシェルスクリプトから同一ファイルに同時に書き込みを行うと、 ファイルのオープン処理が競合して、正しく書けないことがあります(希ですが)。 そこで、syslogdを使用してシスログと同様にログの出力を行うように設定します。
構成
サーバ構成
OSバージョン
Red Hat Enterprise Linux 5.9 x86_64
パッケージ一覧
sysklogd-1.4.1-46.el5
logrotate-3.7.4-14
※標準でインストールされるため追加パッケージなし
環境構築
syslogd設定
syslogdの設定ファイル編集
syslogdの設定を行います。 シェルのログファイル名は /var/log/shell.log とします。 出力時のファシリティは local2 を使います。 ファシリティはlocal0~7、userなど何でも良いですが、 他で使われていなさそうな local2 を選択しました。 また、全プライオリティを shell.log ファイルに出力します。
# cd /etc/ # vi syslog.conf
ファイル名:/etc/syslog.conf
※ファイルの末尾に追記※ # Save boot messages also to boot.log local7.* /var/log/boot.log # Shell Log ←追記 local2.* /var/log/shell.log ←追記
syslogdの再起動
設定ファイルの変更を反映させるためにsyslogdを再起動します。
# service syslog restart カーネルロガーを停止中: [ OK ] システムロガーを停止中: [ OK ] システムロガーを起動中: [ OK ] カーネルロガーを起動中: [ OK ]
logrotated設定
ログファイルは放っておくと増え続けてしまうので、 logrotatedを使用して1週間に1回ローテートします。 ローテートされたログの保持期間は 7 x 13 = 91日間(約3ヶ月間)とします。
# cd /etc/logrotate.d/ # vi syslog
ファイル名:/etc/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log
/var/log/cron { ←実際には改行はありません sharedscripts | |変更 ↓ /var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log
/var/log/cron /var/log/shell.log { ←実際には改行はありません weekly ←追加(前回のローテートから1週間以上経過したらローテート) rotate 13 ←追加(バックアップを13世代保持する) missingok ←追加(対象のファイルがなくてもエラーにしない) sharedscripts
動作テスト
syslogdを使用してログファイルにメッセージを書き出すには logger コマンドを使用します。
# logger -t start.sh -p local2.err "This is test message." # tail /var/log/shell.log Oct 30 21:45:15 server1 start.sh: This is test message.
利用方法
シェルスクリプト内でログを出力したい場所に以下のコマンドを記述します。
logger -t <シェル名> -p local2.<プライオリティ> "<出力したいメッセージ>"