Skip to content

Commit 49859d5

Browse files
committed
[core] add trace log level and add new "loglevel" internal input for node default log level
1 parent d794895 commit 49859d5

File tree

5 files changed

+49
-17
lines changed

5 files changed

+49
-17
lines changed

bin/meshroom_batch

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import re
88
import sys
99

1010
import meshroom.core.graph
11-
from meshroom import setupEnvironment
11+
from meshroom import setupEnvironment, logStringToPython
1212

1313
setupEnvironment()
1414

@@ -135,14 +135,6 @@ advanced_group.add_argument(
135135

136136
args = parser.parse_args()
137137

138-
logStringToPython = {
139-
'fatal': logging.FATAL,
140-
'error': logging.ERROR,
141-
'warning': logging.WARNING,
142-
'info': logging.INFO,
143-
'debug': logging.DEBUG,
144-
'trace': logging.DEBUG,
145-
}
146138
logging.getLogger().setLevel(logStringToPython[args.verbose])
147139

148140
if not args.input and not args.inputRecursive:

meshroom/__init__.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,32 @@ class VersionStatus(Enum):
4848

4949
useMultiChunks = util.strtobool(os.environ.get("MESHROOM_USE_MULTI_CHUNKS", "True"))
5050

51+
# Logging
52+
53+
def addTraceLevel():
54+
""" From https://stackoverflow.com/a/35804945 """
55+
levelName, methodName, levelNum = 'TRACE', 'trace', logging.DEBUG - 5
56+
if hasattr(logging, levelName) or hasattr(logging, methodName)or hasattr(logging.getLoggerClass(), methodName):
57+
return
58+
def logForLevel(self, message, *args, **kwargs):
59+
if self.isEnabledFor(levelNum):
60+
self._log(levelNum, message, args, **kwargs)
61+
def logToRoot(message, *args, **kwargs):
62+
logging.log(levelNum, message, *args, **kwargs)
63+
64+
logging.addLevelName(levelNum, levelName)
65+
setattr(logging, levelName, levelNum)
66+
setattr(logging.getLoggerClass(), methodName, logForLevel)
67+
setattr(logging, methodName, logToRoot)
68+
69+
addTraceLevel()
5170
logStringToPython = {
52-
'fatal': logging.FATAL,
71+
'fatal': logging.CRITICAL,
5372
'error': logging.ERROR,
5473
'warning': logging.WARNING,
5574
'info': logging.INFO,
5675
'debug': logging.DEBUG,
57-
'trace': logging.DEBUG,
76+
'trace': logging.TRACE,
5877
}
5978
logging.getLogger().setLevel(logStringToPython[os.environ.get('MESHROOM_VERBOSE', 'warning')])
6079

meshroom/core/desc/node.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import sys
1010

1111
from .computation import Level, StaticNodeSize
12-
from .attribute import StringParam, ColorParam
12+
from .attribute import StringParam, ColorParam, ChoiceParam
1313

1414
import meshroom
1515
from meshroom.core import cgroup
@@ -67,6 +67,14 @@ class BaseNode(object):
6767
value="",
6868
invalidate=False,
6969
),
70+
ChoiceParam(
71+
name='nodeDefaultLogLevel',
72+
label='Default logging level',
73+
description='''Default logging level for the node (critical, error, warning, info, debug).''',
74+
value='info',
75+
values=['critical', 'error', 'warning', 'info', 'debug', 'trace'],
76+
invalidate=False,
77+
),
7078
ColorParam(
7179
name="color",
7280
label="Color",

meshroom/core/node.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,8 @@ def completeProgressBar(self):
310310

311311
@staticmethod
312312
def textToLevel(text):
313-
if text == "critical":
313+
text = text.lower()
314+
if text in ["critical", "fatal"]:
314315
return logging.CRITICAL
315316
elif text == "error":
316317
return logging.ERROR
@@ -320,6 +321,8 @@ def textToLevel(text):
320321
return logging.INFO
321322
elif text == "debug":
322323
return logging.DEBUG
324+
elif text == "trace":
325+
return logging.TRACE
323326
else:
324327
return logging.NOTSET
325328

@@ -726,6 +729,15 @@ def getLabel(self):
726729
return label
727730
return self.getDefaultLabel()
728731

732+
def getNodeLogLevel(self):
733+
"""
734+
Returns:
735+
str: the user-provided log level used for logging on process launched by this node
736+
"""
737+
if self.hasInternalAttribute("nodeDefaultLogLevel"):
738+
return self.internalAttribute("nodeDefaultLogLevel").value.strip()
739+
return "info"
740+
729741
def getColor(self):
730742
"""
731743
Returns:
@@ -1346,8 +1358,7 @@ def prepareLogger(self, iteration=-1):
13461358
# Setup logger
13471359
rootLogger = logging.getLogger()
13481360
self._logManager = LogManager(rootLogger, logFile)
1349-
self._logManager.configureLogger()
1350-
rootLogger.setLevel(logging.INFO) # Set info by default
1361+
self._logManager.start(self.getNodeLogLevel())
13511362

13521363
def restoreLogger(self):
13531364
self._logManager.restorePreviousLogger()

meshroom/core/nodeFactory.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,13 +174,15 @@ def _checkAttributesCompatibility(
174174

175175
def _createNode(self) -> Node:
176176
logging.info(f"Creating node '{self.name}'")
177-
# TODO: user inputs/outputs may conflicts with internal names (like position, uid)
177+
# TODO: user inputs/outputs may conflicts with internal names (like logLevel, position, uid)
178+
# The line below can cause UI issues but at least prevent crashes
179+
internalInputs = {k: v for k, v in self.internalInputs.items() if k not in self.inputs.keys()}
178180
return Node(
179181
self.nodeType,
180182
position=self.position,
181183
uid=self.uid,
182184
**self.inputs,
183-
**self.internalInputs,
185+
**internalInputs,
184186
**self.outputs,
185187
)
186188

0 commit comments

Comments
 (0)