Rewrite integration test suite in Python
[tinc] / test / integration / testlib / log.py
1 """Global logger for using in test and tincd scripts."""
2
3 import logging
4 import os
5 import sys
6 import typing as T
7 from types import TracebackType
8
9 from .path import TEST_WD, TEST_NAME
10
11 logging.basicConfig(level=logging.DEBUG)
12
13 _fmt = logging.Formatter(
14     "%(asctime)s %(name)s %(filename)s:%(lineno)d %(levelname)s %(message)s"
15 )
16
17 # Where to put log files for this test and nodes started by it
18 _log_dir = os.path.join(TEST_WD, "logs")
19
20
21 def new_logger(name: str) -> logging.Logger:
22     """Create a new named logger with common logging format.
23     Log entries will go into a separate logfile named 'name.log'.
24     """
25     os.makedirs(_log_dir, exist_ok=True)
26
27     logger = logging.getLogger(name)
28     logger.setLevel(logging.DEBUG)
29
30     file = logging.FileHandler(os.path.join(_log_dir, name + ".log"))
31     file.setFormatter(_fmt)
32     logger.addHandler(file)
33
34     return logger
35
36
37 # Main logger used by most tests
38 log = new_logger(TEST_NAME)
39
40
41 def _exc_hook(
42     ex_type: T.Type[BaseException],
43     base: BaseException,
44     tb_type: T.Optional[TracebackType],
45 ) -> None:
46     """Logging handler for uncaught exceptions."""
47     log.error("Uncaught exception", exc_info=(ex_type, base, tb_type))
48
49
50 sys.excepthook = _exc_hook