systemdサービスは他のログファイルにリダイレクトされません。

systemdサービスは他のログファイルにリダイレクトされません。

以下にシステムサービスがありますが、アプリケーション/サービス出力を別のファイルにリダイレクトしようとすると機能しません。システムサービスでログファイルを定義しましたが、デフォルトではログは/var/log/messagesにリダイレクトされます(StandardOutput=file:/var/log/mylogfile.logおよびStandardError=file:/var/log/mylogerror。ログ)

この問題を解決するには助けが必要です。

オペレーティングシステム:CentOS 7

rsyslog: サービスが実行中です。

[Unit]
Description=my-apps
After=network.target

[Service]
User=root
Group=root
EnvironmentFile=/apps/config
WorkingDirectory=/apps
Environment="PATH=/apps/pyenv/bin/activate"
ExecStart=/apps/pyenv/bin/python /apps/mycode.py

StandardOutput=file:/var/log/mylogfile.log
StandardError=file:/var/log/mylogerror.log

答え1

StandardOutput=file:...CentOS 7(バージョン219)のsystemdバージョンは/構文をサポートしておらず、StandardError=file:...systemdバージョン236にのみ追加されました。

StandardOutput=
     Controls where file descriptor 1 (STDOUT) of the executed processes is connected to. Takes one of inherit, null, tty, journal, syslog, kmsg, journal+console, syslog+console, kmsg+console or
           socket.

(CentOS 7のsystemd.execのマニュアルページから)

有効な値が指定されていないため、journalデフォルト値が使用され、ログはすべてをsyslogに渡します。

ジャーナルは、標準出力をジャーナルctl(1)を介してアクセスできるジャーナルに関連付けます。 syslogまたはkmsg(以下を参照)に記録されている内容はすべてログに暗黙的に保存されるため、以下に示す2つのオプションはこのオプションの親セットです。

ロギングに加えて、syslogは標準出力をsyslog(3)システムsyslogサービスに接続します。ロギングデーモンは通常、受信したすべてをsyslogに渡すように構成されています。この場合、このオプションはロギングと変わりません。

Pythonアプリケーションを変更できる場合は、Pythonを使用できます。ロギングモジュールファイルへのログ記録中:

import logging
logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')
logging.error('And non-ASCII stuff, too, like Øresund and Malmö')

関連情報