bash:標準出力も標準エラーもログに出力

  • 32
    いいね
  • 0
    コメント

障害対応時などの一刻を争う調査などの際、この挙動にハマってしまって対応が遅れるケースを見てきたんで共有です。

test.sh

sonna_file_naiyo.txtが存在しないとして

#!/bin/sh

echo "foo"
cat ./sonna_file_naiyo.txt
echo "bar"

で、このスクリプトを

teeでロギングしちゃうよ!

$ sh ./test.sh | tee test.log
foo
cat: ./sonna_file_naiyo.txt: No such file or directory
bar

logの中身を見てみるよ!

$ cat ./test.log 
foo
bar

(´・ω・`) 標準エラー出力がファイルに吐かれてないお・・・なぜだお・・・

標準出力&標準エラーどちらもロギングする場合

標準エラー出力を標準出力にリダイレクトする方法を検討しましょ

$ sh ./test.sh 2>&1 | tee test.log
foo
cat: ./sonna_file_naiyo.txt: No such file or directory
bar

確認するよ!

$ cat ./test.log 
foo
cat: ./sonna_file_naiyo.txt: No such file or directory
bar

(∩´∀`)∩ワーイ

teeではなくファイルへのリダイレクトを使う場合

>>>でファイルへ出力するケースもあると思います。

その際にも同様にリダイレクトを行いますが、どこに記述するかについて慎重になるべきです

$ sh ./test.sh > test.log 2>&1

$ cat test.log 
foo
cat: ./sonna_file_naiyo.txt: No such file or directory
bar

上記は想定通りの挙動例

指定の順番や位置を間違えると

意図しない状況になりますので注意です

$ sh ./test.sh | tee test.log 2>&1
foo
cat: ./sonna_file_naiyo.txt: No such file or directory
bar

$ cat test.log 
foo
bar
$ sh ./test.sh 2>&1 > test.log
cat: ./sonna_file_naiyo.txt: No such file or directory

$ cat test.log 
foo
bar

(´・ω・`)結構ハマりやすいと思うので、注意したいですね(自戒)