def common_logger_config(self, logger, config, incremental=False):
"""
Perform configuration which is common to root and non-root loggers.
"""
level = config.get('level', None)
if level is not None:
logger.setLevel(_checkLevel(level))
if not incremental:
# Remove any existing handlers
for h in logger.handlers[:]:
logger.removeHandler(h)
handlers = config.get('handlers', None)
if handlers:
self.add_handlers(logger, handlers)
filters = config.get('filters', None)
if filters:
self.add_filters(logger, filters)
python类handlers()的实例源码
custom_logger.py 文件源码
项目:Software-Architecture-with-Python
作者: PacktPublishing
项目源码
文件源码
阅读 25
收藏 0
点赞 0
评论 0
def create_logger(app_name, logfilename=None, level=logging.INFO,
console=False, syslog=False):
""" Build and return a custom logger. Accepts the application name,
log filename, loglevel and console logging toggle and syslog toggle """
log=logging.getLogger(app_name)
log.setLevel(logging.DEBUG)
# Add file handler
if logfilename != None:
log.addHandler(logging.FileHandler(logfilename))
if syslog:
log.addHandler(logging.handlers.SysLogHandler(address='/dev/log'))
if console:
log.addHandler(logging.StreamHandler())
# Add formatter
for handle in log.handlers:
formatter = logging.Formatter('%(asctime)s : %(levelname)-8s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
handle.setFormatter(formatter)
return log
def get_logger(self):
"""?logger?????????????logger??????????
?????????????????????????????????
??????????????????????
"""
if not self.logger.handlers: # ??????
console_handler = logging.StreamHandler()
console_handler.setFormatter(self.formatter)
console_handler.setLevel(self.console_output_level)
self.logger.addHandler(console_handler)
# ?????????????????backup_count?
file_handler = TimedRotatingFileHandler(filename=os.path.join(LOG_PATH, self.log_file_name),
when='D',
interval=1,
backupCount=self.backup_count,
delay=True,
encoding='utf-8'
)
file_handler.setFormatter(self.formatter)
file_handler.setLevel(self.file_output_level)
self.logger.addHandler(file_handler)
return self.logger
def common_logger_config(self, logger, config, incremental=False):
"""
Perform configuration which is common to root and non-root loggers.
"""
level = config.get('level', None)
if level is not None:
logger.setLevel(_checkLevel(level))
if not incremental:
# Remove any existing handlers
for h in logger.handlers[:]:
logger.removeHandler(h)
handlers = config.get('handlers', None)
if handlers:
self.add_handlers(logger, handlers)
filters = config.get('filters', None)
if filters:
self.add_filters(logger, filters)
def _find_facility_from_conf():
facility_names = logging.handlers.SysLogHandler.facility_names
facility = getattr(logging.handlers.SysLogHandler,
CONF.syslog_log_facility,
None)
if facility is None and CONF.syslog_log_facility in facility_names:
facility = facility_names.get(CONF.syslog_log_facility)
if facility is None:
valid_facilities = facility_names.keys()
consts = ['LOG_AUTH', 'LOG_AUTHPRIV', 'LOG_CRON', 'LOG_DAEMON',
'LOG_FTP', 'LOG_KERN', 'LOG_LPR', 'LOG_MAIL', 'LOG_NEWS',
'LOG_AUTH', 'LOG_SYSLOG', 'LOG_USER', 'LOG_UUCP',
'LOG_LOCAL0', 'LOG_LOCAL1', 'LOG_LOCAL2', 'LOG_LOCAL3',
'LOG_LOCAL4', 'LOG_LOCAL5', 'LOG_LOCAL6', 'LOG_LOCAL7']
valid_facilities.extend(consts)
raise TypeError(_('syslog facility must be one of: %s') %
', '.join("'%s'" % fac
for fac in valid_facilities))
return facility
def __get_file_formatter():
"""Get logging formatter with Google logging like format.
Each line in the log should look like:
[DIWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] <message>
Returns:
Formatter object for use in logging handlers.
"""
# [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] <message>
ASCII_TIME_FORMAT = "%m%d %H:%M:%S" # mmdd hh:mm:ss.uuuuuu
LINE_FORMAT = ("%(levelname).1s" # [DIWEF]
"%(asctime)s.%(msecs)s " # ASCII_TIME_FORMAT
"%(threadName)s " # threadid
"%(pathname)s:%(lineno)d] " # file:line]
"%(message)s") # <message>
return logging.Formatter(fmt=LINE_FORMAT, datefmt=ASCII_TIME_FORMAT)
def _initialize_logging(self):
"""Printing to console is dirty"""
main_logger = logging.getLogger('main')
log_filename = os.path.join('logs', 'log.txt')
main_logger.setLevel(logging.DEBUG)
# 5 rotating logs of 1 MB each
handler = logging.handlers.RotatingFileHandler(
log_filename,
maxBytes = 1024 * 1024,
backupCount = 1
)
main_logger.addHandler(handler)
return main_logger
def _initialize_logging(self):
"""
Printing to console is dirty
"""
main_logger = logging.getLogger('main')
log_filename = os.path.join('logs', 'log.txt')
main_logger.setLevel(logging.DEBUG)
# 5 rotating logs of 1 MB each
handler = logging.handlers.RotatingFileHandler(
log_filename,
maxBytes = 1024 * 1024,
backupCount = 1
)
main_logger.addHandler(handler)
return main_logger
def _initialize_logging(self):
"""
Printing to console is dirty
"""
main_logger = logging.getLogger('main')
log_filename = os.path.join('logs', 'log.txt')
main_logger.setLevel(logging.DEBUG)
# 5 rotating logs of 1 MB each
handler = logging.handlers.RotatingFileHandler(
log_filename,
maxBytes = 1024 * 1024,
backupCount = 1
)
main_logger.addHandler(handler)
return main_logger
def setup_logging(verbosity_level, save_debug_log):
logging.captureWarnings(True)
# if config['logging']['config_file']:
# # Logging config from file must be read before other handlers are
# # added. If not, the other handlers will have no effect.
# try:
# path = config['logging']['config_file']
# logging.config.fileConfig(path, disable_existing_loggers=False)
# except Exception as e:
# # Catch everything as logging does not specify what can go wrong.
# logger.error('Loading logging config %r failed. %s', path, e)
setup_console_logging(verbosity_level)
if save_debug_log:
print('Here we would call setup_debug_logging_to_file(config)')
# setup_debug_logging_to_file(config)
_delayed_handler.release()
def colourise(self, text, colour, bold=False):
colour = self.COLOUR_BASE.format(colour + 30)
output = []
if bold:
output.append(self.BOLD)
output.append(colour)
output.append(text)
output.append(self.RESET)
return ''.join(output)
# logfile
# logfile = logging.handlers.RotatingFileHandler(LOGPATH, maxBytes=LOGSIZE,
# backupCount=5)
# formatter = logging.Formatter(
# '%(asctime)s %(levelname)-8s [%(name)-12s] %(message)s',
# datefmt="%d/%m %H:%M:%S")
# logfile.setFormatter(formatter)
# logfile.setLevel(logging.DEBUG)
# console output
def my_log():
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
handlers=[logging.FileHandler('message.log', 'a', 'utf-8')])
# ?????_?????__
_log = logging.getLogger('app.' + __name__)
host = '10.0.0.175'
port = 8080
# ??? 'xxxx' % (aa, bb)????????
_log.error('error to connect to %s:%d', host, port)
_log.addFilter(FilterFunc('foo')) # ?????foo()???????
lgg = logging.getLogger('app.network.client')
lgg.propagate = False # ??????
lgg.error('do you see me?') # ????????
lgg.setLevel(logging.CRITICAL)
lgg.error('now you see me?')
logging.disable(logging.DEBUG) # ????????
# ??log??????main?????????
config.fileConfig('applogcfg.ini')
def test_it(self, mock_register, mock_get, mock_except_hook, mock_sys):
mock_sys.argv = ['--debug']
mock_sys.version_info = sys.version_info
self._call()
mock_root_logger = mock_get()
mock_root_logger.setLevel.assert_called_once_with(logging.DEBUG)
self.assertEqual(mock_root_logger.addHandler.call_count, 2)
MemoryHandler = logging.handlers.MemoryHandler
memory_handler = None
for call in mock_root_logger.addHandler.call_args_list:
handler = call[0][0]
if memory_handler is None and isinstance(handler, MemoryHandler):
memory_handler = handler
else:
self.assertTrue(isinstance(handler, logging.StreamHandler))
self.assertTrue(
isinstance(memory_handler.target, logging.StreamHandler))
mock_register.assert_called_once_with(logging.shutdown)
mock_sys.excepthook(1, 2, 3)
mock_except_hook.assert_called_once_with(
memory_handler, 1, 2, 3, debug=True, log_path=mock.ANY)
def setUp(self):
super(PostArgParseSetupTest, self).setUp()
self.config.debug = False
self.config.max_log_backups = 1000
self.config.quiet = False
self.config.verbose_count = constants.CLI_DEFAULTS['verbose_count']
self.devnull = open(os.devnull, 'w')
from certbot.log import ColoredStreamHandler
self.stream_handler = ColoredStreamHandler(six.StringIO())
from certbot.log import MemoryHandler, TempHandler
self.temp_handler = TempHandler()
self.temp_path = self.temp_handler.path
self.memory_handler = MemoryHandler(self.temp_handler)
self.root_logger = mock.MagicMock(
handlers=[self.memory_handler, self.stream_handler])
def getLogger():
# ??log????????,?????????????????
# ??a?????log???b????a????????????
# ?????????????
if Logger.logger is not None:
return Logger.logger
Logger.logger = logging.Logger(Logger.log_name)
if Logger.log_print == "True":
print_handler = logging.StreamHandler()
print_fmt = logging.Formatter(
Logger.log_formatter,
datefmt=Logger.log_formatter_datefmt
)
print_handler.setFormatter(print_fmt)
Logger.logger.addHandler(print_handler)
file_handler = logging.handlers.RotatingFileHandler(
filename = Logger.log_file,
maxBytes = Logger.log_max_byte,
backupCount = Logger.log_backup_count
)
file_fmt = logging.Formatter(
Logger.log_formatter,
datefmt=Logger.log_formatter_datefmt
)
file_handler.setFormatter(file_fmt)
Logger.logger.addHandler(file_handler)
Logger.logger.setLevel(Logger.levels.get(Logger.log_level))
return Logger.logger
def getLogger():
# ??log????????,?????????????????
# ??a?????log???b????a????????????
# ?????????????
if Logger.logger is not None:
return Logger.logger
Logger.logger = logging.Logger(Logger.log_name)
if Logger.log_print == "True":
print_handler = logging.StreamHandler()
print_fmt = logging.Formatter(
Logger.log_formatter,
datefmt=Logger.log_formatter_datefmt
)
print_handler.setFormatter(print_fmt)
Logger.logger.addHandler(print_handler)
file_handler = logging.handlers.RotatingFileHandler(
filename = Logger.log_file,
maxBytes = Logger.log_max_byte,
backupCount = Logger.log_backup_count
)
file_fmt = logging.Formatter(
Logger.log_formatter,
datefmt=Logger.log_formatter_datefmt
)
file_handler.setFormatter(file_fmt)
Logger.logger.addHandler(file_handler)
Logger.logger.setLevel(Logger.levels.get(Logger.log_level))
return Logger.logger
def add_handlers(self, logger, handlers):
"""Add handlers to a logger from a list of names."""
for h in handlers:
try:
logger.addHandler(self.config['handlers'][h])
except StandardError as e:
raise ValueError('Unable to add handler %r: %s' % (h, e))
def _open(self):
ensure_dir(os.path.dirname(self.baseFilename))
return logging.handlers.RotatingFileHandler._open(self)
def __init__(self, filename, max_bytes=0, backup_count=0, encoding=None,
delay=0, when='h', interval=1, utc=False):
# If rotation/rollover is wanted, it doesn't make sense to use another
# mode. If for example 'w' were specified, then if there were multiple
# runs of the calling application, the logs from previous runs would be
# lost if the 'w' is respected, because the log file would be truncated
# on each run.
handlers.TimedRotatingFileHandler.__init__(
self, filename, when, interval, backup_count, encoding, delay, utc)
self.maxBytes = max_bytes
# noinspection PyIncorrectDocstring
def flush(self):
for handler in self.logger.handlers:
handler.flush()