🍺

シェルスクリプトでログ出力

2021/12/05に公開

「exec」 コマンドで、シェルスクリプトのリダイレクト先を変更することができます。
その恩恵で、標準出力・標準エラー出力を全てログに流し込みたかったり、標準エラーだけ流したかったり・・・という願いが叶います。

exec &>

「exec &>」 で 標準出力・標準エラー出力 を全てログへ流すようにしてみます。

テストスクリプト

#!/bin/bash
### ログファイル
log=/usr/local/var/log/gorira/$(date '+%Y%m%d-%H%M%S').log

### 日時付きでログファイルへ流し込みます
exec &> >(awk '{print strftime("[%Y/%m/%d %H:%M:%S] "),$0 } { fflush() } ' >> $log)

pwd
ls -l naiyo
ls -l aruyo

実行結果

  • ログ(標準出力・標準エラー出力)
[2021/12/04 09:23:52]  /home/gorira
[2021/12/04 09:23:52]  ls: cannot access 'naiyo': No such file or directory
[2021/12/04 09:23:52]  -rw-r--r-- 1 root root 0 12 4 09:13 aruyo

exec 1>

「exec 1>」 で 標準出力 をログへ流すようにしてみます。

テストスクリプト

#!/bin/bash
log=/usr/local/var/log/gorira/$(date '+%Y%m%d-%H%M%S').log

exec 1> >(awk '{print strftime("[%Y/%m/%d %H:%M:%S] "),$0} {fflush()}' >>$log)

pwd
ls -l naiyo
ls -l aruyo

実行結果

  • ログ (標準出力)
[2021/12/04 09:25:55]  /home/gorira
[2021/12/04 09:25:55]  -rw-r--r-- 1 root root 0 12 4 09:13 aruyo
  • 画面 (標準エラー出力)
ls: cannot access 'naiyo': No such file or directory

exec 2>

「exec 2>」 で 標準エラー出力 をログへ流すようにしてみます。

テストスクリプト

#!/bin/bash
log=/usr/local/var/log/gorira/$(date '+%Y%m%d-%H%M%S').log

exec 2> >(awk '{print strftime("[%Y/%m/%d %H:%M:%S] "),$0} {fflush()}' >>$log)

pwd
ls -l naiyo
ls -l aruyo

実行結果

  • ログ (標準エラー出力)
[2021/12/04 09:33:57]  ls: cannot access 'naiyo': No such file or directory
  • 画面 (標準出力)
/home/gorira
-rw-r--r-- 1 root root 0 12 4 09:13 aruyo

ついでに

ログ出力と同内容を画面にも表示させたい場合は、「tee」 コマンドに食わせます。

テストスクリプト

#!/bin/bash
log=/usr/local/var/log/gorira/$(date '+%Y%m%d-%H%M%S').log

### tee に食わせる
exec &> >(awk '{print strftime("[%Y/%m/%d %H:%M:%S] "),$0} {fflush()}' | tee -a $log)

pwd
ls -l naiyo
ls -l aruyo

実行結果

  • ログ
[2021/12/04 09:36:05]  /home/gorira
[2021/12/04 09:36:05]  ls: cannot access 'naiyo': No such file or directory
[2021/12/04 09:36:05]  -rw-r--r-- 1 root root 0 12 4 09:13 aruyo
  • 画面
[2021/12/04 09:36:05]  /home/gorira
[2021/12/04 09:36:05]  ls: cannot access 'naiyo': No such file or directory
[2021/12/04 09:36:05]  -rw-r--r-- 1 root root 0 12 4 09:13 aruyo

Discussion