特定のデバイスのログ出力を特定のファイルとして指定するにはどうすればよいですか?

特定のデバイスのログ出力を特定のファイルとして指定するにはどうすればよいですか?

Arch Linuxのログにログ情報を出力する複数のデーモン(systemdデバイス)を実行するシステムがあります。これらのユニットファイルの一部のログ出力を、私が指定した場所にある別のテキストファイルとして指定して、デフォルトでユニットのサブセットのログファイルを生成したいと思います。どうすればいいですか?

答え1

修正する:これは実際には最新のsystemdバージョン(systemd 236ベース)で可能です。バラよりシステムランチャー~のため標準出力そして標準エラー祭典。これは次のオプションをサポートします(抜粋):

これファイルパスオプションを使用して、特定のファイルシステムオブジェクトを標準出力に関連付けることができます。セマンティクスはStandardInput =と同じオプションに似ています(上記を参照)。パスがファイルシステムの通常のファイルを参照している場合は、ファイルの先頭に書き込むために開かれますが(存在しない場合は作成されます)、切り捨てられません。標準入力と出力が同じファイルパスで指定されている場合は、読み取り、書き込み、コピーのために一度だけ開きます。これは、指定されたパスがファイルシステムのAF_UNIXソケットを参照するときに特に便利です。これは、入力と出力に対して単一のストリーム接続のみが生成されるためです。

追加:パス上記のfile:pathに似ていますが、ファイルを追加モードで開きます。

トリミング:パス上記のファイル:パスに似ていますが、ファイルを開くとファイルが切り捨てられます。複数のExecStart =を持つType = oneshotサービス、またはExecCondition =、ExecStartPre =、またはExecStartPost =を持つサービスなど、複数のコマンドラインを持つデバイスの場合は、出力ファイルが再度開くため、各コマンドラインに対して再度切り捨てられます。出力ファイルが切り捨てられ、他のプロセスでまだファイルが開いている場合(たとえば、ExecReload =をExecStart =と同時に実行している場合)、他のプロセスがオフセットを調整せずにファイルに書き込みを続ける場合、ファイルへのファイルポインタは次のようになります。 2 つのプロセス間のスペースが NUL バイトで埋められ、ファイルがリーンになる可能性があります。したがって、 truncate:path は通常、単一の ExecStart= があり、ExecStartPost=、ExecReload=、ExecStop=、または同様のサービスを持たないサービスなど、一度に 1 つのプロセスのみを実行するデバイスにのみ適しています。

[...]

これFD:名前オプションは、標準出力をソケットデバイスによって提供される特別に名前付きファイル記述子に接続します。名前はこのオプションの一部として指定でき、その後に「:」文字が続きます(例:「fd:foobar」)。名前が指定されていない場合は、「stdout」という名前が暗示されます(例:「fd」は「fd:stdout」と同じです)。指定された名前を定義する1つ以上のソケットユニットは、Sockets =オプションで指定する必要があり、ファイル記述子名は含まれるソケットユニットの名前と異なる場合があります。一致するものが複数見つかった場合、最初の一致が使用されます。名前付き記述子とその順序の詳細については、systemd.socket(5)のFileDescriptorName =を参照してください。

元の答え:

これは不可能で、アップストリームを必要としないようです(stdout / stderrを単一のファイルにリダイレクト)。たとえば、次を参照してください。http://lists.freedesktop.org/archives/systemd-devel/2012-March/004705.html- これがどのように機能するかについては、スレッド全体を読んでください。

あなたができることは、syslogに書き込んで単一のファイルに書き込むことです。または、逆にデバイスがログ自体を記録できるプログラムをいくつか呼び出す場合は、そのプログラムを使用してファイルに書き込みます。

また、見たいと思うかもしれませんsystemd サービスの stdout/stderr ビュー

現在の設定ですでにできることは、
journalctl -u yourunitname > yourlogfile_for_yourunitname
「yourunitname」ユニットのログ出力全体をファイルに送信することです。

後半では、上記のメーリングリストスレッドのLennartのヒントも見てください。

最近のシステムバージョンでは、このようなものはsystemd-journalctl -o cat _SYSTEMD_UNIT=postgresql.service実際のメッセージのみを含み、他のものは含まない非常に単純な出力を生成する必要があります。 「-f」を渡して適用することもできます。 」

編集する: 実際、最新のシステムバージョンでは、コマンドは次のようになります。ログ制御私が知る限り、上記の長いコマンドは同じで、出力に「従う」こともjournalctl -u yourunitnameできます-f(tailfまたはtail -fのように)。

関連情報