ATLAS Offline Software
PhysicsAnalysis/D3PDTools/AnaAlgorithm/python/Logging.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
2 
3 # File: AnaAlgorithm/python/Logging.py
4 # Author: TJ Khoo (khoo@cern.ch) -- borrowed from AthenaCommon/python/Logging.py
5 
6 """AnalysisBase Python-side logging."""
7 
8 # Try to import AthenaCommon first -- if this fails, we'll set up
9 # the standalone logger
10 
11 try:
12  from AthenaCommon.Logging import logging as logging
13 
14 except Exception:
15 
16  from AnaAlgorithm import Constants
17 
18  __all__ = [ 'log', 'logging', 'LogError' ]
19 
20 
21 
22 
23  import logging
24 
25 
26 
27  logging.VERBOSE = logging.DEBUG - 1
28  logging.ALL = logging.DEBUG - 2
29  logging.addLevelName( logging.VERBOSE, 'VERBOSE' )
30  logging.addLevelName( logging.ALL, 'ALL' )
31 
32 
33 
34  class AnaLogger( logging.getLoggerClass(), object ):
35  __levelmap = { Constants.ALL : logging.ALL,
36  Constants.VERBOSE : logging.VERBOSE,
37  Constants.DEBUG : logging.DEBUG,
38  Constants.INFO : logging.INFO,
39  Constants.WARNING : logging.WARNING,
40  Constants.ERROR : logging.ERROR,
41  Constants.FATAL : logging.FATAL }
42 
43  def setLevel( self, level ):
44  try:
45  level = self.__levelmap[ level ]
46  except KeyError:
47  pass
48 
49  super( AnaLogger, self ).setLevel( level )
50 
51  def setFormat( self, fmt = None, datefmt = None ):
52  for h in log.handlers :
53  if not fmt:
54  fmt = h.formatter.format
55  if not datefmt:
56  datefmt = h.formatter.datefmt
57 
58  h.setFormatter( logging.Formatter( fmt = fmt, datefmt = datefmt ) )
59 
60  @classmethod
61  def mapLoggingToMsgLevel( self, level ):
62  for k,v in self.__levelmap.items():
63  if v == level:
64  return k
65  return level
66 
67  @classmethod
68  def mapMsgLevelToLogging( self, level ):
69  try:
70  return self.__levelmap[ level ]
71  except KeyError:
72  return level
73 
74  def all( self, msg, *args, **kwargs):
75  if self.manager.disable >= logging.ALL:
76  return
77  if logging.ALL >= self.getEffectiveLevel():
78  self._log(logging.ALL, msg, args, **kwargs)
79 
80  def verbose( self, msg, *args, **kwargs):
81  if self.manager.disable >= logging.VERBOSE:
82  return
83  if logging.VERBOSE >= self.getEffectiveLevel():
84  self._log(logging.VERBOSE, msg, args, **kwargs)
85 
86 
87  # now change the Logger class and make sure to reset the 'root' logger (which
88  # is created on logging import and will otherwise have the old class)
89  logging.setLoggerClass( AnaLogger )
90  logging.root = AnaLogger( 'root', logging.INFO )
91  logging.Logger.root = logging.root
92  logging.Logger.manager = logging.Manager( logging.Logger.root )
93 
94 
95 
96  log = logging.getLogger()
97  def _setupLogger( log ):
98  import sys
99  log.name = "Analysis"
100  hdlr = logging.StreamHandler( sys.stdout )
101  frmt = logging.Formatter( "Py:%(name)-14s%(levelname)8s %(message)s" )
102  hdlr.setFormatter( frmt )
103  for h in log.handlers: # basicConfig handler already installed?
104  if h.formatter._fmt == logging.BASIC_FORMAT:
105  log.removeHandler( h )
106  break
107  log.addHandler( hdlr )
108  _setupLogger( log )
109  del _setupLogger
110 
111  def LogError( descr ):
112  raise RuntimeError( descr ) # <== Note exception!
python.Logging.AnaLogger.mapLoggingToMsgLevel
def mapLoggingToMsgLevel(self, level)
Definition: PhysicsAnalysis/D3PDTools/AnaAlgorithm/python/Logging.py:61
python.Logging.LogError
def LogError(descr)
Definition: PhysicsAnalysis/D3PDTools/AnaAlgorithm/python/Logging.py:111
python.Logging.AnaLogger.setLevel
def setLevel(self, level)
Definition: PhysicsAnalysis/D3PDTools/AnaAlgorithm/python/Logging.py:43
python.Logging.AnaLogger.__levelmap
dictionary __levelmap
Definition: PhysicsAnalysis/D3PDTools/AnaAlgorithm/python/Logging.py:35
python.Logging.AnaLogger.mapMsgLevelToLogging
def mapMsgLevelToLogging(self, level)
Definition: PhysicsAnalysis/D3PDTools/AnaAlgorithm/python/Logging.py:68
python.Logging._setupLogger
def _setupLogger(log)
Definition: Control/AthenaCommon/python/Logging.py:94
TrigJetMonitorAlgorithm.items
items
Definition: TrigJetMonitorAlgorithm.py:79
python.Logging.AnaLogger.all
def all(self, msg, *args, **kwargs)
Definition: PhysicsAnalysis/D3PDTools/AnaAlgorithm/python/Logging.py:74
python.Logging.AnaLogger.setFormat
def setFormat(self, fmt=None, datefmt=None)
Definition: PhysicsAnalysis/D3PDTools/AnaAlgorithm/python/Logging.py:51
python.Logging.AnaLogger.verbose
def verbose(self, msg, *args, **kwargs)
Definition: PhysicsAnalysis/D3PDTools/AnaAlgorithm/python/Logging.py:80
python.Logging.AnaLogger
specialized logger to allow setting with Gaudi-like message levels =====
Definition: PhysicsAnalysis/D3PDTools/AnaAlgorithm/python/Logging.py:34
pickleTool.object
object
Definition: pickleTool.py:30