Completed
Push — master ( 12c888...988ad6 )
by Thomas
11:22
created

exabgp.logger.handler._stream()   A

Complexity

Conditions 1

Size

Total Lines 5
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 5
nop 1
dl 0
loc 5
rs 10
c 0
b 0
f 0
1
# A wrapper class around logging to make it easier to use
2
3
import sys
4
import logging
5
import logging.handlers as handlers
6
7
TIMED = '%(asctime)s: %(message)s'
8
SHORT = '%(filename)s: %(message)s'
9
CLEAR = '%(levelname) %(asctime)s %(filename)s: %(message)s'
10
11
levels = {
12
    'FATAL': logging.FATAL,
13
    'CRITICAL': logging.CRITICAL,
14
    'ERROR': logging.ERROR,
15
    'WARNING': logging.WARNING,
16
    'INFO': logging.INFO,
17
    'DEBUG': logging.DEBUG,
18
    'NOTSET': logging.NOTSET,
19
}
20
21
# prevent recreation of already created logger
22
_created = {}
23
24
25
def getLogger(name=None, **kwargs):
26
    if name in _created:
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable _created does not seem to be defined.
Loading history...
27
        if len(kwargs) == 0:
28
            return _created[name]
29
        raise ValueError(f'a logger with the name "{name}" already exists')
30
31
    logger = logging.getLogger(name)
32
    logger.setLevel(kwargs.get('level', 'DEBUG'))
33
34
    if 'address' in kwargs or kwargs.get('syslog', False):
35
        logger.addHandler(_syslog(**kwargs))
36
    if 'stream' in kwargs:
37
        logger.addHandler(_stream(**kwargs))
38
    if 'filename' in kwargs:
39
        logger.addHandler(_file(**kwargs))
40
41
    _created[name] = logger
42
    return logger
43
44
45
def _syslog(**kwargs):
46
    formating = kwargs.get('format', SHORT)
47
    handler = handlers.SysLogHandler(
48
        address=kwargs.get('address', '/dev/log'), facility=kwargs.get('facility', 'syslog'),
49
    )
50
    handler.setFormatter(logging.Formatter(formating))
51
    return handler
52
53
54
def _stream(**kwargs):
55
    formating = kwargs.get('format', CLEAR)
56
    handler = logging.StreamHandler(stream=kwargs.get('stream', sys.stderr),)
57
    handler.setFormatter(logging.Formatter(formating))
58
    return handler
59
60
61
def _file(**kwargs):
62
    formating = kwargs.get('format', CLEAR)
63
    handler = handlers.RotatingFileHandler(
64
        filename=kwargs.get('filename', 1048576),
65
        maxBytes=kwargs.get('maxBytes', 1048576),
66
        backupCount=kwargs.get('backupCount', 3),
67
    )
68
    handler.setFormatter(logging.Formatter(formating))
69
    return handler
70
71
72
# testing
73
if __name__ == '__main__':
74
    # from vyos.logger import getLogger
75
    formating = '%(asctime)s (%(filename)s) %(levelname)s: %(message)s'
76
77
    # syslog logger
78
    # syslog=True if no 'address' field is provided
79
    syslog = getLogger(__name__ + '.1', syslog=True, format=formating)
80
    syslog.info('syslog test')
81
82
    # steam logger
83
    stream = getLogger(__name__ + '.2', stream=sys.stdout, level='ERROR')
84
    stream.info('steam test')
85
86
    # file logger
87
    filelog = getLogger(__name__ + '.3', filename='/tmp/test')
88
    filelog.info('file test')
89
90
    # create a combined logger
91
    getLogger('ExaBGP', syslog=True, stream=sys.stdout, filename='/tmp/test')
92
93
    # recover the created logger from name
94
    combined = getLogger('ExaBGP')
95
    combined.info('combined test')
96