15

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

#!/bin/bash
./myprogram

#get exit code
exitvalue=$?

#log exit code value to /var/log/messages
logger -s "exit code of my program is " $exitvalue

/var/log/messagesしかし、 root 権限がないので、ログ メッセージを書き込みたくありません。代わりに、ホーム ディレクトリのファイルに書き込みたい:/home/myuser/mylog

logger上記のコマンドをどのように変更すればよいですか?

4

7 に答える 7

10

私はあなたが本当にこれにlogger/syslogを巻き込む必要がある (または巻き込みたい) とは思わない。スクリプトの最後の行を次のように置き換えるだけです。

echo "Exit code of my program is $exitvalue" >> /some/file/that/you/can/write/to
于 2012-11-16T20:08:27.407 に答える
9

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

  logger -s your message 2> $HOME/somefile

でファイルにリダイレクトされるstderrにも出力する-sオプションがあるためlogger2>

(リダイレクトについて読む2>> $HOME/somefile) を追加する (上書きしない)ために使用したり、(詳細についてはlogger(1)を参照) にプログラム オプションを渡すことをお勧めします。$HOME/somefilebash--id=$$logger

于 2012-11-16T20:39:15.340 に答える
7

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

ただし、ほとんどの場合 (多くの Linux ディストリビューションなど) 、このオプションをloggerサポートし、--no-actメッセージの書式設定を独自に実装する (以下を参照) 実装を使用できる幸運な場合があります。 a) 適切にフォーマットされたメッセージ、b) ファイルへの書き込み、c) システムログを汚染しないための、このようなコマンド:

logger --no-act -s "Oh dear..." 2>&1 | sed 's/^<[0-9]\+>//' >> /tmp/my.log

(@BasileStarynkevitch と @Kieveli に声をかけてください。両方とも以前にその一部について言及しましたが、全体の話ではありません。)

ノート:

1) 通常のログ ファイル形式に合わせるために、Debian ボックスの出力の先頭に追加された<PRIVAL>フィールド ( PRIVAL= FACILITY* 8 + )を「sed off」する必要がありました。PRIORITYあなたのマイレージは異なる場合があります。

2) POSIX 自体は、コマンドがそのオプション (のいずれか) をどのように正確に扱うべきかを定義していません。loggerたとえば、GNU ロガーはまったくサポート--no-actしていません。また、2 年前にこの回答の元のバージョンを投稿したとき、-s私のシステムでは印刷出力に書式設定を行わ、生のメッセージだけをエコーし​​て、完全に役に立たなくしました。(当時は Systemd を使用していませんでした。ロガーのソース コードにさまざまな条件付きの Systemd 関連の呼び出しが見られるため、違いが説明できるかもしれませんが、これは漠然とした推測にすぎません。)

3) コマンドがこの些細な使用例に対して「歴史的に不親切」であった理由として最も可能性が高いloggerのは、それがシステム ロガーのかなり単純なフロントエンドであるということです。これは、基本的にそれにフィードするものはすべてsyslogd(またはsystemd-journaldなど) に直接送信され、さらにあらゆる種類のその他の処理とディスパッチ (さまざまなアウトレット: ファイル、ソケットなど、ローカルとリモートの両方)を行うことを意味します。 、およびアクセス許可レベルをブリッジします(したがって、たとえば、これらのファイルに直接書き込む権限がない場合でも、この例ではsyslogまたはにログインできます)。user.log

ファイルに直接適切にログを記録できるようにするにはlogger、システム ロガーの機能の一部とsyslog()std. ライブラリ関数、またはそれは簡単なエコーワンライナーよりもはるかに機能的ではありません(おそらく、上記のlogger呼び出しよりも複雑ではありません! ;) )。いずれにせよ、それは悪い考えのようです。

より良い解決策は、POSIX インターフェイス ( loggersyslog() ) にメッセージとともにアドホック アウトレット/ファシリティ パラメータ (ファイル名など) を指定する方法があり、システムを再構成せずにカスタム ファイルにログを記録できる場合です。 (とにかく、通常のユーザーには許可がありません)。

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

于 2017-01-14T14:41:06.537 に答える
3
$ man logger

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

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

于 2012-11-16T19:49:41.587 に答える