@@ -220,30 +220,42 @@ def fromDict(self, d):
220220class LogManager :
221221 dateTimeFormatting = '%H:%M:%S'
222222
223- def __init__ (self , chunk ):
224- self .chunk = chunk
225- self .logger = logging .getLogger (chunk .node .getName ())
226-
223+ def __init__ (self , logger , logFile ):
224+ self .logger = logger
225+ self .logFile = logFile
226+ self ._previousHandlers = []
227+ self ._previousLevel = 0
228+
227229 class Formatter (logging .Formatter ):
228230 def format (self , record ):
229231 # Make level name lower case
230232 record .levelname = record .levelname .lower ()
231233 return logging .Formatter .format (self , record )
232-
234+
233235 def configureLogger (self ):
236+ self ._previousLevel = self .logger .level
237+ self ._previousHandlers = []
234238 for handler in self .logger .handlers [:]:
239+ self ._previousHandlers .append (handler )
235240 self .logger .removeHandler (handler )
236- handler = logging .FileHandler (self .chunk . logFile )
241+ handler = logging .FileHandler (self .logFile )
237242 formatter = self .Formatter ('[%(asctime)s.%(msecs)03d][%(levelname)s] %(message)s' ,
238243 self .dateTimeFormatting )
239244 handler .setFormatter (formatter )
240245 self .logger .addHandler (handler )
246+
247+ def restorePreviousLogger (self ):
248+ for h in self .logger .handlers [:]:
249+ self .logger .removeHandler (h )
250+ for h in self ._previousHandlers :
251+ self .logger .addHandler (h )
252+ self .logger .setLevel (self ._previousLevel )
241253
242254 def start (self , level ):
243255 # Clear log file
244- open (self .chunk .logFile , 'w' ).close ()
245-
256+ open (self .logFile , 'w' ).close ()
246257 self .configureLogger ()
258+ self .logger .propagate = False
247259 self .logger .setLevel (self .textToLevel (level ))
248260 self .progressBar = False
249261
@@ -260,15 +272,15 @@ def makeProgressBar(self, end, message=''):
260272 self .currentProgressTics = 0
261273 self .progressBar = True
262274
263- with open (self .chunk . logFile , 'a' ) as f :
275+ with open (self .logFile , 'a' ) as f :
264276 if message :
265277 f .write (message + '\n ' )
266278 f .write ('0% 10 20 30 40 50 60 70 80 90 100%\n ' )
267279 f .write ('|----|----|----|----|----|----|----|----|----|----|\n \n ' )
268280
269281 f .close ()
270282
271- with open (self .chunk . logFile ) as f :
283+ with open (self .logFile ) as f :
272284 content = f .read ()
273285 self .progressBarPosition = content .rfind ('\n ' )
274286
@@ -280,7 +292,7 @@ def updateProgressBar(self, value):
280292
281293 tics = round ((value / self .progressEnd )* 51 )
282294
283- with open (self .chunk . logFile , 'r+' ) as f :
295+ with open (self .logFile , 'r+' ) as f :
284296 text = f .read ()
285297 for i in range (tics - self .currentProgressTics ):
286298 text = text [:self .progressBarPosition ]+ '*' + text [self .progressBarPosition :]
@@ -295,7 +307,8 @@ def completeProgressBar(self):
295307
296308 self .progressBar = False
297309
298- def textToLevel (self , text ):
310+ @staticmethod
311+ def textToLevel (text ):
299312 if text == "critical" :
300313 return logging .CRITICAL
301314 elif text == "error" :
@@ -324,7 +337,7 @@ def __init__(self, node, range, parent=None):
324337 super ().__init__ (parent )
325338 self .node = node
326339 self .range = range
327- self .logManager : LogManager = LogManager ( self )
340+ self ._logManager = None
328341 self ._status : StatusData = StatusData (node .name , node .nodeType , node .packageName ,
329342 node .packageVersion , node .getMrNodeType ())
330343 self .statistics : stats .Statistics = stats .Statistics ()
@@ -343,6 +356,13 @@ def name(self):
343356 return f"{ self .node .name } ({ self .index } )"
344357 else :
345358 return self .node .name
359+
360+ @property
361+ def logManager (self ):
362+ if self ._logManager is None :
363+ logger = logging .getLogger (self .node .getName ())
364+ self ._logManager = LogManager (logger , self .logFile )
365+ return self ._logManager
346366
347367 @property
348368 def statusName (self ):
@@ -659,6 +679,7 @@ def __init__(self, nodeType: str, position: Position = None, parent: BaseObject
659679 self ._uid : str = uid
660680 self ._cmdVars : dict = {}
661681 self ._size : int = 0
682+ self ._logManager : LogManager = None
662683 self ._position : Position = position or Position ()
663684 self ._attributes = DictModel (keyAttrName = 'name' , parent = self )
664685 self ._internalAttributes = DictModel (keyAttrName = 'name' , parent = self )
@@ -1281,6 +1302,25 @@ def postprocess(self):
12811302 # node is completed
12821303 self .nodeDesc .postprocess (self )
12831304
1305+ def getLogHandlers (self ):
1306+ return self ._handlers
1307+
1308+ def prepareLogger (self , iteration = - 1 ):
1309+ # Get file handler path
1310+ logFileName = "log"
1311+ if iteration != - 1 :
1312+ chunk = self .chunks [iteration ]
1313+ logFileName = str (chunk .index ) + ".log"
1314+ logFile = os .path .join (self .graph .cacheDir , self .internalFolder , logFileName )
1315+ # Setup logger
1316+ rootLogger = logging .getLogger ()
1317+ self ._logManager = LogManager (rootLogger , logFile )
1318+ self ._logManager .configureLogger ()
1319+ rootLogger .setLevel (logging .INFO ) # Set info by default
1320+
1321+ def restoreLogger (self ):
1322+ self ._logManager .restorePreviousLogger ()
1323+
12841324 def updateOutputAttr (self ):
12851325 if not self .nodeDesc :
12861326 return
0 commit comments