Skip to content

Commit 37826de

Browse files
committed
hopefully this is the final fix.
1 parent 1e31a77 commit 37826de

File tree

2 files changed

+43
-72
lines changed

2 files changed

+43
-72
lines changed

coverage.xml

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" ?>
2-
<coverage version="7.6.0" timestamp="1721531383612" lines-valid="691" lines-covered="188" line-rate="0.2721" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0">
2+
<coverage version="7.6.0" timestamp="1721531566029" lines-valid="691" lines-covered="188" line-rate="0.2721" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0">
33
<!-- Generated by coverage.py: https://coverage.readthedocs.io/en/7.6.0 -->
44
<!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd -->
55
<sources>
@@ -350,49 +350,49 @@
350350
<lines>
351351
<line number="39" hits="1"/>
352352
<line number="40" hits="1"/>
353-
<line number="41" hits="1"/>
354353
<line number="42" hits="1"/>
355-
<line number="50" hits="1"/>
356-
<line number="60" hits="1"/>
354+
<line number="48" hits="1"/>
355+
<line number="51" hits="1"/>
357356
<line number="61" hits="1"/>
358-
<line number="64" hits="1"/>
359-
<line number="105" hits="0"/>
360-
<line number="108" hits="0"/>
361-
<line number="111" hits="0"/>
357+
<line number="62" hits="1"/>
358+
<line number="65" hits="1"/>
359+
<line number="106" hits="0"/>
360+
<line number="109" hits="0"/>
362361
<line number="112" hits="0"/>
363362
<line number="113" hits="0"/>
364363
<line number="114" hits="0"/>
365-
<line number="117" hits="0"/>
364+
<line number="115" hits="0"/>
366365
<line number="118" hits="0"/>
367366
<line number="119" hits="0"/>
368367
<line number="120" hits="0"/>
369368
<line number="121" hits="0"/>
370369
<line number="122" hits="0"/>
371370
<line number="123" hits="0"/>
372-
<line number="126" hits="0"/>
371+
<line number="124" hits="0"/>
373372
<line number="127" hits="0"/>
374-
<line number="139" hits="0"/>
375-
<line number="142" hits="0"/>
376-
<line number="151" hits="0"/>
373+
<line number="128" hits="0"/>
374+
<line number="140" hits="0"/>
375+
<line number="143" hits="0"/>
377376
<line number="152" hits="0"/>
378377
<line number="153" hits="0"/>
379-
<line number="159" hits="0"/>
378+
<line number="154" hits="0"/>
380379
<line number="160" hits="0"/>
381-
<line number="163" hits="0"/>
382-
<line number="166" hits="0"/>
380+
<line number="161" hits="0"/>
381+
<line number="164" hits="0"/>
383382
<line number="167" hits="0"/>
384383
<line number="168" hits="0"/>
385384
<line number="169" hits="0"/>
386385
<line number="170" hits="0"/>
387386
<line number="171" hits="0"/>
388387
<line number="172" hits="0"/>
389-
<line number="175" hits="0"/>
388+
<line number="173" hits="0"/>
390389
<line number="176" hits="0"/>
391390
<line number="177" hits="0"/>
392391
<line number="178" hits="0"/>
393392
<line number="179" hits="0"/>
394393
<line number="180" hits="0"/>
395394
<line number="181" hits="0"/>
395+
<line number="182" hits="0"/>
396396
</lines>
397397
</class>
398398
<class name="file_functions.py" filename="dsg_lib/common_functions/file_functions.py" complexity="0" line-rate="0.1205" branch-rate="0">

dsg_lib/common_functions/logging_config.py

Lines changed: 26 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@
3030
3131
License: MIT
3232
"""
33-
import time
3433
import logging
34+
import os
35+
import time
3536
from pathlib import Path
3637
from uuid import uuid4
3738

@@ -204,7 +205,7 @@ def emit(self, record):
204205

205206
if intercept_standard_logging:
206207
# Add interceptor handler to all existing loggers
207-
for name in logging.root.manager.loggerDict:
208+
for name in logging.Logger.manager.loggerDict:
208209
logging.getLogger(name).addHandler(InterceptHandler())
209210

210211
# Add interceptor handler to the root logger
@@ -215,72 +216,42 @@ def emit(self, record):
215216

216217

217218
class ResilientFileSink:
218-
"""
219-
A file sink designed for resilience, capable of retrying write operations.
220-
221-
This class implements a resilient file writing mechanism that attempts to write messages to a file, retrying the operation a specified number of times if it fails. This is particularly useful in scenarios where write operations might intermittently fail due to temporary issues such as file system locks or networked file system delays.
222-
223-
Attributes:
224-
path (str): The path to the file where messages will be written.
225-
max_retries (int): The maximum number of retry attempts for a failed write operation.
226-
retry_delay (float): The delay between retry attempts, in seconds.
227-
228-
Methods:
229-
write(message): Attempts to write a message to the file, retrying on failure up to `max_retries` times.
230-
"""
231-
def __init__(self, path, max_retries=3, retry_delay=1.0, formatter=None, level=logging.INFO):
219+
def __init__(self, path, retry_count=5, retry_delay=1):
232220
self.path = path
233-
self.max_retries = max_retries
221+
self.retry_count = retry_count
234222
self.retry_delay = retry_delay
235-
self._formatter = formatter or logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
236-
self._level = level # Set the default logging level
237-
238-
@property
239-
def formatter(self):
240-
return self._formatter
241-
242-
@formatter.setter
243-
def formatter(self, value):
244-
self._formatter = value
223+
# Ensure the directory exists
224+
os.makedirs(os.path.dirname(path), exist_ok=True)
245225

246-
@property
247-
def level(self):
248-
return self._level
249-
250-
@level.setter
251-
def level(self, value):
252-
self._level = value
253-
254-
def _should_log(self, message_level):
255-
return message_level >= self._level
256-
257-
def _format_message(self, message):
258-
return self._formatter.format(message)
259-
260-
def write(self, message):
261-
if not self._should_log(message.level):
262-
return # Skip messages below the sink's level
263-
264-
for attempt in range(self.max_retries):
226+
def __call__(self, message):
227+
attempt = 0
228+
while attempt < self.retry_count:
265229
try:
266-
# Consider locking mechanism here for thread safety
230+
# Open the file in append mode and write the message
267231
with open(self.path, 'a') as file:
268-
file.write(self._format_message(message) + '\n')
269-
break # Exit loop on success
270-
except (IOError, PermissionError) as e:
271-
if attempt >= self.max_retries - 1:
272-
raise e # Reraise last exception after all retries
273-
time.sleep(self.retry_delay) # Wait before retrying
232+
file.write(message)
233+
break # Exit the loop if write succeeds
234+
except Exception as e:
235+
attempt += 1
236+
time.sleep(self.retry_delay)
237+
if attempt == self.retry_count:
238+
print(f"Failed to log message after {self.retry_count} attempts: {e}")
239+
274240

275241
if file_sink:
276-
# Create an instance of ResilientFileSink
242+
# Create an instance of ResilientFileSink if file_sink is True
277243
resilient_sink = ResilientFileSink(str(log_path))
278244

279-
# Configure the logger to use the ResilientFileSink
245+
# Append the ResilientFileSink instance to the handlers list
280246
basic_config_handlers.append(resilient_sink)
281247

282248
if intercept_standard_logging:
249+
# Append an InterceptHandler instance to the handlers list if intercept_standard_logging is True
283250
basic_config_handlers.append(InterceptHandler())
284251

252+
if len(basic_config_handlers) > 0:
253+
# Configure the root logger if there are any handlers specified
254+
logging.basicConfig(handlers=basic_config_handlers, level=logging_level.upper())
255+
285256
if len(basic_config_handlers) > 0:
286257
logging.basicConfig(handlers=basic_config_handlers, level=logging_level.upper())

0 commit comments

Comments
 (0)