35
35
Date: 2024/05/16
36
36
License: MIT
37
37
"""
38
-
38
+ import time
39
39
import logging
40
40
from pathlib import Path
41
41
from uuid import uuid4
@@ -55,6 +55,9 @@ def config_log(
55
55
log_diagnose : bool = False ,
56
56
app_name : str = None ,
57
57
append_app_name : bool = False ,
58
+ enqueue : bool = True ,
59
+ intercept_standard_logging : bool = True ,
60
+ file_sink : bool = True ,
58
61
):
59
62
"""
60
63
Configures and sets up a logger using the loguru package.
@@ -140,7 +143,7 @@ def config_log(
140
143
log_path ,
141
144
level = logging_level .upper (),
142
145
format = log_format ,
143
- enqueue = True ,
146
+ enqueue = enqueue ,
144
147
backtrace = log_backtrace ,
145
148
rotation = log_rotation ,
146
149
retention = log_retention ,
@@ -197,9 +200,36 @@ def emit(self, record):
197
200
# Configure standard logging to use interceptor handler
198
201
logging .basicConfig (handlers = [InterceptHandler ()], level = logging_level .upper ())
199
202
200
- # Add interceptor handler to all existing loggers
201
- for name in logging .root .manager .loggerDict :
202
- logging .getLogger (name ).addHandler (InterceptHandler ())
203
+ if intercept_standard_logging :
204
+ # Add interceptor handler to all existing loggers
205
+ for name in logging .root .manager .loggerDict :
206
+ logging .getLogger (name ).addHandler (InterceptHandler ())
203
207
204
208
# Set the root logger's level to the lowest level possible
205
209
logging .getLogger ().setLevel (logging .NOTSET )
210
+
211
+
212
+ class ResilientFileSink :
213
+ def __init__ (self , path , max_retries = 5 , retry_delay = 0.1 ):
214
+ self .path = path
215
+ self .max_retries = max_retries
216
+ self .retry_delay = retry_delay
217
+
218
+ def write (self , message ):
219
+ for attempt in range (self .max_retries ):
220
+ try :
221
+ with open (self .path , 'a' ) as file :
222
+ file .write (str (message ))
223
+ break # Successfully written, break the loop
224
+ except FileNotFoundError :
225
+ if attempt < self .max_retries - 1 :
226
+ time .sleep (self .retry_delay ) # Wait before retrying
227
+ else :
228
+ raise # Reraise if max retries exceeded
229
+
230
+ if file_sink :
231
+ # Create an instance of ResilientFileSink
232
+ resilient_sink = ResilientFileSink (str (log_path ))
233
+
234
+ # Configure the logger to use the ResilientFileSink
235
+ logger .add (resilient_sink , format = log_format )
0 commit comments