コマンドが実行されるたびに、Bash 出力が新しいファイルにリダイレクトされます。

コマンドが実行されるたびに、Bash 出力が新しいファイルにリダイレクトされます。

コマンドを実行するたびに、コマンド出力を新しい新しいファイルにリダイレクトする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

関連情報