@@ -221,30 +221,42 @@ def fromDict(self, d):
221221class LogManager :
222222 dateTimeFormatting = '%H:%M:%S'
223223
224- def __init__ (self , chunk ):
225- self .chunk = chunk
226- self .logger = logging .getLogger (chunk .node .getName ())
227-
224+ def __init__ (self , logger , logFile ):
225+ self .logger = logger
226+ self .logFile = logFile
227+ self ._previousHandlers = []
228+ self ._previousLevel = 0
229+
228230 class Formatter (logging .Formatter ):
229231 def format (self , record ):
230232 # Make level name lower case
231233 record .levelname = record .levelname .lower ()
232234 return logging .Formatter .format (self , record )
233-
235+
234236 def configureLogger (self ):
237+ self ._previousLevel = self .logger .level
238+ self ._previousHandlers = []
235239 for handler in self .logger .handlers [:]:
240+ self ._previousHandlers .append (handler )
236241 self .logger .removeHandler (handler )
237- handler = logging .FileHandler (self .chunk . logFile )
242+ handler = logging .FileHandler (self .logFile )
238243 formatter = self .Formatter ('[%(asctime)s.%(msecs)03d][%(levelname)s] %(message)s' ,
239244 self .dateTimeFormatting )
240245 handler .setFormatter (formatter )
241246 self .logger .addHandler (handler )
247+
248+ def restorePreviousLogger (self ):
249+ for h in self .logger .handlers [:]:
250+ self .logger .removeHandler (h )
251+ for h in self ._previousHandlers :
252+ self .logger .addHandler (h )
253+ self .logger .setLevel (self ._previousLevel )
242254
243255 def start (self , level ):
244256 # Clear log file
245- open (self .chunk .logFile , 'w' ).close ()
246-
257+ open (self .logFile , 'w' ).close ()
247258 self .configureLogger ()
259+ self .logger .propagate = False
248260 self .logger .setLevel (self .textToLevel (level ))
249261 self .progressBar = False
250262
@@ -261,15 +273,15 @@ def makeProgressBar(self, end, message=''):
261273 self .currentProgressTics = 0
262274 self .progressBar = True
263275
264- with open (self .chunk . logFile , 'a' ) as f :
276+ with open (self .logFile , 'a' ) as f :
265277 if message :
266278 f .write (message + '\n ' )
267279 f .write ('0% 10 20 30 40 50 60 70 80 90 100%\n ' )
268280 f .write ('|----|----|----|----|----|----|----|----|----|----|\n \n ' )
269281
270282 f .close ()
271283
272- with open (self .chunk . logFile ) as f :
284+ with open (self .logFile ) as f :
273285 content = f .read ()
274286 self .progressBarPosition = content .rfind ('\n ' )
275287
@@ -281,7 +293,7 @@ def updateProgressBar(self, value):
281293
282294 tics = round ((value / self .progressEnd )* 51 )
283295
284- with open (self .chunk . logFile , 'r+' ) as f :
296+ with open (self .logFile , 'r+' ) as f :
285297 text = f .read ()
286298 for i in range (tics - self .currentProgressTics ):
287299 text = text [:self .progressBarPosition ]+ '*' + text [self .progressBarPosition :]
@@ -296,7 +308,8 @@ def completeProgressBar(self):
296308
297309 self .progressBar = False
298310
299- def textToLevel (self , text ):
311+ @staticmethod
312+ def textToLevel (text ):
300313 if text == "critical" :
301314 return logging .CRITICAL
302315 elif text == "error" :
@@ -325,7 +338,7 @@ def __init__(self, node, range, parent=None):
325338 super ().__init__ (parent )
326339 self .node = node
327340 self .range = range
328- self .logManager : LogManager = LogManager ( self )
341+ self ._logManager = None
329342 self ._status : StatusData = StatusData (node .name , node .nodeType , node .packageName ,
330343 node .packageVersion , node .getMrNodeType ())
331344 self .statistics : stats .Statistics = stats .Statistics ()
@@ -344,6 +357,13 @@ def name(self):
344357 return f"{ self .node .name } ({ self .index } )"
345358 else :
346359 return self .node .name
360+
361+ @property
362+ def logManager (self ):
363+ if self ._logManager is None :
364+ logger = logging .getLogger (self .node .getName ())
365+ self ._logManager = LogManager (logger , self .logFile )
366+ return self ._logManager
347367
348368 @property
349369 def statusName (self ):
@@ -660,6 +680,7 @@ def __init__(self, nodeType: str, position: Position = None, parent: BaseObject
660680 self ._uid : str = uid
661681 self ._cmdVars : dict = {}
662682 self ._size : int = 0
683+ self ._logManager : LogManager = None
663684 self ._position : Position = position or Position ()
664685 self ._attributes = DictModel (keyAttrName = 'name' , parent = self )
665686 self ._internalAttributes = DictModel (keyAttrName = 'name' , parent = self )
@@ -1312,6 +1333,25 @@ def postprocess(self):
13121333 # node is completed
13131334 self .nodeDesc .postprocess (self )
13141335
1336+ def getLogHandlers (self ):
1337+ return self ._handlers
1338+
1339+ def prepareLogger (self , iteration = - 1 ):
1340+ # Get file handler path
1341+ logFileName = "log"
1342+ if iteration != - 1 :
1343+ chunk = self .chunks [iteration ]
1344+ logFileName = str (chunk .index ) + ".log"
1345+ logFile = os .path .join (self .graph .cacheDir , self .internalFolder , logFileName )
1346+ # Setup logger
1347+ rootLogger = logging .getLogger ()
1348+ self ._logManager = LogManager (rootLogger , logFile )
1349+ self ._logManager .configureLogger ()
1350+ rootLogger .setLevel (logging .INFO ) # Set info by default
1351+
1352+ def restoreLogger (self ):
1353+ self ._logManager .restorePreviousLogger ()
1354+
13151355 def updateOutputAttr (self ):
13161356 if not self .nodeDesc :
13171357 return
0 commit comments