コマンドを実行するたびに、コマンド出力を新しい新しいファイルにリダイレクトするBashの1行があります。実行する各コマンドの出力を記録することが重要です。ls
ここでは、たとえば使用していますが、実際のコマンドはansible-playbook
他のコマンドである可能性が高いです。
$ ls -hl | tee logs/$(date "+%Y-%m-%d_%H:%M:%S").log
これは入力するのが面倒で覚えにくいですが、私が望むように動作します(毎秒2回以上コマンドを実行しない限り)。コマンドを複数回実行すると、/logs
フォルダにログが生成されます。例:
$ ls logs/
2018-12-21_10:28:20.log
2018-12-21_10:28:21.log
2018-12-21_10:31:11.log
2018-12-21_10:32:07.log
私が知りたいのは、同じか非常に似た効果を達成する私が知らない既存のBashコマンドがありますか?ログ名の形式は重要です(日付またはUnix epochを好む)。
答え1
これをシェル関数に変換します。
dolog () {
local logdir="${1:-$HOME/logs}"
mkdir -p "$logdir" &&
tee "$logdir/$(date "+%F_%T").log"
}
これは~/.bashrc
ファイルに移動し、次の新しい対話型シェルで有効になります。
この機能は2つの方法で使用できます。
utility | dolog
その後、出力が~/logs
。
utility | dolog /some/path
これにより、出力は以下の日付ファイルに保存されます/some/path
(.
現在のディレクトリへのログ保存を使用)。ディレクトリ/some/path
(または~/logs
最初の例)が存在しない場合、ディレクトリが作成されます。
もう少し高度なバージョンで、何らかの理由でデータをログファイルに書き込めない場合(ディレクトリを作成できない場合、またはログファイルを書き込めない場合)、データを標準出力に渡す方法に戻ります。これにより、ロギングの問題が発生してもパイプ処理されたコマンドは終了しません。
dolog () {
local logdir="${1:-$HOME/logs}"
mkdir -p "$logdir" && tee "$logdir/$(date "+%F_%T").log" || cat
}
例:
$ touch ~/logs # this creates a file in my home directory
$ ls -l | dolog
mkdir: /home/myself/logs: Not a directory
total 0
-rw-r--r-- 1 myself staff 0 Dec 21 13:08 logs