次のスクリプトを実行します。
#!/bin/bash
./myprogram
#get exit code
exitvalue=$?
#log exit code value to /var/log/messages
logger -s "exit code of my program is " $exitvalue
しかし、root権限がないため、ログメッセージを/var/log/messages
に書き込みたくありません。代わりに、ホームディレクトリ内のファイルに書き込む必要があります:/home/myuser/mylog
上記のlogger
コマンドをどのように変更する必要がありますか?
これにlogger
/syslog
を実際に関与させる必要がある(または関与したくない)とは思いません。スクリプトの最後の行を次のように置き換えるだけです。
echo "Exit code of my program is $exitvalue" >> /some/file/that/you/can/write/to
Syslogファイルに書き込みたくない(そして書き込みを行う権限がない)場合は、date
ではなくlogger
コマンドを使用する方がよいと思います。 。
date
を使用してメッセージの前に日付を付け、ファイルに書き込む方法の詳細については、「 エコーの前のタイムスタンプ "」を参照してください。
次のようなbash関数を作成し、date
フォーマット文字列を調整して必要なものを取得します。
echo_time() {
echo `date +'%b %e %R '` "$@"
}
次に、bashスクリプトで次を使用します。
echo_time "Your message here" >> ${LOGFILE}
これにより、${LOGFILE}
ファイルに次のようになります。
Mar 11 08:40 your message here
短い「公式」の答えは、残念ながら、あなたはできないということです。
ただし、ほとんどの場合(たとえば、多くのLinuxディストリビューション)、_--no-act
_オプションをサポートし、独自にいくつかのメッセージフォーマットを実装するlogger
実装があれば幸運です(を参照)。以下)、この場合、このような(適度に醜い)コマンドを使用して、a)適切にフォーマットされたメッセージ、b)ファイル、c)システムログを汚染しないようにすることができます。
_logger --no-act -s "Oh dear..." 2>&1 | sed 's/^<[0-9]\+>//' >> /tmp/my.log
_
(@ BasileStarynkevitchと@Kieveliに声をかけてください。どちらも以前にその一部について言及していましたが、全体ではありません。)
注:
1)通常のログファイル形式に一致させるために、取得した_<PRIVAL>
_フィールド(PRIVAL
= FACILITY
* 8 + PRIORITY
)を「sedoff」する必要がありました。 Debianボックスの出力の前に追加されます。あなたのマイレージは異なる場合があります。
2)POSIX自体はnotlogger
コマンドがそのオプション(のいずれか)をどの程度正確に処理するかを定義します。例えば。 GNUロガー は_--no-act
_をまったくサポートしていません。また、2年前にこの回答の元のバージョンを投稿したとき、私のシステムの_-s
_は印刷出力にフォーマットを行いませんでしたnot生のメッセージだけをエコーし、完全にレンダリングしました役に立たない。 (当時、Systemdを使用していなかったため、違いを説明できるかもしれません。ロガーのソースコードにさまざまな条件付きSystemd関連の呼び出しがありますが、これは漠然とした推測です。)
3)logger
コマンドがこの些細な使用例に対して「歴史的に不親切」である最も可能性の高い理由は、それがシステムロガーの非常に単純なフロントエンドであるためです。つまり、フィードしたものはすべて、基本的にsyslogd
(または_systemd-journald
_など)に送られ、さらに他のあらゆる種類の処理とディスパッチ(さまざまなアウトレットへの送信)が行われます。ファイル、ソケットなど、ローカルとリモートの両方)、およびブリッジング権限レベル(したがって、この例では、たとえば、syslog
または_user.log
_にログを記録できます。それらのファイルに直接書き込む権限)。
logger
がファイルに直接適切にログを記録できるようにするには、システムロガーの機能の一部とsyslog()
stdを(再)実装する必要があります。ライブラリ関数、またはそれは些細なエコーワンライナーよりもはるかに能力がありません(おそらく、上記のlogger
呼び出しよりも複雑ではありません!;))。いずれにせよ、それは悪い考えのようです。
より良い解決策は、POSIXインターフェース( logger 、 syslog() )にアドホックアウトレット/ファシリティパラメーター(ファイル名など)を指定する方法がある場合です。メッセージなので、システムを再構成せずにカスタムファイルにログインできます(通常のユーザーにはとにかく行う権限がありません)。
ただし、これ以上の機能がないため、「正規の」Linux logger
implementation は実際にはsyslog機能の一部を複製しているように見えるため、ほとんどの人はその贅沢を無料で楽しむことができます。 。 ;)
$ man logger
Loggerは、syslog(3)システムログモジュールへのシェルコマンドインターフェイスを提供します。
他の場所にログを記録する場合は、syslog構成を変更する必要があります。たとえば、ホームディレクトリに出力ファイルがある特定のfacilityを確立できます。ただし、それを行うにはルートである必要があります。
logger
を使用して、メッセージがシステムログとファイルの両方に表示されるようにする場合は、次のようにします。
logger -s your message 2> $HOME/somefile
logger
の-s
オプションもstderrに出力されるため、2>
でファイルにリダイレクトされます。
cat -
witchを使用して出力をエコーすると、>> [file]
witchが出力をターミナルの[file]
インセットに出力するため、コマンドは次のようになります。
cat - >> [file]
欠点は、ctrl + Cまたはctrl + Zを使用して終了する必要があることです。logger
はオンラインコードに適しています
スクリプトファイルの上に、次のような小さなロガー関数を作成できます。
#! /bin/bash
#LOG FILE location
log_file=/tmp/mylogfile.log
#the LOG function
LOG()
{
time=$(date '+%Y-%m-%d %H:%M:%S')
echo "$time"" >>> "$1 >>${log_file}
}
message= echo "test logger message"
#to send loggers to your log file use
LOG "my message logged to my log file with timestamp = ""$message"
出力を確認してください:
head -1 /tmp/mylogfile.log
2019-09-16 14:17:46 >>> my message logged to my log file with timestamp = test logger message