🍺
シェルスクリプトでログ出力
「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