55
66import orjson
77import structlog
8- from rich .console import Console
9- from rich .logging import RichHandler
108from whenever ._whenever import Instant
119
12- from app .utils .singleton import SingletonMeta
13-
14-
15- class AppLogger (metaclass = SingletonMeta ):
16- _logger = None
17-
18- def __init__ (self ):
19- self ._logger = logging .getLogger (__name__ )
20-
21- def get_logger (self ):
22- return self ._logger
23-
24-
25- class RichConsoleHandler (RichHandler ):
26- def __init__ (self , width = 200 , style = None , ** kwargs ):
27- super ().__init__ (
28- console = Console (color_system = "256" , width = width , style = style , stderr = True ),
29- ** kwargs ,
30- )
31-
10+ from app .utils .singleton import SingletonMetaNoArgs
3211
3312
3413# TODO: merge this wrapper with the one in structlog under one hood of AppLogger
@@ -50,30 +29,39 @@ def flush(self):
5029 def close (self ):
5130 self .handler .close ()
5231
32+ # @define
33+ class AppStructLogger (metaclass = SingletonMetaNoArgs ):
34+ _logger = None
5335
54- def setup_structlog () -> structlog . BoundLogger :
55- log_date = Instant .now ().py_datetime ().strftime ("%Y%m%d" )
56- log_path = Path (f"{ log_date } _{ os .getpid ()} .log" )
57- handler = RotatingFileHandler (
58- filename = log_path ,
59- mode = "a" , # text mode
60- maxBytes = 10 * 1024 * 1024 ,
61- backupCount = 5 ,
62- encoding = "utf-8"
63- )
64- file_like = BytesToTextIOWrapper ( handler )
65- structlog . configure (
66- cache_logger_on_first_use = True ,
67- wrapper_class = structlog . make_filtering_bound_logger ( logging . INFO ),
68- processors = [
69- structlog .contextvars . merge_contextvars ,
70- structlog .processors .add_log_level ,
71- structlog .processors .format_exc_info ,
72- structlog .processors .TimeStamper ( fmt = "iso" , utc = True ),
73- structlog . processors . JSONRenderer ( serializer = orjson . dumps ) ,
74- ],
75- logger_factory = structlog . BytesLoggerFactory (
76- file = file_like
36+ def __init__ ( self ) :
37+ _log_date = Instant .now ().py_datetime ().strftime ("%Y%m%d" )
38+ _log_path = Path (f"{ _log_date } _{ os .getpid ()} .log" )
39+ _handler = RotatingFileHandler (
40+ filename = _log_path ,
41+ mode = "a" , # text mode
42+ maxBytes = 10 * 1024 * 1024 ,
43+ backupCount = 5 ,
44+ encoding = "utf-8"
45+ )
46+ structlog . configure (
47+ cache_logger_on_first_use = True ,
48+ wrapper_class = structlog . make_filtering_bound_logger ( logging . INFO ) ,
49+ processors = [
50+ structlog . contextvars . merge_contextvars ,
51+ structlog .processors . add_log_level ,
52+ structlog .processors .format_exc_info ,
53+ structlog .processors .TimeStamper ( fmt = "iso" , utc = True ) ,
54+ structlog .processors .JSONRenderer ( serializer = orjson . dumps ),
55+ ] ,
56+ logger_factory = structlog . BytesLoggerFactory (
57+ file = BytesToTextIOWrapper ( _handler )
58+ )
7759 )
78- )
79- return structlog .get_logger ()
60+ self ._logger = structlog .get_logger ()
61+
62+ def get_logger (self ) -> structlog .BoundLogger :
63+ """
64+ Returns:
65+ structlog.BoundLogger: The configured logger instance.
66+ """
67+ return self ._logger
0 commit comments