web-dev-qa-db-ja.com

loggerコマンドを使用してLinuxの特定のファイルにログインするにはどうすればよいですか?

次のスクリプトを実行します。

#!/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コマンドをどのように変更する必要がありますか?

12
alwbtc

これにlogger/syslogを実際に関与させる必要がある(または関与したくない)とは思いません。スクリプトの最後の行を次のように置き換えるだけです。

echo "Exit code of my program is $exitvalue" >> /some/file/that/you/can/write/to
9
twalberg

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
4
tgharold

短い「公式」の答えは、残念ながら、あなたはできないということです。

ただし、ほとんどの場合(たとえば、多くの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インターフェース( loggersyslog() )にアドホックアウトレット/ファシリティパラメーター(ファイル名など)を指定する方法がある場合です。メッセージなので、システムを再構成せずにカスタムファイルにログインできます(通常のユーザーにはとにかく行う権限がありません)。

ただし、これ以上の機能がないため、「正規の」Linux loggerimplementation は実際にはsyslog機能の一部を複製しているように見えるため、ほとんどの人はその贅沢を無料で楽しむことができます。 。 ;)

4
Sz.
$ man logger

Loggerは、syslog(3)システムログモジュールへのシェルコマンドインターフェイスを提供します。

他の場所にログを記録する場合は、syslog構成を変更する必要があります。たとえば、ホームディレクトリに出力ファイルがある特定のfacilityを確立できます。ただし、それを行うにはルートである必要があります。

3
Jeff Ferland

loggerを使用して、メッセージがシステムログとファイルの両方に表示されるようにする場合は、次のようにします。

  logger -s your message 2> $HOME/somefile

logger-sオプションもstderrに出力されるため、2>でファイルにリダイレクトされます。

cat - witchを使用して出力をエコーすると、>> [file]witchが出力をターミナルの[file]インセットに出力するため、コマンドは次のようになります。

cat - >> [file]

欠点は、ctrl + Cまたはctrl + Zを使用して終了する必要があることです。loggerはオンラインコードに適しています

0
lucas

スクリプトファイルの上に、次のような小さなロガー関数を作成できます。

#! /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
0
ravi katiyar