logger.py 3.43 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# Copyright 2013 GRNET S.A. All rights reserved.
#
# Redistribution and use in source and binary forms, with or
# without modification, are permitted provided that the following
# conditions are met:
#
#   1. Redistributions of source code must retain the above
#      copyright notice, this list of conditions and the following
#      disclaimer.
#
#   2. Redistributions in binary form must reproduce the above
#      copyright notice, this list of conditions and the following
#      disclaimer in the documentation and/or other materials
#      provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# The views and conclusions contained in the software and
# documentation are those of the authors and should not be
# interpreted as representing official policies, either expressed
# or implied, of GRNET S.A.

34
from os import chmod
35
from os.path import expanduser
36
37
38
import logging


39
LOG_FILE = [expanduser('~/.kamaki.log')]
40
41
42
43
44
ALL = 0

_blacklist = {}


45
def deactivate(name):
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
    """Deactivate a logger. Can be restored"""
    xlogger = logging.getLogger(name)
    _blacklist[name] = xlogger.level
    xlogger.setLevel(logging.CRITICAL)


def activate(name):
    """Restore a loggers settings"""
    old_logger = logging.getLogger(name)
    old_logger.setLevel(_blacklist.pop(name, old_logger.level))


def if_logger_enabled(foo):
    def wrap(name, *args, **kwargs):
        if name in _blacklist:
            return logging.getLogger(name)
        return foo(name, *args, **kwargs)
    return wrap
64
65
66
67


def get_log_filename():
    for logfile in LOG_FILE:
68
        try:
69
            with open(logfile, 'a+') as f:
70
                f.seek(0)
71
            chmod(logfile, 0600)
72
73
74
75
76
77
        except IOError:
            continue
        return logfile
    print('Failed to open any logging locations, file-logging aborted')


78
79
def set_log_filename(filename):
    global LOG_FILE
80
    LOG_FILE[0] = filename
81
82


83
def _add_logger(name, level=None, filename=None, fmt=None):
Stavros Sachtouris's avatar
Stavros Sachtouris committed
84
    log = get_logger(name)
85
    h = logging.FileHandler(filename) if (
Stavros Sachtouris's avatar
Stavros Sachtouris committed
86
87
88
        filename) else logging.StreamHandler()
    lfmt = logging.Formatter(fmt or '%(name)s\n %(message)s')
    h.setFormatter(lfmt)
89
90
    log.addHandler(h)
    log.setLevel(level or logging.DEBUG)
91
    return log
92
93


94
@if_logger_enabled
95
def add_file_logger(name, level=None, filename=None):
96
97
98
99
100
101
102
103
    try:
        return _add_logger(
            name, level, filename or get_log_filename(),
            fmt='%(name)s(%(levelname)s) %(asctime)s\n\t%(message)s')
    except Exception:
        return get_logger(name)


104
@if_logger_enabled
105
def add_stream_logger(name, level=None, fmt=None):
106
    try:
107
        return _add_logger(name, level, fmt=fmt)
108
    except Exception:
109
        return get_logger(name)
110
111


112
@if_logger_enabled
113
114
def get_logger(name):
    return logging.getLogger(name)