@@ -63,28 +63,43 @@ class ColoredLevelFormatter(logging.Formatter):
63
63
64
64
def __init__ (self , terminalwriter : TerminalWriter , * args , ** kwargs ) -> None :
65
65
super ().__init__ (* args , ** kwargs )
66
+ self ._terminalwriter = terminalwriter
66
67
self ._original_fmt = self ._style ._fmt
67
68
self ._level_to_fmt_mapping : Dict [int , str ] = {}
68
69
70
+ for level , color_opts in self .LOGLEVEL_COLOROPTS .items ():
71
+ self .add_color_level (level , * color_opts )
72
+
73
+ def add_color_level (self , level : int , * color_opts : str ) -> None :
74
+ """Add or update color opts for a log level.
75
+
76
+ :param level:
77
+ Log level to apply a style to, e.g. ``logging.INFO``.
78
+ :param color_opts:
79
+ ANSI escape sequence color options. Capitalized colors indicates
80
+ background color, i.e. ``'green', 'Yellow', 'bold'`` will give bold
81
+ green text on yellow background.
82
+
83
+ .. warning::
84
+ This is an experimental API.
85
+ """
86
+
69
87
assert self ._fmt is not None
70
88
levelname_fmt_match = self .LEVELNAME_FMT_REGEX .search (self ._fmt )
71
89
if not levelname_fmt_match :
72
90
return
73
91
levelname_fmt = levelname_fmt_match .group ()
74
92
75
- for level , color_opts in self .LOGLEVEL_COLOROPTS .items ():
76
- formatted_levelname = levelname_fmt % {
77
- "levelname" : logging .getLevelName (level )
78
- }
79
-
80
- # add ANSI escape sequences around the formatted levelname
81
- color_kwargs = {name : True for name in color_opts }
82
- colorized_formatted_levelname = terminalwriter .markup (
83
- formatted_levelname , ** color_kwargs
84
- )
85
- self ._level_to_fmt_mapping [level ] = self .LEVELNAME_FMT_REGEX .sub (
86
- colorized_formatted_levelname , self ._fmt
87
- )
93
+ formatted_levelname = levelname_fmt % {"levelname" : logging .getLevelName (level )}
94
+
95
+ # add ANSI escape sequences around the formatted levelname
96
+ color_kwargs = {name : True for name in color_opts }
97
+ colorized_formatted_levelname = self ._terminalwriter .markup (
98
+ formatted_levelname , ** color_kwargs
99
+ )
100
+ self ._level_to_fmt_mapping [level ] = self .LEVELNAME_FMT_REGEX .sub (
101
+ colorized_formatted_levelname , self ._fmt
102
+ )
88
103
89
104
def format (self , record : logging .LogRecord ) -> str :
90
105
fmt = self ._level_to_fmt_mapping .get (record .levelno , self ._original_fmt )
0 commit comments