22import logging
33import os .path
44import sys
5- from typing import Any , Tuple
5+ from typing import Any , List , Tuple
66from logging .handlers import RotatingFileHandler
77
88from .singleton import Singleton
@@ -21,8 +21,7 @@ def __init__(self) -> None:
2121 super (ElectionGuardLog , self ).__init__ ()
2222
2323 self .__logger = logging .getLogger ("electionguard" )
24- self .__logger .addHandler (self ._get_file_handler ())
25- self .__logger .addHandler (self ._get_stream_handler ())
24+ self .__logger .addHandler (get_stream_handler ())
2625
2726 @staticmethod
2827 def __get_call_info () -> Tuple [str , str , int ]:
@@ -45,30 +44,23 @@ def __formatted_message(self, message: str) -> str:
4544 message = f"{ os .path .basename (filename )} .{ funcname } :#L{ line } : { message } "
4645 return message
4746
48- def _get_stream_handler (self ) -> logging . StreamHandler :
47+ def add_handler (self , handler : logging . Handler ) -> None :
4948 """
50- Get a Stream Handler, sends only warnings and errors to stdout.
49+ Adds a logger handler
5150 """
52- stream_handler = logging .StreamHandler (sys .stdout )
53- stream_handler .setLevel (logging .WARNING )
54- stream_handler .setFormatter (logging .Formatter (FORMAT ))
55- return stream_handler
51+ self .__logger .addHandler (handler )
5652
57- def _get_file_handler (self ) -> logging . FileHandler :
53+ def remove_handler (self , handler : logging . Handler ) -> None :
5854 """
59- Get a File System Handler, sends verbose logging to a file, `electionguard.log`.
60- When that file gets too large, the logs will rotate, creating files with names
61- like `electionguard.log.1`.
55+ Removes a logger handler
6256 """
57+ self .__logger .removeHandler (handler )
6358
64- # TODO: add file compression, save a bunch of space.
65- # https://medium.com/@rahulraghu94/overriding-pythons-timedrotatingfilehandler-to-compress-your-log-files-iot-c766a4ace240
66- file_handler = RotatingFileHandler (
67- "electionguard.log" , "a" , maxBytes = 10_000_000 , backupCount = 10
68- )
69- file_handler .setLevel (logging .DEBUG )
70- file_handler .setFormatter (logging .Formatter (FORMAT ))
71- return file_handler
59+ def handlers (self ) -> List [logging .Handler ]:
60+ """
61+ Returns all logging handlers
62+ """
63+ return self .__logger .handlers
7264
7365 def debug (self , message : str , * args : Any , ** kwargs : Any ) -> None :
7466 """
@@ -101,9 +93,57 @@ def critical(self, message: str, *args: Any, **kwargs: Any) -> None:
10193 self .__logger .critical (self .__formatted_message (message ), * args , ** kwargs )
10294
10395
96+ def get_stream_handler () -> logging .StreamHandler :
97+ """
98+ Get a Stream Handler, sends only warnings and errors to stdout.
99+ """
100+ stream_handler = logging .StreamHandler (sys .stdout )
101+ stream_handler .setLevel (logging .WARNING )
102+ stream_handler .setFormatter (logging .Formatter (FORMAT ))
103+ return stream_handler
104+
105+
106+ def get_file_handler () -> logging .FileHandler :
107+ """
108+ Get a File System Handler, sends verbose logging to a file, `electionguard.log`.
109+ When that file gets too large, the logs will rotate, creating files with names
110+ like `electionguard.log.1`.
111+ """
112+
113+ # TODO: add file compression, save a bunch of space.
114+ # https://medium.com/@rahulraghu94/overriding-pythons-timedrotatingfilehandler-to-compress-your-log-files-iot-c766a4ace240
115+ file_handler = RotatingFileHandler (
116+ "electionguard.log" , "a" , maxBytes = 10_000_000 , backupCount = 10
117+ )
118+ file_handler .setLevel (logging .DEBUG )
119+ file_handler .setFormatter (logging .Formatter (FORMAT ))
120+ return file_handler
121+
122+
104123LOG = ElectionGuardLog ()
105124
106125
126+ def log_add_handler (handler : logging .Handler ) -> None :
127+ """
128+ Adds a handler to the logger
129+ """
130+ LOG .add_handler (handler )
131+
132+
133+ def log_remove_handler (handler : logging .Handler ) -> None :
134+ """
135+ Removes a handler from the logger
136+ """
137+ LOG .remove_handler (handler )
138+
139+
140+ def log_handlers () -> List [logging .Handler ]:
141+ """
142+ Returns all logger handlers
143+ """
144+ return LOG .handlers ()
145+
146+
107147def log_debug (msg : str , * args : Any , ** kwargs : Any ) -> None :
108148 """
109149 Logs a debug message to the console and the file log.
0 commit comments