Logging bei Linux-Systemdiensten einschalten? [Gelöst]

Warum Debian und/oder eine seiner Spielarten? Was muss ich vorher wissen? Wo geht es nach der Installation weiter?
Antworten
jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Logging bei Linux-Systemdiensten einschalten? [Gelöst]

Beitrag von jmar83 » 02.05.2022 16:14:26

Hallo zusammen

Ist zwar nicht Debian, sondern Raspbian - dachte frage trotzdem mal hier nach... ;-)

Am Beispiel von NodeRED:

Code: Alles auswählen

  GNU nano 3.2                                                                           /lib/systemd/system/nodered.service

# systemd service file to start Node-RED

[Unit]
Description=Node-RED graphical event wiring tool
Wants=network.target
Documentation=http://nodered.org/docs/hardware/raspberrypi.html

[Service]
Type=simple
# Run as normal pi user - change to the user name you wish to run Node-RED as
User=root
Group=root
WorkingDirectory=/root

Environment="NODE_OPTIONS=--max_old_space_size=2048"
# uncomment and edit next line if you need an http proxy
#Environment="HTTP_PROXY=my.httpproxy.server.address"
# uncomment the next line for a more verbose log output
#Environment="NODE_RED_OPTIONS=-v"
# uncomment next line if you need to wait for time sync before starting
#ExecStartPre=/bin/bash -c '/bin/journalctl -b -u systemd-timesyncd | /bin/grep -q "systemd-timesyncd.* Synchronized to time server"'

ExecStart=/usr/bin/env node-red-pi $NODE_OPTIONS $NODE_RED_OPTIONS
#ExecStart=/usr/bin/env node $NODE_OPTIONS red.js $NODE_RED_OPTIONS
# Use SIGINT to stop
KillSignal=SIGINT
# Auto restart on crash
Restart=on-failure
RestartSec=20
# Tag things in the log
SyslogIdentifier=Node-RED
#StandardOutput=syslog
StandardOutput=/var/log/nodered-out-devlog.log
StandardError=/var/log/nodered-err-devlog.log

[Install]
WantedBy=multi-user.target

...zuerst haben ich die Zeile

Code: Alles auswählen

ExecStart=/usr/bin/env node-red-pi $NODE_OPTIONS $NODE_RED_OPTIONS
nach

Code: Alles auswählen

ExecStart=/usr/bin/env node-red-pi $NODE_OPTIONS $NODE_RED_OPTIONS > /var/log/nodered.log
abgeändert. Ging nicht. Keine Ahnung, waum.

Dann habe ich woanders gelesen, ich müsse

Code: Alles auswählen

#StandardOutput=syslog
(mindestens) auf

Code: Alles auswählen

StandardOutput=/var/log/nodered-out-devlog.log
oder gar

Code: Alles auswählen

StandardOutput=/var/log/nodered-out-devlog.log
StandardError=/var/log/nodered-err-devlog.log
abändern?
Zuletzt geändert von jmar83 am 03.05.2022 09:08:51, insgesamt 1-mal geändert.
Freundliche Grüsse, Jan

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Logging bei Linux-Systemdiensten einschalten?

Beitrag von jmar83 » 02.05.2022 16:18:40

Nach der Änderung der Service-Unit bekomme ich die Meldung:

Code: Alles auswählen

Warning: The unit file, source configuration file or drop-ins of nodered.service changed on disk. Run 'systemctl daemon-reload' to reload units.
Also soweit normal... also habe ich dann

Code: Alles auswählen

systemctl daemon-reload
eingegeben und dann erst

Code: Alles auswählen

systemctl restart nodered
ausgeführt.

Dann waren wie schon gesagt die Logfiles leer. Kann aber nicht sein, denn der NodeRED-Service gibt beim Start folgendes aus:

Code: Alles auswählen

root@xxx:/var/log# systemctl status nodered
● nodered.service - Node-RED graphical event wiring tool
   Loaded: loaded (/lib/systemd/system/nodered.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2022-05-02 16:15:58 CEST; 51s ago
     Docs: http://nodered.org/docs/hardware/raspberrypi.html
 Main PID: 31951 (node-red)
    Tasks: 11 (limit: 4915)
   CGroup: /system.slice/nodered.service
           └─31951 node-red

Mai 02 16:16:05 xxx Node-RED[31951]:     }
Mai 02 16:16:05 xxx Node-RED[31951]:   },
Mai 02 16:16:05 xxx Node-RED[31951]:   "profileMapping": {
Mai 02 16:16:05 xxx Node-RED[31951]:     "PHYSICAL_INTERACTION_DEFAULT": "PHYSICAL_INTERACTION_DEFAULT",
Mai 02 16:16:05 xxx Node-RED[31951]:     "VOICE_INTERACTION_DEFAULT": "VOICE_INTERACTION_DEFAULT",
Mai 02 16:16:05 xxx Node-RED[31951]:     "STATE_REPORT_DEFAULT": "STATE_REPORT_DEFAULT"
Mai 02 16:16:05 xxx Node-RED[31951]:   }
Mai 02 16:16:05 xxx Node-RED[31951]: }
Mai 02 16:16:05 xxx Node-RED[31951]: 2 May 16:16:05 - [info] [vsh-connection:xxx@gmail.com] MQTT message received on topic $aws/things/xxxx/shadow/get
Mai 02 16:16:11 xxx Node-RED[31951]: 2 May 16:16:11 - [info] [vsh-connection:xxx@gmail.com] MQTT publish to topic $aws/things/yyyy/shadow/update: {"st


-> Bin wieder mal 300% verwirrt. Da kann man offenbar machen was man will - funktionieren tut's letztendlich nie... :-(
Freundliche Grüsse, Jan

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Logging bei Linux-Systemdiensten einschalten?

Beitrag von jmar83 » 02.05.2022 16:22:01

Der Daemon läuft ja als root und sollte ja (eigentlich) das Recht haben, unter /var/log die in der Service-Unit deklarierten Logdatei(en) zu erstellen - auch wenn diese vorgängig (noch) nicht existieren?
Freundliche Grüsse, Jan

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Logging bei Linux-Systemdiensten einschalten?

Beitrag von JTH » 02.05.2022 16:42:19

jmar83 hat geschrieben: ↑ zum Beitrag ↑
02.05.2022 16:18:40
Bin wieder mal 300% verwirrt. Da kann man offenbar machen was man will - funktionieren tut's letztendlich nie... :-(
Doku lesen – Manpages oder Vergleichbares – hilft.

jmar83 hat geschrieben: ↑ zum Beitrag ↑
02.05.2022 16:14:26
nach

Code: Alles auswählen

ExecStart=/usr/bin/env node-red-pi $NODE_OPTIONS $NODE_RED_OPTIONS > /var/log/nodered.log
abgeändert. Ging nicht. Keine Ahnung, waum.
Warum sollte es denn gehen?

Code: Alles auswählen

kommando > /eine/datei.log
ist eine Umleitung in der Shell. ExecStart-Zeilen werden aber von systemd und nicht von oder in einer Shell ausgeführt. Das muss man, wenn man es braucht, von Hand selbst in der Zeile mit

Code: Alles auswählen

/bin/sh -c "kommando"
oder anders lösen. Ist hier aber nicht notwendig.

jmar83 hat geschrieben: ↑ zum Beitrag ↑
02.05.2022 16:18:40
(mindestens) auf

Code: Alles auswählen

StandardOutput=/var/log/nodered-out-devlog.log
oder gar

Code: Alles auswählen

StandardOutput=/var/log/nodered-out-devlog.log
StandardError=/var/log/nodered-err-devlog.log
abändern?
Ja, das ist der richtige, von systemd vorgesehene Ansatz, die Ausgaben in eine Datei umzuleiten. Ohne dass man dazu, wie oben erwähnt, die Umleitung einer Shell bemühen muss.

So ist die Zuweisung allerdings noch nicht ganz richtig: Man muss in der Zeile auch angeben, ob die Logdatei jedes Mal überschrieben werden soll oder die Meldungen angehängt werden sollen. Wie das geht, findest du im Absatz zu StandardOutput= mit man systemd.exec heraus.

Für StandardError muss man den Dateipfad nicht wiederholen, da reicht ein

Code: Alles auswählen

StandardError=inherit
Manchmal bekannt als Just (another) Terminal Hacker.

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Logging bei Linux-Systemdiensten einschalten?

Beitrag von jmar83 » 02.05.2022 16:44:08

Vielen Dank!! :THX: :THX: :THX:
Freundliche Grüsse, Jan

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Logging bei Linux-Systemdiensten einschalten?

Beitrag von jmar83 » 02.05.2022 16:53:00

Habe (rein aus Interesse) mal den "Hack" mit `/bin/sh -C "..."` versucht (aus meiner Sicht halt "wie gewohnt", z.B. wie bei Shell-Skripts):

Code: Alles auswählen

# systemd service file to start Node-RED

[Unit]
Description=Node-RED graphical event wiring tool
Wants=network.target
Documentation=http://nodered.org/docs/hardware/raspberrypi.html

[Service]
Type=simple
# Run as normal pi user - change to the user name you wish to run Node-RED as
User=root
Group=root
WorkingDirectory=/root

Environment="NODE_OPTIONS=--max_old_space_size=2048"
# uncomment and edit next line if you need an http proxy
#Environment="HTTP_PROXY=my.httpproxy.server.address"
# uncomment the next line for a more verbose log output
#Environment="NODE_RED_OPTIONS=-v"
# uncomment next line if you need to wait for time sync before starting
#ExecStartPre=/bin/bash -c '/bin/journalctl -b -u systemd-timesyncd | /bin/grep -q "systemd-timesyncd.* Synchronized to time server"'

#ExecStart=/usr/bin/env node-red-pi $NODE_OPTIONS $NODE_RED_OPTIONS

ExecStart=/bin/sh -c "/usr/bin/env node-red-pi $NODE_OPTIONS $NODE_RED_OPTIONS" > /var/log/nodered-devlog.log



#ExecStart=/usr/bin/env node $NODE_OPTIONS red.js $NODE_RED_OPTIONS
# Use SIGINT to stop
KillSignal=SIGINT
# Auto restart on crash
Restart=on-failure
RestartSec=20
# Tag things in the log
SyslogIdentifier=Node-RED
StandardOutput=syslog
#StandardOutput=/var/log/nodered-out-devlog.log
#StandardError=/var/log/nodered-err-devlog.log

[Install]
WantedBy=multi-user.target

Der Dienst startet zwar...

Code: Alles auswählen

root@xxx:/var/log# systemctl status nodered
● nodered.service - Node-RED graphical event wiring tool
   Loaded: loaded (/lib/systemd/system/nodered.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2022-05-02 16:47:26 CEST; 3min 58s ago
     Docs: http://nodered.org/docs/hardware/raspberrypi.html
 Main PID: 12917 (sh)
    Tasks: 12 (limit: 4915)
   CGroup: /system.slice/nodered.service
           ├─12917 /bin/sh -c /usr/bin/env node-red-pi $NODE_OPTIONS $NODE_RED_OPTIONS > /var/log/nodered-devlog.log
           └─12918 node-red

Mai 02 16:47:33 xxx Node-RED[12917]:     }
Mai 02 16:47:33 xxx Node-RED[12917]:   },
Mai 02 16:47:33 xxx Node-RED[12917]:   "profileMapping": {
Mai 02 16:47:33 xxx Node-RED[12917]:     "PHYSICAL_INTERACTION_DEFAULT": "PHYSICAL_INTERACTION_DEFAULT",
Mai 02 16:47:33 xxx Node-RED[12917]:     "VOICE_INTERACTION_DEFAULT": "VOICE_INTERACTION_DEFAULT",
Mai 02 16:47:33 xxx Node-RED[12917]:     "STATE_REPORT_DEFAULT": "STATE_REPORT_DEFAULT"
Mai 02 16:47:33 xxx Node-RED[12917]:   }
Mai 02 16:47:33 xxx Node-RED[12917]: }
Mai 02 16:47:33 xxx Node-RED[12917]: 2 May 16:47:33 - [info] [vsh-connection:xxx@gmail.com] MQTT message received on topic $aws/things/xxxx
Mai 02 16:47:38 xxx Node-RED[12917]: 2 May 16:47:38 - [info] [vsh-connection:xxx@gmail.com] MQTT publish to topic $aws/things/yyyy

Trotzdem existiert keine Datei /var/log/nodered-devlog.log:

Code: Alles auswählen

root@xxx:/var/log# cat /var/log/nodered-devlog.log
cat: /var/log/nodered-devlog.log: Datei oder Verzeichnis nicht gefunden
Zuletzt geändert von jmar83 am 02.05.2022 16:55:12, insgesamt 1-mal geändert.
Freundliche Grüsse, Jan

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Logging bei Linux-Systemdiensten einschalten?

Beitrag von jmar83 » 02.05.2022 16:53:43

Das hier hab ich wieder auf die Initialwerte zurückgesetzt:

Code: Alles auswählen

StandardOutput=syslog
#StandardOutput=/var/log/nodered-out-devlog.log
#StandardError=/var/log/nodered-err-devlog.log
Freundliche Grüsse, Jan

michaa7
Beiträge: 4632
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: Logging bei Linux-Systemdiensten einschalten?

Beitrag von michaa7 » 02.05.2022 17:10:03

Ich habe davon keine Ahnung, aber vielleicht gab es nicht logwürdiges.

Kannst ja mal den loglevel hochschrauben und laufenlassen:
# uncomment the next line for a more verbose log output
#Environment="NODE_RED_OPTIONS=-v"
Vllt hilft das:
https://nodered.org/docs/user-guide/runtime/logging
https://discourse.nodered.org/t/where-c ... gs/7698/10
Zuletzt geändert von michaa7 am 02.05.2022 17:17:37, insgesamt 1-mal geändert.
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Logging bei Linux-Systemdiensten einschalten?

Beitrag von jmar83 » 02.05.2022 17:11:26

Danke für's Feedback. Und scheinbar (?) ist es so, dass hier das Eine nur das Andere "anstösst"...

Code: Alles auswählen

12917 /bin/sh -c /usr/bin/env node-red-pi $NODE_OPTIONS $NODE_RED_OPTIONS > /var/log/nodered-devlog.log
           └─12918 node-red
Wenn ich das richtig sehe...(?)
Freundliche Grüsse, Jan

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Logging bei Linux-Systemdiensten einschalten?

Beitrag von JTH » 02.05.2022 17:14:07

jmar83 hat geschrieben: ↑ zum Beitrag ↑
02.05.2022 16:53:00

Code: Alles auswählen

ExecStart=/bin/sh -c "/usr/bin/env node-red-pi $NODE_OPTIONS $NODE_RED_OPTIONS" > /var/log/nodered-devlog.log
Das ist das gleiche in grün – die Umleitung ist wieder außerhalb des Kommandostrings, der der Shell übergeben wird. Vereinfacht ist das immer noch:

Code: Alles auswählen

ExecStart=/bin/sh -c "echo Echo" > /var/log/nodered-devlog.log
Die Umleitung muss in die Anführungszeichen, damit sie von der Shell beachtet wird.

Die ExecStart-Zeilen können aber, gerade wenn man das Ausgeführte in sh -c '' verpackt, mit Quotes, Escaping und co. leicht sehr hässlich werden. Deshalb würde ich – meine Erfahrung – das StandardOutput nehmen, wenn es sich anbietet.

jmar83 hat geschrieben: ↑ zum Beitrag ↑
02.05.2022 16:53:43

Code: Alles auswählen

StandardOutput=/var/log/nodered-out-devlog.log
StandardError=/var/log/nodered-err-devlog.log
Die sind/waren auch immer noch nicht richtig ;)
Manchmal bekannt als Just (another) Terminal Hacker.

jmar83
Beiträge: 962
Registriert: 20.06.2013 20:20:15
Wohnort: CH
Kontaktdaten:

Re: Logging bei Linux-Systemdiensten einschalten?

Beitrag von jmar83 » 03.05.2022 09:00:37

Vielen vielen Dank!! :THX: :THX: :THX:
Freundliche Grüsse, Jan

Antworten