journald compatible log levels

This commit is contained in:
Daniel Langbein 2023-11-01 12:54:26 +01:00
parent 8d12061ce2
commit d2d7c52cbf
Signed by: langfingaz
GPG Key ID: 6C47C753F0823002
6 changed files with 77 additions and 27 deletions

View File

@ -4,6 +4,8 @@ import csv
from collections import deque from collections import deque
from pathlib import Path from pathlib import Path
from de.p1st.monitor.print_util import print_debug
def read(file: Path) -> list[list[str]]: def read(file: Path) -> list[list[str]]:
""" """
@ -84,7 +86,7 @@ def append(file: Path, rows: list[list[str]]) -> None:
def test(): def test():
file = Path('/var/log/de-p1st-monitor/cpu_avg.csv') file = Path('/var/log/de-p1st-monitor/cpu_avg.csv')
data = read_last(file, 4, 10) data = read_last(file, 4, 10)
print(data) print_debug(data)
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -2,23 +2,25 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from datetime import datetime, timezone from datetime import datetime, timezone
from de.p1st.monitor.print_util import print_debug
def test(): def test():
dt = datetime.now() dt = datetime.now()
print('non UTC:') print_debug('non UTC:')
print(dt) print_debug(dt)
print('\nUTC:') print_debug('\nUTC:')
print(now()) print_debug(now())
print(to_str(now())) print_debug(to_str(now()))
print(now_str()) print_debug(now_str())
print(from_str(to_str(now()))) print_debug(from_str(to_str(now())))
print('\nlocalized:') print_debug('\nlocalized:')
print(dt.tzinfo) print_debug(dt.tzinfo)
dt = dt.replace(tzinfo=timezone.utc) dt = dt.replace(tzinfo=timezone.utc)
print(dt) print_debug(dt)
def now() -> datetime: def now() -> datetime:

View File

@ -9,6 +9,7 @@ import psutil
from de.p1st.monitor import datetime_util, csv_util from de.p1st.monitor import datetime_util, csv_util
from de.p1st.monitor.logger import Logger from de.p1st.monitor.logger import Logger
from de.p1st.monitor.logger_ex import LoggerReadEx from de.p1st.monitor.logger_ex import LoggerReadEx
from de.p1st.monitor.print_util import print_debug
from de.p1st.monitor.warn import WarnLevel, WarnMessage from de.p1st.monitor.warn import WarnLevel, WarnMessage
@ -43,8 +44,7 @@ class NetworkLogger(Logger):
delta_received = curr_row[2] - prev_row[2] delta_received = curr_row[2] - prev_row[2]
if delta_sent < 0 or delta_received < 0: if delta_sent < 0 or delta_received < 0:
print(f'bytes received/sent counter did overflow after {prev_row[0]}', print_debug(f'bytes received/sent counter did overflow after {prev_row[0]}')
file=sys.stderr)
continue continue
elapsed_seconds = elapsed_time.total_seconds() elapsed_seconds = elapsed_time.total_seconds()

View File

@ -1,12 +1,12 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import argparse import argparse
import sys
from pathlib import Path from pathlib import Path
from de.p1st.monitor.cfg.singleton import init_cfg from de.p1st.monitor.cfg.singleton import init_cfg
from de.p1st.monitor.cfg.loggers import get_loggers from de.p1st.monitor.cfg.loggers import get_loggers
from de.p1st.monitor.logger_ex import LoggerReadEx from de.p1st.monitor.logger_ex import LoggerReadEx
from de.p1st.monitor.print_util import print_err, print_debug
def main(): def main():
@ -34,13 +34,13 @@ def main():
def export(): def export():
loggers, logger_arg_exs = get_loggers() loggers, logger_arg_exs = get_loggers()
if len(logger_arg_exs) > 0: if len(logger_arg_exs) > 0:
print('\nCONFIGURATION ERROR: Could not instantiate some of the loggers!', file=sys.stderr) print_err('\nCONFIGURATION ERROR: Could not instantiate some of the loggers!')
print_exs(logger_arg_exs, [f'{n}.' for n in range(1, 1 + len(logger_arg_exs))]) print_exs(logger_arg_exs, [f'{n}.' for n in range(1, 1 + len(logger_arg_exs))])
exit(1) exit(1)
for logger in loggers: for logger in loggers:
export_path: Path = logger.export_data() export_path: Path = logger.export_data()
print(export_path) print_debug(export_path)
def log(): def log():
@ -48,7 +48,7 @@ def log():
logger_read_exs = [] logger_read_exs = []
logger_warnings = 0 logger_warnings = 0
for logger_ct, logger in enumerate(loggers, start=1): for logger_ct, logger in enumerate(loggers, start=1):
# print(f'Running logger {logger_ct}/{len(loggers)} ...') # print_debug(f'Running logger {logger_ct}/{len(loggers)} ...')
try: try:
logger.update() logger.update()
except LoggerReadEx as e: except LoggerReadEx as e:
@ -59,10 +59,10 @@ def log():
logger_warnings += 1 logger_warnings += 1
if len(logger_arg_exs) > 0: if len(logger_arg_exs) > 0:
print('\nCONFIGURATION ERROR: Could not instantiate some of the loggers!', file=sys.stderr) print_err('\nCONFIGURATION ERROR: Could not instantiate some of the loggers!')
print_exs(logger_arg_exs, [f'{n}.' for n in range(1, 1 + len(logger_arg_exs))]) print_exs(logger_arg_exs, [f'{n}.' for n in range(1, 1 + len(logger_arg_exs))])
if len(logger_read_exs) > 0: if len(logger_read_exs) > 0:
print('\nRUNTIME ERROR: Some loggers could not fetch sensor data!', file=sys.stderr) print_err('\nRUNTIME ERROR: Some loggers could not fetch sensor data!')
print_exs(logger_read_exs, [f'{n}.' for n in range(1, 1 + len(logger_read_exs))]) print_exs(logger_read_exs, [f'{n}.' for n in range(1, 1 + len(logger_read_exs))])
if len(logger_arg_exs) + len(logger_read_exs) > 0 or logger_warnings > 0: if len(logger_arg_exs) + len(logger_read_exs) > 0 or logger_warnings > 0:
@ -74,7 +74,7 @@ def print_exs(exs: list[Exception], headers: list):
# Indent str(e) with \t # Indent str(e) with \t
body = '\t' + '\n\t'.join(str(e).splitlines()) body = '\t' + '\n\t'.join(str(e).splitlines())
print(f'{header}\n{body}', file=sys.stderr) print_err(f'{header}\n{body}')
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -0,0 +1,46 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
# https://www.freedesktop.org/software/systemd/man/latest/sd-daemon.html
#
# define SD_EMERG "<0>" /* system is unusable */
# define SD_ALERT "<1>" /* action must be taken immediately */
# define SD_CRIT "<2>" /* critical conditions */
# define SD_ERR "<3>" /* error conditions */
# define SD_WARNING "<4>" /* warning conditions */
# define SD_NOTICE "<5>" /* normal but significant condition */
# define SD_INFO "<6>" /* informational */
# define SD_DEBUG "<7>" /* debug-level messages */
def print_emerg(message: object):
print(f'<0> {message}', file=sys.stderr)
def print_alert(message: object):
print(f'<1> {message}', file=sys.stderr)
def print_crit(message: object):
print(f'<2> {message}', file=sys.stderr)
def print_err(message: object):
print(f'<3> {message}', file=sys.stderr)
def print_warning(message: object):
print(f'<4> {message}', file=sys.stderr)
def print_notice(message: object):
print(f'<5> {message}', file=sys.stdout)
def print_info(message: object):
print(f'<6> {message}', file=sys.stdout)
def print_debug(message: object):
print(f'<7> {message}', file=sys.stdout)

View File

@ -1,11 +1,11 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import annotations from __future__ import annotations
import sys
from datetime import datetime from datetime import datetime
from enum import Enum from enum import Enum
from functools import total_ordering from functools import total_ordering
from typing import TextIO
from de.p1st.monitor.print_util import print_warning, print_crit
# https://docs.python.org/3/library/functools.html#functools.total_ordering # https://docs.python.org/3/library/functools.html#functools.total_ordering
@ -58,8 +58,12 @@ class WarnMessage:
""" """
if self.level == WarnLevel.NONE: if self.level == WarnLevel.NONE:
pass pass
elif self.level == WarnLevel.NORMAL:
print_warning(self.formatted_message())
elif self.level == WarnLevel.HIGH:
print_crit(self.formatted_message())
else: else:
print(self.formatted_message(), file=self.file()) raise NotImplementedError()
return self return self
@ -73,7 +77,3 @@ class WarnMessage:
return f'[CRITICAL] {self.date}: ' return f'[CRITICAL] {self.date}: '
return f'{self.date}: ' return f'{self.date}: '
def file(self) -> TextIO:
if self.level == WarnLevel.NONE:
raise ValueError()
return sys.stderr