You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
uhr/setup_logging.py

81 lines
2.6 KiB
Python

#!/usr/bin/python3
"""
Beschreibung:
Hilfskript zum Erstellen einer logging Instanz in Abhängigkeit, ob das Skript manuell gestartet worden ist oder
ob das Skript per Service Unit gestartet wurde
Abhängig dessen wird entweder die Logging Instanz mit einem JournalHandler erstellt (Service Unit)
oder mit einem StreamHandler (manuell)
Author: Hofei
Datum: 03.08.2018
Version: 0.1
"""
import logging
import os
import shlex
import subprocess
from systemd import journal
def __setup_logging(loglevel, frm, startmethode, unitname):
"""
Erstellt die Logger Instanz für das Skript
"""
logger = logging.getLogger()
logger.setLevel(loglevel)
logger.handlers = []
if startmethode == "auto":
log_handler = journal.JournalHandler(SYSLOG_IDENTIFIER=unitname)
else:
log_handler = logging.StreamHandler()
log_handler.setLevel(loglevel)
log_handler.setFormatter(frm)
logger.addHandler(log_handler)
return logger
def __get_service_unit_pid(unitname):
"""Ermittelt ob das ausführende Skript mit einer Service Unit gestartet worden ist, wenn ja so ist das
Ergebnis (pid_service_unit) != 0"""
cmd = "systemctl show -p MainPID {}".format(unitname)
cmd = shlex.split(cmd)
antwort = subprocess.run(cmd, stdout=subprocess.PIPE)
ausgabe = antwort.stdout
# strip entfernt \n, split teilt am = in eine Liste und [1] weißt die Zahl in die Variable zu
pid_service_unit = int(ausgabe.decode().strip().split("=")[1])
return pid_service_unit
def __get_startmethode(unitname):
"""Verglicht die PID vom skript mit der pid Service Unit Prüfung
wenn die Nummern gleich sind wird auf auto gestellt, wenn nicht auf manuell"""
pid_service_unit = __get_service_unit_pid(unitname)
pid_skript = os.getpid()
if pid_service_unit == pid_skript:
startmethode = "auto"
else:
startmethode = "manuell"
return startmethode
def __set_loggerformat(startmethode):
"""Stellt die passende Formattierung ein"""
if startmethode == "auto":
frm = logging.Formatter("%(levelname)s: %(message)s", "%d.%m.%Y %H:%M:%S")
else:
frm = logging.Formatter("%(asctime)s %(levelname)s: %(message)s", "%d.%m.%Y %H:%M:%S")
return frm
def create_logger(unitname, loglevel):
"""Dies ist die aufzurufende Funktion bei der Verwendung des Moduls von außen
Liefert die fertige Logging Instanz zurück"""
startmethode = __get_startmethode(unitname)
frm = __set_loggerformat(startmethode)
return __setup_logging(loglevel, frm, startmethode, unitname)
if __name__ == "__main__":
logger = create_logger("testunit", 10)
logger.debug("Testnachricht")