ATLAS Offline Software
Loading...
Searching...
No Matches
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
11try:
12 from AthenaCommon.Logging import logging as logging
13
14except 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!
specialized logger to allow setting with Gaudi-like message levels =====