]>
Commit | Line | Data |
---|---|---|
e0df8241 JR |
1 | """Customize logging |
2 | ||
3 | Defines custom logger class for the `logger.verbose(...)` method. | |
4 | ||
5 | init_logging() must be called before any other modules that call logging.getLogger. | |
6 | """ | |
7 | ||
8 | import logging | |
9 | from typing import Any, cast | |
10 | ||
11 | # custom log level for `--verbose` output | |
12 | # between DEBUG and INFO | |
13 | VERBOSE = 15 | |
14 | ||
15 | ||
16 | class VerboseLogger(logging.Logger): | |
17 | """Custom Logger, defining a verbose log-level | |
18 | ||
19 | VERBOSE is between INFO and DEBUG. | |
20 | """ | |
21 | ||
22 | def verbose(self, msg: str, *args: Any, **kwargs: Any) -> None: | |
23 | return self.log(VERBOSE, msg, *args, **kwargs) | |
24 | ||
25 | ||
26 | def getLogger(name: str) -> VerboseLogger: | |
27 | """logging.getLogger, but ensures our VerboseLogger class is returned""" | |
28 | return cast(VerboseLogger, logging.getLogger(name)) | |
29 | ||
30 | ||
31 | def init_logging() -> None: | |
32 | """Register our VerboseLogger and VERBOSE log level. | |
33 | ||
34 | Should be called before any calls to getLogger(), | |
35 | i.e. in pip._internal.__init__ | |
36 | """ | |
37 | logging.setLoggerClass(VerboseLogger) | |
38 | logging.addLevelName(VERBOSE, "VERBOSE") |