LSSTApplications  16.0-11-g09ed895+2,16.0-11-g12e47bd,16.0-11-g9bb73b2+6,16.0-12-g5c924a4+6,16.0-14-g9a974b3+1,16.0-15-g1417920+1,16.0-15-gdd5ca33+1,16.0-16-gf0259e2,16.0-17-g31abd91+7,16.0-17-g7d7456e+7,16.0-17-ga3d2e9f+13,16.0-18-ga4d4bcb+1,16.0-18-gd06566c+1,16.0-2-g0febb12+21,16.0-2-g9d5294e+69,16.0-2-ga8830df+6,16.0-20-g21842373+7,16.0-24-g3eae5ec,16.0-28-gfc9ea6c+4,16.0-29-ge8801f9,16.0-3-ge00e371+34,16.0-4-g18f3627+13,16.0-4-g5f3a788+20,16.0-4-ga3eb747+10,16.0-4-gabf74b7+29,16.0-4-gb13d127+6,16.0-49-g42e581f7+6,16.0-5-g27fb78a+7,16.0-5-g6a53317+34,16.0-5-gb3f8a4b+87,16.0-6-g9321be7+4,16.0-6-gcbc7b31+42,16.0-6-gf49912c+29,16.0-7-gd2eeba5+51,16.0-71-ge89f8615e,16.0-8-g21fd5fe+29,16.0-8-g3a9f023+20,16.0-8-g4734f7a+1,16.0-8-g5858431+3,16.0-9-gf5c1f43+8,master-gd73dc1d098+1,w.2019.01
LSSTDataManagementBasePackage
logContinued.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 #
4 # LSST Data Management System
5 # Copyright 2013 LSST Corporation.
6 #
7 # This product includes software developed by the
8 # LSST Project (http://www.lsst.org/).
9 #
10 # This program is free software: you can redistribute it and/or modify
11 # it under the terms of the GNU General Public License as published by
12 # the Free Software Foundation, either version 3 of the License, or
13 # (at your option) any later version.
14 #
15 # This program is distributed in the hope that it will be useful,
16 # but WITHOUT ANY WARRANTY; without even the implied warranty of
17 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 # GNU General Public License for more details.
19 #
20 # You should have received a copy of the LSST License Statement and
21 # the GNU General Public License along with this program. If not,
22 # see <http://www.lsstcorp.org/LegalNotices/>.
23 #
24 
25 import logging
26 import inspect
27 import os
28 
29 from lsst.utils import continueClass
30 
31 from .log import Log
32 
33 TRACE = 5000
34 DEBUG = 10000
35 INFO = 20000
36 WARN = 30000
37 ERROR = 40000
38 FATAL = 50000
39 
40 
41 @continueClass # noqa F811 redefinition
42 class Log:
43  def trace(self, fmt, *args):
44  self._log(Log.TRACE, False, fmt, *args)
45 
46  def debug(self, fmt, *args):
47  self._log(Log.DEBUG, False, fmt, *args)
48 
49  def info(self, fmt, *args):
50  self._log(Log.INFO, False, fmt, *args)
51 
52  def warn(self, fmt, *args):
53  self._log(Log.WARN, False, fmt, *args)
54 
55  def error(self, fmt, *args):
56  self._log(Log.ERROR, False, fmt, *args)
57 
58  def fatal(self, fmt, *args):
59  self._log(Log.FATAL, False, fmt, *args)
60 
61  def tracef(self, fmt, *args, **kwargs):
62  self._log(Log.TRACE, True, fmt, *args, **kwargs)
63 
64  def debugf(self, fmt, *args, **kwargs):
65  self._log(Log.DEBUG, True, fmt, *args, **kwargs)
66 
67  def infof(self, fmt, *args, **kwargs):
68  self._log(Log.INFO, True, fmt, *args, **kwargs)
69 
70  def warnf(self, fmt, *args, **kwargs):
71  self._log(Log.WARN, True, fmt, *args, **kwargs)
72 
73  def errorf(self, fmt, *args, **kwargs):
74  self._log(Log.ERROR, True, fmt, *args, **kwargs)
75 
76  def fatalf(self, fmt, *args, **kwargs):
77  self._log(Log.FATAL, True, fmt, *args, **kwargs)
78 
79  def _log(self, level, use_format, fmt, *args, **kwargs):
80  if self.isEnabledFor(level):
81  frame = inspect.currentframe().f_back # calling method
82  frame = frame.f_back # original log location
83  filename = os.path.split(frame.f_code.co_filename)[1]
84  funcname = frame.f_code.co_name
85  if use_format:
86  msg = fmt.format(*args, **kwargs) if args or kwargs else fmt
87  else:
88  msg = fmt % args if args else fmt
89  self.logMsg(level, filename, funcname, frame.f_lineno, msg)
90 
91 
92 # Export static functions from Log class to module namespace
93 
94 
95 def configure(*args):
96  Log.configure(*args)
97 
98 
99 def configure_prop(properties):
100  Log.configure_prop(properties)
101 
102 
104  return Log.getDefaultLoggerName()
105 
106 
107 def pushContext(name):
108  Log.pushContext(name)
109 
110 
112  Log.popContext()
113 
114 
115 def MDC(key, value):
116  Log.MDC(key, str(value))
117 
118 
119 def MDCRemove(key):
120  Log.MDCRemove(key)
121 
122 
123 def MDCRegisterInit(func):
124  Log.MDCRegisterInit(func)
125 
126 
127 def setLevel(loggername, level):
128  Log.getLogger(loggername).setLevel(level)
129 
130 
131 def getLevel(loggername):
132  Log.getLogger(loggername).getLevel()
133 
134 
135 def isEnabledFor(logger, level):
136  Log.getLogger(logger).isEnabledFor(level)
137 
138 
139 def log(loggername, level, fmt, *args, **kwargs):
140  Log.getLogger(loggername)._log(level, False, fmt, *args)
141 
142 
143 def trace(fmt, *args):
144  Log.getDefaultLogger()._log(TRACE, False, fmt, *args)
145 
146 
147 def debug(fmt, *args):
148  Log.getDefaultLogger()._log(DEBUG, False, fmt, *args)
149 
150 
151 def info(fmt, *args):
152  Log.getDefaultLogger()._log(INFO, False, fmt, *args)
153 
154 
155 def warn(fmt, *args):
156  Log.getDefaultLogger()._log(WARN, False, fmt, *args)
157 
158 
159 def error(fmt, *args):
160  Log.getDefaultLogger()._log(ERROR, False, fmt, *args)
161 
162 
163 def fatal(fmt, *args):
164  Log.getDefaultLogger()._log(FATAL, False, fmt, *args)
165 
166 
167 def logf(loggername, level, fmt, *args, **kwargs):
168  Log.getLogger(loggername)._log(level, True, fmt, *args, **kwargs)
169 
170 
171 def tracef(fmt, *args, **kwargs):
172  Log.getDefaultLogger()._log(TRACE, True, fmt, *args, **kwargs)
173 
174 
175 def debugf(fmt, *args, **kwargs):
176  Log.getDefaultLogger()._log(DEBUG, True, fmt, *args, **kwargs)
177 
178 
179 def infof(fmt, *args, **kwargs):
180  Log.getDefaultLogger()._log(INFO, True, fmt, *args, **kwargs)
181 
182 
183 def warnf(fmt, *args, **kwargs):
184  Log.getDefaultLogger()._log(WARN, True, fmt, *args, **kwargs)
185 
186 
187 def errorf(fmt, *args, **kwargs):
188  Log.getDefaultLogger()._log(ERROR, True, fmt, *args, **kwargs)
189 
190 
191 def fatalf(fmt, *args, **kwargs):
192  Log.getDefaultLogger()._log(FATAL, True, fmt, *args, **kwargs)
193 
194 
195 def lwpID():
196  return Log.lwpID
197 
198 
200  """Context manager for logging."""
201 
202  def __init__(self, name=None, level=None):
203  self.name = name
204  self.level = level
205 
206  def __enter__(self):
207  self.open()
208  return self
209 
210  def __exit__(self, type, value, traceback):
211  self.close()
212 
213  def __del__(self):
214  self.close()
215 
216  def open(self):
217  if self.name is not None:
218  Log.pushContext(self.name)
219  if self.level is not None:
220  Log.getDefaultLogger().setLevel(self.level)
221 
222  def close(self):
223  if self.name is not None:
224  Log.popContext()
225  self.name = None
226 
227  def setLevel(self, level):
228  Log.getDefaultLogger().setLevel(level)
229 
230  def getLevel(self):
231  return Log.getDefaultLogger().getLevel()
232 
233  def isEnabledFor(self, level):
234  return Log.getDefaultLogger().isEnabledFor(level)
235 
236 
237 class LogHandler(logging.Handler):
238  """Handler for Python logging module that emits to LSST logging."""
239 
240  def __init__(self, name=None, level=None):
241  self.context = LogContext(name=name, level=level)
242  self.context.open()
243  logging.Handler.__init__(self)
244 
245  def __del__(self):
246  self.close()
247 
248  def close(self):
249  if self.context is not None:
250  self.context.close()
251  self.context = None
252  logging.Handler.close(self)
253 
254  def handle(self, record):
255  if self.context.isEnabledFor(self.translateLevel(record.levelno)):
256  logging.Handler.handle(self, record)
257 
258  def emit(self, record):
259  Log.getLogger(record.name).logMsg(self.translateLevel(record.levelno),
260  record.filename, record.funcName,
261  record.lineno,
262  record.msg % record.args)
263 
264  def translateLevel(self, levelno):
265  """
266  Translates from standard python logging module levels
267  to standard log4cxx levels.
268  """
269  return levelno*1000
def debug(self, fmt, args)
Definition: logContinued.py:46
def trace(self, fmt, args)
Definition: logContinued.py:43
def infof(fmt, args, kwargs)
def errorf(fmt, args, kwargs)
def errorf(self, fmt, args, kwargs)
Definition: logContinued.py:73
def __exit__(self, type, value, traceback)
def fatalf(fmt, args, kwargs)
def debugf(self, fmt, args, kwargs)
Definition: logContinued.py:64
def _log(self, level, use_format, fmt, args, kwargs)
Definition: logContinued.py:79
def __init__(self, name=None, level=None)
def getLevel(loggername)
def fatal(self, fmt, args)
Definition: logContinued.py:58
def tracef(self, fmt, args, kwargs)
Definition: logContinued.py:61
def warn(self, fmt, args)
Definition: logContinued.py:52
def setLevel(loggername, level)
def warnf(fmt, args, kwargs)
def infof(self, fmt, args, kwargs)
Definition: logContinued.py:67
def warnf(self, fmt, args, kwargs)
Definition: logContinued.py:70
def fatalf(self, fmt, args, kwargs)
Definition: logContinued.py:76
def log(loggername, level, fmt, args, kwargs)
def isEnabledFor(logger, level)
def logf(loggername, level, fmt, args, kwargs)
def error(self, fmt, args)
Definition: logContinued.py:55
def info(self, fmt, args)
Definition: logContinued.py:49
def tracef(fmt, args, kwargs)
def __init__(self, name=None, level=None)
def configure_prop(properties)
Definition: logContinued.py:99
def debugf(fmt, args, kwargs)