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