File size: 6,381 Bytes
985c397 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 | # SPDX-License-Identifier: LGPL-2.1-or-later
# ***************************************************************************
# * Copyright (c) 2016 sliptonic <shopinthewoods@gmail.com> *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU Lesser General Public License (LGPL) *
# * as published by the Free Software Foundation; either version 2 of *
# * the License, or (at your option) any later version. *
# * for detail see the LICENCE text file. *
# * *
# * This program is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU Library General Public License for more details. *
# * *
# * You should have received a copy of the GNU Library General Public *
# * License along with this program; if not, write to the Free Software *
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# * USA *
# * *
# ***************************************************************************
import FreeCAD
import os
import traceback
class Level:
"""Enumeration of log levels, used for setLevel and getLevel."""
RESET = -1
ERROR = 0
WARNING = 1
NOTICE = 2
INFO = 3
DEBUG = 4
_names = {
ERROR: "ERROR",
WARNING: "WARNING",
NOTICE: "NOTICE",
INFO: "INFO",
DEBUG: "DEBUG",
}
@classmethod
def toString(cls, level):
return cls._names.get(level, "UNKNOWN")
_defaultLogLevel = Level.NOTICE
_moduleLogLevel = {}
_useConsole = True
_trackModule = {}
_trackAll = False
def logToConsole(yes):
"""(boolean) - if set to True (default behaviour) log messages are printed to the console. Otherwise they are printed to stdout."""
global _useConsole
_useConsole = yes
def setLevel(level, module=None):
"""(level, module = None)
if no module is specified the default log level is set.
Otherwise the module specific log level is changed (use RESET to clear)."""
global _defaultLogLevel
global _moduleLogLevel
if module:
if level == Level.RESET:
if _moduleLogLevel.get(module, -1) != -1:
del _moduleLogLevel[module]
else:
_moduleLogLevel[module] = level
else:
if level == Level.RESET:
_defaultLogLevel = Level.NOTICE
_moduleLogLevel = {}
else:
_defaultLogLevel = level
def getLevel(module=None):
"""(module = None) - return the global (None) or module specific log level."""
if module:
return _moduleLogLevel.get(module, _defaultLogLevel)
return _defaultLogLevel
def thisModule():
"""returns the module id of the caller, can be used for setLevel, getLevel and trackModule."""
return _caller()[0]
def _caller():
"""internal function to determine the calling module."""
filename, line, func, text = traceback.extract_stack(limit=3)[0]
return os.path.splitext(os.path.basename(filename))[0], line, func
def _log(level, module_line_func, msg):
"""internal function to do the logging"""
module, line, func = module_line_func
if getLevel(module) >= level:
message = "%s.%s: %s" % (module, Level.toString(level), msg)
if _useConsole:
message += "\n"
if level == Level.NOTICE:
FreeCAD.Console.PrintLog(message)
elif level == Level.WARNING:
FreeCAD.Console.PrintWarning(message)
elif level == Level.ERROR:
FreeCAD.Console.PrintError(message)
else:
FreeCAD.Console.PrintMessage(message)
else:
print(message)
return message
return None
def debug(msg):
"""(message)"""
caller_info = _caller()
_, line, _ = caller_info
msg = "({}) - {}".format(line, msg)
return _log(Level.DEBUG, caller_info, msg)
def info(msg):
"""(message)"""
return _log(Level.INFO, _caller(), msg)
def notice(msg):
"""(message)"""
return _log(Level.NOTICE, _caller(), msg)
def warning(msg):
"""(message)"""
return _log(Level.WARNING, _caller(), msg)
def error(msg):
"""(message)"""
return _log(Level.ERROR, _caller(), msg)
def trackAllModules(boolean):
"""(boolean) - if True all modules will be tracked, otherwise tracking is up to the module setting."""
global _trackAll
_trackAll = boolean
def untrackAllModules():
"""In addition to stop tracking all modules it also clears the tracking flag for all individual modules."""
global _trackAll
global _trackModule
_trackAll = False
_trackModule = {}
def trackModule(module=None):
"""(module = None) - start tracking given module, current module if not set."""
global _trackModule
if module:
_trackModule[module] = True
else:
mod, line, func = _caller()
_trackModule[mod] = True
def untrackModule(module=None):
"""(module = None) - stop tracking given module, current module if not set."""
global _trackModule
if module and _trackModule.get(module, None):
del _trackModule[module]
elif not module:
mod, line, func = _caller()
if _trackModule.get(mod, None):
del _trackModule[mod]
def track(*args):
"""(....) - call with arguments of current function you want logged if tracking is enabled."""
module, line, func = _caller()
if _trackAll or _trackModule.get(module, None):
message = "%s(%d).%s(%s)" % (
module,
line,
func,
", ".join([str(arg) for arg in args]),
)
if _useConsole:
FreeCAD.Console.PrintMessage(message + "\n")
else:
print(message)
return message
return None
|