大量のログデータをに印刷するアプリケーション/スクリプトがあるとしますstdout
。スクリプトで予想される悪い状況(例外処理)が発生すると、スクリプトはエラーを報告してから何もしませんstderr
。
systemd
もちろん、このデータを収集して次の場所に配置できますjournal
。
# systemctl show sd_test.service | grep 'Standard[OE]'
StandardOutput=journal
StandardError=inherit
私のものsd_test.service
:
[Unit]
Description=A Test Service simply printing to stdout and stderr
[Service]
Type=simple
ExecStart=/home/narunas/sd_test.py
[Install]
WantedBy=multi-user.target
journalctl
今必要なデータがあります。
# systemctl reenable sd_test.service
# systemctl restart sd_test.service
# journalctl -n -u sd_test
-- Logs begin at Fri 2016-11-11 15:49:33 GMT, end at Tue 2017-01-03 19:23:18 GMT. --
Jan 03 19:23:01 dev-box sd_test.py[13183]: This is "stderr": 2
Jan 03 19:23:02 dev-box sd_test.py[13183]: This is "stdout": 2
Jan 03 19:23:03 dev-box sd_test.py[13183]: This is "stderr": 3
Jan 03 19:23:07 dev-box sd_test.py[13183]: This is "stdout": 3
Jan 03 19:23:07 dev-box sd_test.py[13183]: This is "stderr": 4
Jan 03 19:23:11 dev-box sd_test.py[13183]: This is "stdout": 4
Jan 03 19:23:12 dev-box sd_test.py[13183]: This is "stderr": 5
Jan 03 19:23:15 dev-box sd_test.py[13183]: This is "stdout": 5
Jan 03 19:23:17 dev-box sd_test.py[13183]: This is "stdout": 6
Jan 03 19:23:18 dev-box sd_test.py[13183]: This is "stderr": 6
残念ながら、同じラベルのジャーナル_TRANSPORT
フィールドがあることを知っています。stderr
標準出力
サービスの標準出力またはエラー出力から読み取る場合
私は間違いなく私のExecStart
外観を変えることができます。
ExecStart=/bin/bash -c '/home/narunas/sd_test.py 2> /some/file/path'
journal
しかし、ファイルをめちゃくちゃにするので理想的ではありません...
stderr
ログだけを見るより良い方法をお勧めできますか?
編集_1
コメントで提案されているように、今すぐ-o verbose
オプションを試しました。
Tue 2017-01-03 20:23:49.994171 GMT [s=0b15e5c69e2f476eb200d2bdda769465;i=12e28;b=db55b41f61144ae69cc86acfb75209fb;m=42e034d52dc;t=5453672322abb;x=8b696c5447bc2bce]
PRIORITY=6
_UID=0
_GID=0
_CAP_EFFECTIVE=3fffffffff
_SYSTEMD_SLICE=system.slice
_BOOT_ID=db55b41f61144ae69cc86acfb75209fb
_MACHINE_ID=c5a9e78e2c854065a9b041c58f07c2b2
_HOSTNAME=dev-box
SYSLOG_FACILITY=3
_TRANSPORT=stdout
SYSLOG_IDENTIFIER=sd_test.py
_COMM=python3
_EXE=/usr/bin/python3.5
_CMDLINE=python3 /home/narunas/sd_test.py
_SYSTEMD_CGROUP=/system.slice/sd_test.service
_SYSTEMD_UNIT=sd_test.service
MESSAGE=This is "stdout": 729
_PID=13183
Tue 2017-01-03 20:23:52.979981 GMT [s=0b15e5c69e2f476eb200d2bdda769465;i=12e29;b=db55b41f61144ae69cc86acfb75209fb;m=42e037ae22e;t=54536725fba0d;x=8802c0df56848907]
PRIORITY=6
_UID=0
_GID=0
_CAP_EFFECTIVE=3fffffffff
_SYSTEMD_SLICE=system.slice
_BOOT_ID=db55b41f61144ae69cc86acfb75209fb
_MACHINE_ID=c5a9e78e2c854065a9b041c58f07c2b2
_HOSTNAME=dev-box
SYSLOG_FACILITY=3
_TRANSPORT=stdout
SYSLOG_IDENTIFIER=sd_test.py
_COMM=python3
_EXE=/usr/bin/python3.5
_CMDLINE=python3 /home/narunas/sd_test.py
_SYSTEMD_CGROUP=/system.slice/sd_test.service
_SYSTEMD_UNIT=sd_test.service
MESSAGE=This is "stderr": 745
_PID=13183
-o json-pretty
と同じ結果を生成します-o verbose
が、型が異なります。
私の台本が愚かであることを除いて情報stderr
何が何であるかを区別するのに役立つものは何もありませんstdout
。
編集_2
そしてStandardError=journal
。
単位:
[Unit]
Description=A Test Service simply printing to stdout and stderr
[Service]
Type=simple
ExecStart=/home/narunas/sd_test.py
StandardError=journal
[Install]
WantedBy=multi-user.target
ログ制御:
# systemctl reenable sd_test.service
# systemctl restart sd_test.service
# journalctl -n -u sd_test -o verbose
Tue 2017-01-03 22:34:55.381341 GMT [s=0b15e5c69e2f476eb200d2bdda769465;i=13ab7;b=db55b41f61144ae69cc86acfb75209fb;m=42fd81d9b7e;t=545384702735d;x=e65570c85dfec1dc]
_TRANSPORT=stdout
PRIORITY=6
SYSLOG_FACILITY=3
SYSLOG_IDENTIFIER=sd_test.py
_UID=0
_GID=0
_COMM=python3
_EXE=/usr/bin/python3.5
_CMDLINE=python3 /home/narunas/sd_test.py
_CAP_EFFECTIVE=3fffffffff
_SYSTEMD_CGROUP=/system.slice/sd_test.service
_SYSTEMD_UNIT=sd_test.service
_SYSTEMD_SLICE=system.slice
_BOOT_ID=db55b41f61144ae69cc86acfb75209fb
_MACHINE_ID=c5a9e78e2c854065a9b041c58f07c2b2
_HOSTNAME=dev-box
MESSAGE=This is "stdout": 10
_PID=21280
Tue 2017-01-03 22:34:57.397880 GMT [s=0b15e5c69e2f476eb200d2bdda769465;i=13ab8;b=db55b41f61144ae69cc86acfb75209fb;m=42fd83c6099;t=5453847213878;x=610237e701d596d4]
_TRANSPORT=stdout
PRIORITY=6
SYSLOG_FACILITY=3
SYSLOG_IDENTIFIER=sd_test.py
_UID=0
_GID=0
_COMM=python3
_EXE=/usr/bin/python3.5
_CMDLINE=python3 /home/narunas/sd_test.py
_CAP_EFFECTIVE=3fffffffff
_SYSTEMD_CGROUP=/system.slice/sd_test.service
_SYSTEMD_UNIT=sd_test.service
_SYSTEMD_SLICE=system.slice
_BOOT_ID=db55b41f61144ae69cc86acfb75209fb
_MACHINE_ID=c5a9e78e2c854065a9b041c58f07c2b2
_HOSTNAME=dev-box
MESSAGE=This is "stderr": 11
_PID=21280
Tue 2017-01-03 22:35:02.403014 GMT [s=0b15e5c69e2f476eb200d2bdda769465;i=13abc;b=db55b41f61144ae69cc86acfb75209fb;m=42fd888bfe7;t=54538476d97c6;x=a6362820cb52ce9]
_TRANSPORT=stdout
PRIORITY=6
SYSLOG_FACILITY=3
SYSLOG_IDENTIFIER=sd_test.py
_UID=0
_GID=0
_COMM=python3
_EXE=/usr/bin/python3.5
_CMDLINE=python3 /home/narunas/sd_test.py
_CAP_EFFECTIVE=3fffffffff
_SYSTEMD_CGROUP=/system.slice/sd_test.service
_SYSTEMD_UNIT=sd_test.service
_SYSTEMD_SLICE=system.slice
_BOOT_ID=db55b41f61144ae69cc86acfb75209fb
_MACHINE_ID=c5a9e78e2c854065a9b041c58f07c2b2
_HOSTNAME=dev-box
MESSAGE=This is "stderr": 12
_PID=21280
答え1
ㅏこの機能を実装するためのプール要求現在審査中です。
また、デフォルトで実行されるスクリプトを制御する場合は、次のものを使用できます。Pythonシステムモジュールは、目的の優先順位とオプションを使用してスクリプトからログにメッセージを送信します。
答え2
メッセージの前に<を付けると優先事項>あなたのメッセージはこの優先順位に従ってログに記録されます。レベル、簡単な説明、およびいくつかの使用例を含むリストを見つけることができます。このリンクから。
マイコンピュータでこのコードをコンパイルしてください。
#include <cstdio>
#include <thread>
#include <chrono>
const char* pri_msg[] {
"EMERGENCY",
"ALERT",
"CRITICAL",
"ERROR",
"WARNING",
"NOTICE",
"INFO",
"DEBUG"
};
int main(){
int pri = 0;
while(true) {
std::printf("<%d>Test service priority level: %s", pri, pri_msg[pri]);
pri = ++pri % 8;
std::this_thread::sleep_for(std::chrono::seconds(5));
}
}
そしてそれをシステムサービスとして実行すると、各メッセージは優先順位に従ってログに書き込まれます。
その後、次のように検索できますjournalctl -u *your-service* -p *priority-level*
。
$ journalctl -u testd -p 3
-- Logs begin at mer 2020-10-21 17:31:13 CEST, end at ven 2020-10-23 16:01:01 CEST. --
ott 23 15:57:30 legion testd[21967]: Test service priority level: EMERGENCY
ott 23 15:57:35 legion testd[21967]: Test service priority level: ALERT
ott 23 15:57:40 legion testd[21967]: Test service priority level: CRITICAL
ott 23 15:57:45 legion testd[21967]: Test service priority level: ERROR
ott 23 15:58:10 legion testd[21967]: Test service priority level: EMERGENCY
ott 23 15:58:15 legion testd[21967]: Test service priority level: ALERT
ott 23 15:58:20 legion testd[21967]: Test service priority level: CRITICAL
ott 23 15:58:25 legion testd[21967]: Test service priority level: ERROR
ott 23 15:58:50 legion testd[21967]: Test service priority level: EMERGENCY
ott 23 15:58:55 legion testd[21967]: Test service priority level: ALERT
ott 23 15:59:00 legion testd[21967]: Test service priority level: CRITICAL
あなたの場合<3>
(std::cerr
またはfprintf(stderr, ...)
。