Log Python Systemd output to log file
Asked Answered
T

4

7

I run my python script as a systemd service, it is defined in the following .service file:

[Unit]
Description=MyService
After=multi-user.target

[Service]
Type=idle
ExecStart=/usr/bin/python3 /home/username/projects/website_notifier/run_service.py

[Install]
After=multi-user.target

In my run_service.py file I then log output using the logging module:

import logging

logging.basicConfig(filename=settings['log_file_name'], level=logging.INFO)
logging.info("Starting notifier service at " + str(datetime.utcnow()))

The issue is that this information is not being logged to my log file when I run I start my file through systemctl

Now, I know that generally systemd gets output to journalctl, I don't want this. I want to be able to access this log through another script that does not run with administrator priviliges.

How can I make this happen?

Titicaca answered 21/11, 2018 at 23:55 Comment(0)
T
14

I've since switched to using Loguru for logging and it seems far more intuitive and useable.

Also, adding the following to .service file makes sure the logging is not buffered and is real time:

[Service]
Environment=PYTHONUNBUFFERED=1

Titicaca answered 24/4, 2020 at 11:51 Comment(1)
My log config was good, but I could not see logs most of the time. This solution solved it for me. I'm just using print on my python script and log configs are on the service using this line [Service] StandardOutput=file:/etc/mailbot/logs/mailbot.logKenon
H
4

First check that your service is running at all: systemctl status MyService should show you an errors.

After goes in [Unit] section, not in [Install].

Once I fixed that your script worked for me. Other things to check:

  • Is the log file path an absolute path?
  • Does the user starting the service have permissions to write there?

I would recommend just logging to stdout, to the journal, so that you don't have to worry about rotating the log file, how much space it takes, etc. Also journalctl is really nice for querying logs. You should be able to access the journal as non-root, either as same user as the script, or by being in group systemd-journal.

Hedve answered 30/11, 2018 at 18:18 Comment(0)
S
0

This can be fixed by running ExecStart with -u flag

ExecStart=/usr/bin/python3 -u /home/username/projects/website_notifier/run_service.py

or in your python code you can import the sys module and utilize flush() after each print statement

import sys
print("This output")
sys.stdout.flush()
Southernly answered 15/6 at 10:42 Comment(0)
W
-3

The answer is simply that logging.info is not going to show up, but logging.warn (and up) will show up.

Wearing answered 13/6, 2019 at 21:14 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.