Skip to content

Commit a168e9a

Browse files
committed
Setup root logger so that we can use logging in nodes
1 parent e704e5b commit a168e9a

File tree

2 files changed

+55
-13
lines changed

2 files changed

+55
-13
lines changed

bin/meshroom_compute

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,13 +95,15 @@ if args.node:
9595
# Restore the log level
9696
logging.getLogger().setLevel(meshroom.logStringToPython[args.verbose])
9797

98+
node.prepareLogger(args.iteration)
9899
node.preprocess()
99100
if args.iteration != -1:
100101
chunk = node.chunks[args.iteration]
101102
chunk.process(args.forceCompute, args.inCurrentEnv)
102103
else:
103104
node.process(args.forceCompute, args.inCurrentEnv)
104105
node.postprocess()
106+
node.restoreLogger()
105107
else:
106108
if args.iteration != -1:
107109
print('Error: "--iteration" only make sense when used with "--node".')

meshroom/core/node.py

Lines changed: 53 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -221,30 +221,42 @@ def fromDict(self, d):
221221
class 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

Comments
 (0)