1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 """Extends the logging module from the standard library."""
20
21 __docformat__ = "restructuredtext en"
22
23 import os
24 import sys
25 import logging
26
27 from logilab.common.textutils import colorize_ansi
28
29
31 """bind standard logger's methods as methods on the class"""
32 cls.__logger = logger
33 for attr in ('debug', 'info', 'warning', 'error', 'critical', 'exception'):
34 setattr(cls, attr, getattr(logger, attr))
35
36
38 if 'XXX' in record.message:
39 return 'cyan'
40
78
95
96
97 LOG_FORMAT = '%(asctime)s - (%(name)s) %(levelname)s: %(message)s'
98 LOG_DATE_FORMAT = '%Y-%m-%d %H:%M:%S'
99
100 -def get_handler(debug=False, syslog=False, logfile=None, rotation_parameters=None):
101 """get an apropriate handler according to given parameters"""
102 if os.environ.get('APYCOT_ROOT'):
103 handler = logging.StreamHandler(sys.stdout)
104 if debug:
105 handler = logging.StreamHandler()
106 elif logfile is None:
107 if syslog:
108 from logging import handlers
109 handler = handlers.SysLogHandler()
110 else:
111 handler = logging.StreamHandler()
112 else:
113 try:
114 if rotation_parameters is None:
115 if os.name == 'posix' and sys.version_info >= (2, 6):
116 from logging.handlers import WatchedFileHandler
117 handler = WatchedFileHandler(logfile)
118 else:
119 handler = logging.FileHandler(logfile)
120 else:
121 from logging.handlers import TimedRotatingFileHandler
122 handler = TimedRotatingFileHandler(
123 logfile, **rotation_parameters)
124 except IOError:
125 handler = logging.StreamHandler()
126 return handler
127
129 if logthreshold is None:
130 if debug:
131 logthreshold = logging.DEBUG
132 else:
133 logthreshold = logging.ERROR
134 elif isinstance(logthreshold, str):
135 logthreshold = getattr(logging, THRESHOLD_MAP.get(logthreshold,
136 logthreshold))
137 return logthreshold
138
140 isatty = hasattr(sys.__stdout__, 'isatty') and sys.__stdout__.isatty()
141 if not isatty:
142 return False
143 if os.name == 'nt':
144 try:
145 from colorama import init as init_win32_colors
146 except ImportError:
147 return False
148 init_win32_colors()
149 return True
150
159 fmt.colorfilters.append(col_fact)
160 else:
161 fmt = logging.Formatter(logformat, logdateformat)
162 return fmt
163
164 -def init_log(debug=False, syslog=False, logthreshold=None, logfile=None,
165 logformat=LOG_FORMAT, logdateformat=LOG_DATE_FORMAT, fmt=None,
166 rotation_parameters=None, handler=None):
167 """init the log service"""
168 logger = logging.getLogger()
169 if handler is None:
170 handler = get_handler(debug, syslog, logfile, rotation_parameters)
171
172
173 logger.handlers = [handler]
174 logthreshold = get_threshold(debug, logthreshold)
175 logger.setLevel(logthreshold)
176 if fmt is None:
177 if debug:
178 fmt = get_formatter(logformat=logformat, logdateformat=logdateformat)
179 else:
180 fmt = logging.Formatter(logformat, logdateformat)
181 handler.setFormatter(fmt)
182 return handler
183
184
185 THRESHOLD_MAP = {'LOG_DEBUG': 'DEBUG',
186 'LOG_INFO': 'INFO',
187 'LOG_NOTICE': 'INFO',
188 'LOG_WARN': 'WARNING',
189 'LOG_WARNING': 'WARNING',
190 'LOG_ERR': 'ERROR',
191 'LOG_ERROR': 'ERROR',
192 'LOG_CRIT': 'CRITICAL',
193 }
194