]> glassweightruler.freedombox.rocks Git - waydroid.git/blob - tools/helpers/logging.py
session_manager: Stop the container on SIGHUP
[waydroid.git] / tools / helpers / logging.py
1 # Copyright 2021 Oliver Smith
2 # SPDX-License-Identifier: GPL-3.0-or-later
3 import logging
4 from logging.handlers import RotatingFileHandler
5 import os
6 import sys
7
8
9 class stdout_logger(logging.StreamHandler):
10 """
11 Write to stdout and to the already opened log file.
12 """
13 _args = None
14
15 def emit(self, record):
16 # INFO or higher: Write to stdout
17 if self._args.quiet or (
18 record.levelno < logging.INFO and
19 not self._args.details_to_stdout):
20 return
21
22 try:
23 msg = self.format(record)
24 stream = self.stream
25 stream.write(msg)
26 stream.write(self.terminator)
27 self.flush()
28
29 except (KeyboardInterrupt, SystemExit):
30 raise
31 except BaseException:
32 self.handleError(record)
33
34
35 def add_verbose_log_level():
36 """
37 Add a new log level "verbose", which is below "debug". Also monkeypatch
38 logging, so it can be used with logging.verbose().
39
40 This function is based on work by Voitek Zylinski and sleepycal:
41 https://stackoverflow.com/a/20602183
42 All stackoverflow user contributions are licensed as CC-BY-SA:
43 https://creativecommons.org/licenses/by-sa/3.0/
44 """
45 logging.VERBOSE = 5
46 logging.addLevelName(logging.VERBOSE, "VERBOSE")
47 logging.Logger.verbose = lambda inst, msg, * \
48 args, **kwargs: inst.log(logging.VERBOSE, msg, *args, **kwargs)
49 logging.verbose = lambda msg, *args, **kwargs: logging.log(logging.VERBOSE,
50 msg, *args,
51 **kwargs)
52
53
54 def init(args):
55 root_logger = logging.getLogger()
56 root_logger.handlers = []
57
58 # Set log level
59 add_verbose_log_level()
60 root_logger.setLevel(logging.DEBUG)
61 if args.verbose:
62 root_logger.setLevel(logging.VERBOSE)
63
64 # Add custom stdout log handler
65 handler = stdout_logger()
66 handler._args = args
67 handler.setFormatter(logging.Formatter("[%(asctime)s] %(message)s",
68 datefmt="%H:%M:%S"))
69 root_logger.addHandler(handler)
70
71 # Add file log handler
72 if args.action == "container" and not args.details_to_stdout:
73 os.chmod(args.log, 0o644)
74 handler = RotatingFileHandler(args.log, maxBytes=5*1024*1024, backupCount=1)
75 handler.setFormatter(logging.Formatter("(%(process)d) [%(asctime)s] %(message)s",
76 datefmt="%a, %d %b %Y %H:%M:%S"))
77 root_logger.addHandler(handler)
78
79 def disable():
80 logger = logging.getLogger()
81 logger.disabled = True