summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/msg.py
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2011-08-12 23:24:43 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2011-08-15 09:14:28 +0100
commit7ee93b206a6389e6eb7b9440dc2fae801c77bc9b (patch)
tree6700acff792125542187590c5633c61c29b1005b /bitbake/lib/bb/msg.py
parentfce0b963b437c5b0660dca6f5b0a099e4befa03c (diff)
downloadpoky-7ee93b206a6389e6eb7b9440dc2fae801c77bc9b.tar.gz
bitbake/logging: Overhaul internal logging process
At the moment it bugs me a lot that we only have one effective logging level for bitbake, despite the logging module having provision to do more advanced things. This patch: * Changes the core log level to the lowest level we have messages of (DEBUG-2) so messages always flow through the core logger * Allows build.py's task logging code to log all the output regardless of what output is on the console and sets this so log files now always contain debug level messages even if these don't appear on the console * Moves the verbose/debug/debug-domains code to be a UI side setting * Adds a filter to the UI to only print the user requested output. The result is more complete logfiles on disk but the usual output to the console. There are some behaviour changes intentionally made by this patch: a) the -v option now controls whether output is tee'd to the console. Ultimately, we likely want to output a message to the user about where the log file is and avoid placing output directly onto the console for every executing task. b) The functions get_debug_levels, the debug_levels variable, the set_debug_levels, the set_verbosity and set_debug_domains functions are removed from bb.msg. c) The "logging" init function changes format. d) All messages get fired to all handlers all the time leading to an increase in inter-process traffic. This could likely be hacked around short term with a function for a UI to only request events greater than level X. Longer term, having masks for event handlers would be better. e) logger.getEffectiveLevel() is no longer a reliable guide to what will/won't get logged so for now we look at the default log levels instead. [YOCTO #304] (Bitbake rev: 45aad2f9647df14bcfa5e755b57e1ddab377939a) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/msg.py')
-rw-r--r--bitbake/lib/bb/msg.py74
1 files changed, 45 insertions, 29 deletions
diff --git a/bitbake/lib/bb/msg.py b/bitbake/lib/bb/msg.py
index 12d19ff8e1..77a7a0fed2 100644
--- a/bitbake/lib/bb/msg.py
+++ b/bitbake/lib/bb/msg.py
@@ -75,6 +75,25 @@ class BBLogFormatter(logging.Formatter):
75 msg += '\n' + ''.join(formatted) 75 msg += '\n' + ''.join(formatted)
76 return msg 76 return msg
77 77
78class BBLogFilter(object):
79 def __init__(self, handler, level, debug_domains):
80 self.stdlevel = level
81 self.debug_domains = debug_domains
82 loglevel = level
83 for domain in debug_domains:
84 if debug_domains[domain] < loglevel:
85 loglevel = debug_domains[domain]
86 handler.setLevel(loglevel)
87 handler.addFilter(self)
88
89 def filter(self, record):
90 if record.levelno >= self.stdlevel:
91 return True
92 if record.name in self.debug_domains and record.levelno >= self.debug_domains[record.name]:
93 return True
94 return False
95
96
78class Loggers(dict): 97class Loggers(dict):
79 def __getitem__(self, key): 98 def __getitem__(self, key):
80 if key in self: 99 if key in self:
@@ -84,12 +103,6 @@ class Loggers(dict):
84 dict.__setitem__(self, key, log) 103 dict.__setitem__(self, key, log)
85 return log 104 return log
86 105
87class DebugLevel(dict):
88 def __getitem__(self, key):
89 if key == "default":
90 key = domain.Default
91 return get_debug_level(key)
92
93def _NamedTuple(name, fields): 106def _NamedTuple(name, fields):
94 Tuple = collections.namedtuple(name, " ".join(fields)) 107 Tuple = collections.namedtuple(name, " ".join(fields))
95 return Tuple(*range(len(fields))) 108 return Tuple(*range(len(fields)))
@@ -110,44 +123,47 @@ domain = _NamedTuple("Domain", (
110 "Util")) 123 "Util"))
111logger = logging.getLogger("BitBake") 124logger = logging.getLogger("BitBake")
112loggers = Loggers() 125loggers = Loggers()
113debug_level = DebugLevel()
114 126
115# Message control functions 127# Message control functions
116# 128#
117 129
118def set_debug_level(level): 130loggerDefaultDebugLevel = 0
119 for log in loggers.itervalues(): 131loggerDefaultVerbose = False
120 log.setLevel(logging.NOTSET) 132loggerDefaultDomains = []
121 133
122 if level: 134def init_msgconfig(verbose, debug, debug_domains = []):
123 logger.setLevel(logging.DEBUG - level + 1) 135 """
124 else: 136 Set default verbosity and debug levels config the logger
125 logger.setLevel(logging.INFO) 137 """
138 bb.msg.loggerDebugLevel = debug
139 bb.msg.loggerVerbose = verbose
140 bb.msg.loggerDefaultDomains = debug_domains
126 141
127def get_debug_level(msgdomain = domain.Default): 142def addDefaultlogFilter(handler):
128 if not msgdomain:
129 level = logger.getEffectiveLevel()
130 else:
131 level = loggers[msgdomain].getEffectiveLevel()
132 return max(0, logging.DEBUG - level + 1)
133 143
134def set_verbose(level): 144 debug = loggerDefaultDebugLevel
135 if level: 145 verbose = loggerDefaultVerbose
136 logger.setLevel(BBLogFormatter.VERBOSE) 146 domains = loggerDefaultDomains
147
148 if debug:
149 level = BBLogFormatter.DEBUG - debug + 1
150 elif verbose:
151 level = BBLogFormatter.VERBOSE
137 else: 152 else:
138 logger.setLevel(BBLogFormatter.INFO) 153 level = BBLogFormatter.NOTE
139 154
140def set_debug_domains(domainargs): 155 debug_domains = {}
141 for (domainarg, iterator) in groupby(domainargs): 156 for (domainarg, iterator) in groupby(domains):
157 dlevel = len(tuple(iterator))
158 debug_domains["BitBake.%s" % domainarg] = logging.DEBUG - dlevel + 1
142 for index, msgdomain in enumerate(domain._fields): 159 for index, msgdomain in enumerate(domain._fields):
143 if msgdomain == domainarg: 160 if msgdomain == domainarg:
144 level = len(tuple(iterator))
145 if level:
146 loggers[index].setLevel(logging.DEBUG - level + 1)
147 break 161 break
148 else: 162 else:
149 warn(None, "Logging domain %s is not valid, ignoring" % domainarg) 163 warn(None, "Logging domain %s is not valid, ignoring" % domainarg)
150 164
165 BBLogFilter(handler, level, debug_domains)
166
151# 167#
152# Message handling functions 168# Message handling functions
153# 169#