Skip to content

Commit 3219be3

Browse files
committed
working on resilent sink
1 parent c402f89 commit 3219be3

File tree

2 files changed

+49
-190
lines changed

2 files changed

+49
-190
lines changed

coverage.xml

Lines changed: 23 additions & 180 deletions
Original file line numberDiff line numberDiff line change
@@ -1,180 +1,11 @@
11
<?xml version="1.0" ?>
2-
<coverage version="7.6.0" timestamp="1721528322732" lines-valid="853" lines-covered="187" line-rate="0.2192" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0">
2+
<coverage version="7.6.0" timestamp="1721529816847" lines-valid="705" lines-covered="187" line-rate="0.2652" 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>
66
<source>/workspaces/devsetgo_lib</source>
77
</sources>
88
<packages>
9-
<package name="." line-rate="0" branch-rate="0" complexity="0">
10-
<classes>
11-
<class name="fastapi_example.py" filename="fastapi_example.py" complexity="0" line-rate="0" branch-rate="0">
12-
<methods/>
13-
<lines>
14-
<line number="7" hits="0"/>
15-
<line number="8" hits="0"/>
16-
<line number="9" hits="0"/>
17-
<line number="10" hits="0"/>
18-
<line number="12" hits="0"/>
19-
<line number="13" hits="0"/>
20-
<line number="14" hits="0"/>
21-
<line number="15" hits="0"/>
22-
<line number="16" hits="0"/>
23-
<line number="17" hits="0"/>
24-
<line number="18" hits="0"/>
25-
<line number="19" hits="0"/>
26-
<line number="21" hits="0"/>
27-
<line number="27" hits="0"/>
28-
<line number="29" hits="0"/>
29-
<line number="32" hits="0"/>
30-
<line number="33" hits="0"/>
31-
<line number="34" hits="0"/>
32-
<line number="36" hits="0"/>
33-
<line number="38" hits="0"/>
34-
<line number="39" hits="0"/>
35-
<line number="40" hits="0"/>
36-
<line number="41" hits="0"/>
37-
<line number="42" hits="0"/>
38-
<line number="46" hits="0"/>
39-
<line number="60" hits="0"/>
40-
<line number="61" hits="0"/>
41-
<line number="68" hits="0"/>
42-
<line number="69" hits="0"/>
43-
<line number="70" hits="0"/>
44-
<line number="74" hits="0"/>
45-
<line number="79" hits="0"/>
46-
<line number="86" hits="0"/>
47-
<line number="98" hits="0"/>
48-
<line number="100" hits="0"/>
49-
<line number="103" hits="0"/>
50-
<line number="106" hits="0"/>
51-
<line number="111" hits="0"/>
52-
<line number="112" hits="0"/>
53-
<line number="116" hits="0"/>
54-
<line number="117" hits="0"/>
55-
<line number="118" hits="0"/>
56-
<line number="121" hits="0"/>
57-
<line number="126" hits="0"/>
58-
<line number="131" hits="0"/>
59-
<line number="132" hits="0"/>
60-
<line number="136" hits="0"/>
61-
<line number="137" hits="0"/>
62-
<line number="138" hits="0"/>
63-
<line number="139" hits="0"/>
64-
<line number="140" hits="0"/>
65-
<line number="143" hits="0"/>
66-
<line number="144" hits="0"/>
67-
<line number="145" hits="0"/>
68-
<line number="150" hits="0"/>
69-
<line number="151" hits="0"/>
70-
<line number="152" hits="0"/>
71-
<line number="157" hits="0"/>
72-
<line number="158" hits="0"/>
73-
<line number="160" hits="0"/>
74-
<line number="162" hits="0"/>
75-
<line number="163" hits="0"/>
76-
<line number="164" hits="0"/>
77-
<line number="165" hits="0"/>
78-
<line number="170" hits="0"/>
79-
<line number="171" hits="0"/>
80-
<line number="174" hits="0"/>
81-
<line number="177" hits="0"/>
82-
<line number="178" hits="0"/>
83-
<line number="179" hits="0"/>
84-
<line number="180" hits="0"/>
85-
<line number="181" hits="0"/>
86-
<line number="182" hits="0"/>
87-
<line number="185" hits="0"/>
88-
<line number="186" hits="0"/>
89-
<line number="187" hits="0"/>
90-
<line number="188" hits="0"/>
91-
<line number="189" hits="0"/>
92-
<line number="190" hits="0"/>
93-
<line number="193" hits="0"/>
94-
<line number="194" hits="0"/>
95-
<line number="195" hits="0"/>
96-
<line number="196" hits="0"/>
97-
<line number="197" hits="0"/>
98-
<line number="198" hits="0"/>
99-
<line number="201" hits="0"/>
100-
<line number="202" hits="0"/>
101-
<line number="203" hits="0"/>
102-
<line number="204" hits="0"/>
103-
<line number="205" hits="0"/>
104-
<line number="206" hits="0"/>
105-
<line number="209" hits="0"/>
106-
<line number="210" hits="0"/>
107-
<line number="211" hits="0"/>
108-
<line number="212" hits="0"/>
109-
<line number="213" hits="0"/>
110-
<line number="214" hits="0"/>
111-
<line number="217" hits="0"/>
112-
<line number="218" hits="0"/>
113-
<line number="219" hits="0"/>
114-
<line number="220" hits="0"/>
115-
<line number="221" hits="0"/>
116-
<line number="222" hits="0"/>
117-
<line number="225" hits="0"/>
118-
<line number="226" hits="0"/>
119-
<line number="227" hits="0"/>
120-
<line number="228" hits="0"/>
121-
<line number="231" hits="0"/>
122-
<line number="232" hits="0"/>
123-
<line number="235" hits="0"/>
124-
<line number="236" hits="0"/>
125-
<line number="237" hits="0"/>
126-
<line number="238" hits="0"/>
127-
<line number="239" hits="0"/>
128-
<line number="240" hits="0"/>
129-
<line number="241" hits="0"/>
130-
<line number="244" hits="0"/>
131-
<line number="245" hits="0"/>
132-
<line number="246" hits="0"/>
133-
<line number="247" hits="0"/>
134-
<line number="248" hits="0"/>
135-
<line number="250" hits="0"/>
136-
<line number="251" hits="0"/>
137-
<line number="252" hits="0"/>
138-
<line number="253" hits="0"/>
139-
<line number="258" hits="0"/>
140-
<line number="259" hits="0"/>
141-
<line number="262" hits="0"/>
142-
<line number="263" hits="0"/>
143-
<line number="264" hits="0"/>
144-
<line number="265" hits="0"/>
145-
<line number="266" hits="0"/>
146-
<line number="269" hits="0"/>
147-
<line number="270" hits="0"/>
148-
<line number="280" hits="0"/>
149-
<line number="283" hits="0"/>
150-
<line number="289" hits="0"/>
151-
<line number="290" hits="0"/>
152-
<line number="291" hits="0"/>
153-
<line number="294" hits="0"/>
154-
<line number="295" hits="0"/>
155-
<line number="296" hits="0"/>
156-
<line number="297" hits="0"/>
157-
<line number="298" hits="0"/>
158-
<line number="299" hits="0"/>
159-
<line number="302" hits="0"/>
160-
<line number="307" hits="0"/>
161-
<line number="308" hits="0"/>
162-
<line number="309" hits="0"/>
163-
<line number="310" hits="0"/>
164-
<line number="311" hits="0"/>
165-
<line number="314" hits="0"/>
166-
<line number="318" hits="0"/>
167-
<line number="321" hits="0"/>
168-
<line number="322" hits="0"/>
169-
<line number="323" hits="0"/>
170-
<line number="324" hits="0"/>
171-
<line number="325" hits="0"/>
172-
<line number="326" hits="0"/>
173-
<line number="327" hits="0"/>
174-
</lines>
175-
</class>
176-
</classes>
177-
</package>
1789
<package name="dsg_lib" line-rate="1" branch-rate="0" complexity="0">
17910
<classes>
18011
<class name="__init__.py" filename="dsg_lib/__init__.py" complexity="0" line-rate="1" branch-rate="0">
@@ -480,7 +311,7 @@
480311
</class>
481312
</classes>
482313
</package>
483-
<package name="dsg_lib.common_functions" line-rate="0.1433" branch-rate="0" complexity="0">
314+
<package name="dsg_lib.common_functions" line-rate="0.1387" branch-rate="0" complexity="0">
484315
<classes>
485316
<class name="__init__.py" filename="dsg_lib/common_functions/__init__.py" complexity="0" line-rate="1" branch-rate="0">
486317
<methods/>
@@ -790,7 +621,7 @@
790621
<line number="231" hits="0"/>
791622
</lines>
792623
</class>
793-
<class name="logging_config.py" filename="dsg_lib/common_functions/logging_config.py" complexity="0" line-rate="0.09677" branch-rate="0">
624+
<class name="logging_config.py" filename="dsg_lib/common_functions/logging_config.py" complexity="0" line-rate="0.08108" branch-rate="0">
794625
<methods/>
795626
<lines>
796627
<line number="33" hits="1"/>
@@ -831,30 +662,42 @@
831662
<line number="233" hits="0"/>
832663
<line number="234" hits="0"/>
833664
<line number="235" hits="0"/>
834-
<line number="237" hits="0"/>
665+
<line number="236" hits="0"/>
835666
<line number="238" hits="0"/>
836667
<line number="239" hits="0"/>
837-
<line number="241" hits="0"/>
668+
<line number="240" hits="0"/>
838669
<line number="242" hits="0"/>
839670
<line number="243" hits="0"/>
840-
<line number="245" hits="0"/>
671+
<line number="244" hits="0"/>
841672
<line number="246" hits="0"/>
842673
<line number="247" hits="0"/>
843674
<line number="248" hits="0"/>
844-
<line number="249" hits="0"/>
845675
<line number="250" hits="0"/>
846676
<line number="251" hits="0"/>
847677
<line number="252" hits="0"/>
848-
<line number="253" hits="0"/>
849678
<line number="254" hits="0"/>
850-
<line number="256" hits="0"/>
851-
<line number="259" hits="0"/>
679+
<line number="255" hits="0"/>
680+
<line number="257" hits="0"/>
681+
<line number="258" hits="0"/>
682+
<line number="260" hits="0"/>
852683
<line number="261" hits="0"/>
684+
<line number="262" hits="0"/>
853685
<line number="264" hits="0"/>
854-
<line number="266" hits="0"/>
686+
<line number="265" hits="0"/>
855687
<line number="267" hits="0"/>
688+
<line number="268" hits="0"/>
856689
<line number="269" hits="0"/>
857690
<line number="270" hits="0"/>
691+
<line number="271" hits="0"/>
692+
<line number="272" hits="0"/>
693+
<line number="273" hits="0"/>
694+
<line number="275" hits="0"/>
695+
<line number="277" hits="0"/>
696+
<line number="280" hits="0"/>
697+
<line number="282" hits="0"/>
698+
<line number="283" hits="0"/>
699+
<line number="285" hits="0"/>
700+
<line number="286" hits="0"/>
858701
</lines>
859702
</class>
860703
<class name="patterns.py" filename="dsg_lib/common_functions/patterns.py" complexity="0" line-rate="0.1765" branch-rate="0">

dsg_lib/common_functions/logging_config.py

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -228,11 +228,12 @@ class ResilientFileSink:
228228
Methods:
229229
write(message): Attempts to write a message to the file, retrying on failure up to `max_retries` times.
230230
"""
231-
def __init__(self, path, max_retries=3, retry_delay=1.0, formatter=None):
231+
def __init__(self, path, max_retries=3, retry_delay=1.0, formatter=None, level=logging.INFO):
232232
self.path = path
233233
self.max_retries = max_retries
234234
self.retry_delay = retry_delay
235235
self._formatter = formatter or logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
236+
self._level = level # Set the default logging level
236237

237238
@property
238239
def formatter(self):
@@ -242,19 +243,34 @@ def formatter(self):
242243
def formatter(self, value):
243244
self._formatter = value
244245

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+
245260
def write(self, message):
261+
if not self._should_log(message.level):
262+
return # Skip messages below the sink's level
263+
246264
for attempt in range(self.max_retries):
247265
try:
266+
# Consider locking mechanism here for thread safety
248267
with open(self.path, 'a') as file:
249-
formatted_message = self.formatter.format(message) if self._formatter else message
250-
file.write(formatted_message + '\n') # Ensure newline
251-
break # Successfully written, break the loop
252-
except FileNotFoundError:
253-
if attempt < self.max_retries - 1:
254-
time.sleep(self.retry_delay) # Wait before retrying
255-
else:
256-
raise # Reraise if max retries exceeded
257-
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
258274

259275
if file_sink:
260276
# Create an instance of ResilientFileSink

0 commit comments

Comments
 (0)