私のいくつかのシェルスクリプトからの出力をファイルに記録しようとしていますが、各行の前にタイムスタンプを追加したいと思います。私が理解したところ、それがlogger(1)
の目的ですが、出力を/ var/log/messagesに移動したくないので、ロガーを使用してこれが可能かどうかはわかりません。ちなみに私はDebianを使っています。
これを行うための最良の方法は何ですか?
-オリバー
ロガーの機能は、実際にはメッセージをsyslogにシャントすることです。デフォルトの設定では、タイムスタンプが付加され、ログが/ var/log/messagesに書き込まれますが、これは、ロガーの目的がタイムスタンプを付加することであるという意味ではありません。
これを処理する1つの方法は、ロガーを介してルーティングされたメッセージが特別なファイルに送られるようにsyslog構成を変更することです。ロガーに「-p」フラグを使用して、facility.priorityペア(おそらくユーザーの1つ[1。 .7]ファシリティ)、およびそのファシリティを特別なファイルに記録するようにsyslogdを構成します。
または、簡単なシェル関数を作成して、タイムスタンプを追加することもできます。
Bodacious:~ james$ timestamp () {
> f=`date`
> echo $f $*
> }
You have new mail in /var/mail/james
Bodacious:~ james$ timestamp a line of logs
Tue 18 Jan 2011 22:40:24 EST a line of logs
Bodacious:~ james$
私のシステムでは、これにより、シェルは出力行ごとに1回/ bin/dateをフォークします。これは非効率的ですが、おそらく小規模では許容できます。
私はそのようなものが必要でした、そしてグーグルは私をここに連れて行きました。 Syslogのようなものを使用することは、何かの時間を計ろうとするだけでは間違いなくやり過ぎであり、毎秒の印刷は非常に不便です。
これがうまく機能しているように見えるワンライナーです:
cmd | { while read R; do echo "$(date +%s) $R"; done }
そして、各行の作成にかかった時間を出力するバリアント:
cmd | { T=$(date +%s); while read R; do T2=$(date +%s); echo "$((T2-T)) $R"; T=$T2; done }
(これは秒を使用しており、おそらくそこに%Nを投入するのはそれほど難しくありませんが、そのレベルでは、シェルソリューションはおそらく適切なツールではありません。)
-t
を使用して各行にタグを付け、syslogサーバーにそのタグに基づいて別のファイルにフィルターをかけることができます。
(-f
フラグへの誤った参照を取り除くために編集されました)
各行の前に文字列を追加するコマンド? の答えを使用すると、これが最も簡単な解決策であることがわかりました。
cmd | sed "s/^/`date +'%a %b %d %k:%M:%S'` /"