Source code for genometools.misc.log
# Copyright (c) 2015-2017 Florian Wagner
#
# This file is part of GenomeTools.
#
# GenomeTools is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License, Version 3,
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""Logging-related functions."""
from __future__ import (absolute_import, division,
print_function, unicode_literals)
_oldstr = str
from builtins import *
import sys
import logging
[docs]def configure_logger(name, log_stream=sys.stdout, log_file=None,
log_level=logging.INFO, keep_old_handlers=False,
propagate=False):
"""Configures and returns a logger.
This function serves to simplify the configuration of a logger that
writes to a file and/or to a stream (e.g., stdout).
Parameters
----------
name: str
The name of the logger. Typically set to ``__name__``.
log_stream: a stream object, optional
The stream to write log messages to. If ``None``, do not write to any
stream. The default value is `sys.stdout`.
log_file: str, optional
The path of a file to write log messages to. If None, do not write to
any file. The default value is ``None``.
log_level: int, optional
A logging level as `defined`__ in Python's logging module. The default
value is `logging.INFO`.
keep_old_handlers: bool, optional
If set to ``True``, keep any pre-existing handlers that are attached to
the logger. The default value is ``False``.
propagate: bool, optional
If set to ``True``, propagate the loggers messages to the parent
logger. The default value is ``False``.
Returns
-------
`logging.Logger`
The logger.
Notes
-----
Note that if ``log_stream`` and ``log_file`` are both ``None``, no handlers
will be created.
__ loglvl_
.. _loglvl: https://docs.python.org/2/library/logging.html#logging-levels
"""
# create a child logger
logger = logging.getLogger(name)
# set the logger's level
logger.setLevel(log_level)
# set the logger's propagation attribute
logger.propagate = propagate
if not keep_old_handlers:
# remove previously attached handlers
logger.handlers = []
# create the formatter
log_fmt = '[%(asctime)s] %(levelname)s: %(message)s'
log_datefmt = '%Y-%m-%d %H:%M:%S'
formatter = logging.Formatter(log_fmt,log_datefmt)
# create and attach the handlers
if log_stream is not None:
# create a StreamHandler
stream_handler = logging.StreamHandler(log_stream)
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)
if log_file is not None:
# create a FileHandler
file_handler = logging.FileHandler(log_file)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
if log_stream is None and log_file is None:
# "no handler" => use NullHandler
logger.addHandler(logging.NullHandler())
return logger
[docs]def get_logger(name='', log_stream=None, log_file=None,
quiet=False, verbose=False):
"""Convenience function for getting a logger."""
# configure root logger
log_level = logging.INFO
if quiet:
log_level = logging.WARNING
elif verbose:
log_level = logging.DEBUG
if log_stream is None:
log_stream = sys.stdout
new_logger = configure_logger(name, log_stream=log_stream,
log_file=log_file, log_level=log_level)
return new_logger