Source code for tea.logger.log
__author__ = 'Viktor Kerkez <alefnula@gmail.com>'
__date__ = '27 November 2009'
__copyright__ = 'Copyright (c) 2009 Viktor Kerkez'
import os
import sys
import time
import logging
from tea import shell
from tea.system import platform
if platform.is_only(platform.WINDOWS):
from .win_handlers import RotatingFileHandler # @UnusedImport
else:
from logging.handlers import RotatingFileHandler # @Reimport
# Constants
FMT = ('%(asctime)s.%(msecs)03d %(levelname)11s: %(message)s '
'[%(name)s:%(lineno)d]')
FMT_SHORT = '%(asctime)s %(levelname)11s: %(message)s [%(name)s:%(lineno)d]'
FMT_STDOUT = '%(levelname)-11s - %(message)s [%(name)s:%(lineno)d]'
FMT_DATE = '%Y.%m.%d %H:%M:%S'
logging.basicConfig(stream=sys.stderr, format=FMT_SHORT,
datefmt=FMT_DATE, level=logging.DEBUG)
[docs]def configure_logging(filename=None, filemode='a', datefmt=FMT_DATE,
fmt=FMT, stdout_fmt=FMT_STDOUT, level=logging.DEBUG,
stdout_level=logging.WARNING, initial_file_message='',
max_size=1048576, rotations_number=5,
remove_handlers=True):
"""Configure logging module.
:param str filename: Specifies a filename to log to.
:param str filemode: Specifies the mode to open the log file. Values:
``'a'``, ``'w'``. *Default:* ``a``
:param str datefmt: Use the specified date/time format.
:param str fmt: Format string for the file handler.
:param str stdout_fmt: Format string for the stdout handler.
:param int level: Log level for the file handler. Log levels are the same
as the log levels from the standard :mod:`logging`
module. *Default:* ``logging.DEBUG``
:param int stdout_level: Log level for the stdout handler. Log levels are
the same as the log levels from the standard
:mod:`logging` module. *Default:*
``logging.WARNING``
:param str initial_file_message: First log entry written in file.
:param int max_size: Maximal size of the logfile. If the size of the file
exceed the maximal size it will be rotated.
:param int rotations_number: Number of rotations to save
:param bool remove_handlers: Remove all existing handlers
:rtype: None
"""
logger = logging.getLogger()
logger.level = logging.NOTSET
# Remove all handlers
if remove_handlers:
while len(logger.handlers) > 0:
hdlr = logger.handlers[0]
hdlr.close()
logger.removeHandler(hdlr)
# Create stdout handler
if stdout_level is not None:
stdout_handler = logging.StreamHandler(sys.stdout)
stdout_handler.setLevel(stdout_level)
stdout_formatter = logging.Formatter(stdout_fmt, datefmt)
# stdoutFormatter.converter = time.gmtime
stdout_handler.setFormatter(stdout_formatter)
logger.addHandler(stdout_handler)
# Create file handler if filename is provided
if filename is not None:
# Check if filename directory exists and creates it if it doesn't
directory = os.path.abspath(os.path.dirname(filename))
if not os.path.isdir(directory):
shell.mkdir(directory)
# Create file handler
file_handler = RotatingFileHandler(filename, filemode, max_size,
rotations_number)
file_handler.setLevel(level)
file_formatter = logging.Formatter(fmt, datefmt)
file_formatter.converter = time.gmtime
file_handler.setFormatter(file_formatter)
logger.addHandler(file_handler)
if initial_file_message:
message = ' %s ' % initial_file_message
file_handler.stream.write('\n' + message.center(100, '=') + '\n\n')