]> kaliko git repositories - mpd-sima.git/blob - sima/lib/logger.py
b9b8b408ecfdc60ed34406870ab117882faf733c
[mpd-sima.git] / sima / lib / logger.py
1 # -*- coding: utf-8 -*-
2 # Copyright (c) 2009, 2010, 2013, 2014, 2015 kaliko <kaliko@azylum.org>
3 #
4 #  This file is part of sima
5 #
6 #  sima is free software: you can redistribute it and/or modify
7 #  it under the terms of the GNU General Public License as published by
8 #  the Free Software Foundation, either version 3 of the License, or
9 #  (at your option) any later version.
10 #
11 #  sima is distributed in the hope that it will be useful,
12 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 #  GNU General Public License for more details.
15 #
16 #  You should have received a copy of the GNU General Public License
17 #  along with sima.  If not, see <http://www.gnu.org/licenses/>.
18 #
19 #
20
21 """
22 Logging facility for sima.
23 """
24
25 # standard library import
26 import logging
27 import sys
28
29 from os import getenv
30
31 DEBUG = logging.DEBUG
32 INFO = logging.INFO
33 ERROR = logging.ERROR
34 LOG_FORMATS = {
35         DEBUG: '[{process}]{filename: >11}:{lineno: <3} {levelname: <7}: {message}',
36         INFO:  '{levelname: <7}: {message}',
37         #logging.DEBUG: '{asctime} {filename}:{lineno}({funcName}) '
38                                  #'{levelname}: {message}',
39         }
40 DATE_FMT = "%Y-%m-%d %H:%M:%S"
41
42 TRACE_LEVEL_NUM = 5
43 logging.addLevelName(TRACE_LEVEL_NUM, 'TRACE')
44 def trace(self, message, *args, **kwargs):
45     # Yes, logger takes its '*args' as 'args'.
46     if self.isEnabledFor(TRACE_LEVEL_NUM):
47         self._log(TRACE_LEVEL_NUM, message, args, **kwargs)
48
49 logging.Logger.trace = trace
50
51
52 def set_logger(level='info', logfile=None):
53     """
54     logger:
55         level: in debug, info, warning,…
56         logfile: file to log to
57     """
58     name = 'sima'
59     if getenv('TRACE', False):
60         user_log_level = TRACE_LEVEL_NUM
61     else:
62         user_log_level = getattr(logging, level.upper())
63     if user_log_level > DEBUG:
64         log_format = LOG_FORMATS.get(INFO)
65     else:
66         log_format = LOG_FORMATS.get(DEBUG)
67     logger = logging.getLogger(name)
68     formatter = logging.Formatter(log_format, DATE_FMT, '{')
69     logger.setLevel(user_log_level)
70     filehdl = False
71     if logger.handlers:
72         for hdl in logger.handlers:
73             hdl.setFormatter(formatter)
74             if isinstance(hdl, logging.FileHandler):
75                 filehdl = True
76             else:
77                 logger.removeHandler(hdl)
78
79     if logfile:
80         if filehdl:
81             logger.handlers = []
82         # Add timestamp for file handler
83         log_format = '{0} {1}'.format('{asctime}', log_format)
84         formatter = logging.Formatter(log_format, DATE_FMT, '{')
85         # create file handler
86         fileh = logging.FileHandler(logfile)
87         fileh.setFormatter(formatter)
88         logger.addHandler(fileh)
89     else:
90         if filehdl:
91             logger.info('Not changing logging handlers, only updating formatter')
92             return
93         # create console handler with a specified log level (STDOUT)
94         couth = logging.StreamHandler(sys.stdout)
95         couth.addFilter(lambda record: record.levelno < ERROR)
96
97         # create console handler with warning log level (STDERR)
98         cerrh = logging.StreamHandler(sys.stderr)
99         cerrh.setLevel(ERROR)
100
101         # add formatter to the handlers
102         cerrh.setFormatter(formatter)
103         couth.setFormatter(formatter)
104
105         # add the handlers to SIMA_LOGGER
106         logger.addHandler(couth)
107         logger.addHandler(cerrh)  # Already added creating the handler‽ Still have to figure it out.
108
109 # VIM MODLINE
110 # vim: ai ts=4 sw=4 sts=4 expandtab