Skip to content

Commit bbe4b3f

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

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
@@ -220,30 +220,42 @@ def fromDict(self, d):
220220
class 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

Comments
 (0)