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