1
1
"""
2
2
Logging definition module
3
-
4
- opts = {
5
- "debug": True,
6
- "stream_handler": True,
7
- "file_handler": {
8
- "path": "/tmp/foo",
9
- "name": "foo.log"
10
- },
11
- 'json_formatter': {
12
- 'enabled': True,
13
- 'extra_fields': {
14
- 'foo': 'foo',
15
- 'bar': 'bar'
16
- },
17
- 'timestamp_fmt': "%Y-%m-%dT%H:%M:%S.%fZ"
18
- }
19
- }
20
3
"""
21
4
22
5
import logging
6
+ import logging .handlers
7
+ import sys
23
8
24
- from os import makedirs
25
9
from pathlib import Path
26
10
27
11
from colorlog import ColoredFormatter
28
12
13
+ from qbit_watcher .settings import APP_LOGFILE
29
14
from qbit_watcher .logger .exceptions import LogError
30
- from qbit_watcher .logger .json_formatter import QbitJsonFormatter
31
15
32
16
33
17
class LastPartFilter (logging .Filter ):
@@ -41,56 +25,39 @@ def filter(self, record):
41
25
return True
42
26
43
27
44
- def get_logger (name , opts = None ):
28
+ def get_logger (name ):
45
29
"""
46
30
Return a new named logger that will inherit the root logger
47
31
"""
48
- __init_main_logger (opts )
32
+ __init_main_logger ()
49
33
return logging .getLogger ('qbit_watcher.' + name )
50
34
51
35
52
- def __init_main_logger (opts ):
36
+ def __init_main_logger ():
53
37
"""
54
38
Init the main logger with its handlers when required
55
39
"""
56
40
logger = logging .getLogger ('qbit_watcher' )
57
41
logger .setLevel (logging .INFO )
58
- if not opts :
59
- return logger
60
- __valid_opts (opts )
61
-
62
- is_debug = opts ['debug' ] if "debug" in opts else False
63
- if is_debug :
64
- logger .setLevel (logging .DEBUG )
65
-
66
- stream_handler = opts ['stream_handler' ] if "stream_handler" in opts else False
67
- if stream_handler :
68
- json_opts = None
69
- if 'json_formatter' in opts :
70
- if opts .get ('json_formatter' , {}).get ('enabled' ) is True :
71
- json_opts = opts ['json_formatter' ]
72
-
73
- if logger .handlers :
74
- if not __has_handler (logger .handlers , logging .StreamHandler ):
75
- handler = __create_stream_handler (json_opts = json_opts )
76
- logger .addHandler (handler )
77
- else :
78
- handler = __create_stream_handler (json_opts = json_opts )
79
- logger .addHandler (handler )
80
42
81
- file_handler = bool ( "file_handler" in opts )
82
- if file_handler :
83
- if logger .handlers :
84
- if not __has_handler ( logger . handlers , logging . FileHandler ):
85
- handler = __create_json_file_handler (
86
- opts [ 'file_handler' ][ 'path' ],
87
- opts [ 'file_handler' ][ 'name' ]
88
- )
43
+ if sys . stdout . isatty () and sys . stderr . isatty ():
44
+ stream_handler = __create_stream_handler ()
45
+ logger .addHandler ( stream_handler )
46
+
47
+ if logger . handlers :
48
+ if not __has_handler ( logger . handlers , logging . StreamHandler ):
49
+ if sys . stdout . isatty () and sys . stderr . isatty ():
50
+ handler = __create_stream_handler ( )
89
51
logger .addHandler (handler )
90
- else :
91
- handler = __create_stream_handler ( json_opts = json_opts )
52
+ if not __has_handler ( logger . handlers , logging . FileHandler ) :
53
+ handler = __create_file_handler ( )
92
54
logger .addHandler (handler )
93
-
55
+ else :
56
+ if sys .stdout .isatty () and sys .stderr .isatty ():
57
+ handler = __create_stream_handler ()
58
+ logger .addHandler (handler )
59
+ fhandler = __create_file_handler ()
60
+ logger .addHandler (fhandler )
94
61
return logger
95
62
96
63
@@ -101,7 +68,7 @@ def __valid_opts(opts):
101
68
if 'file_handler' in opts :
102
69
if not isinstance (opts ['file_handler' ], dict ):
103
70
raise LogError ("file_handler must be a dict {path: '/tmp', file: 'file.log'}" )
104
- if not 'path' in opts ['file_handler' ] or not 'name' in opts ['file_handler' ]:
71
+ if 'path' not in opts ['file_handler' ] or 'name' not in opts ['file_handler' ]:
105
72
raise LogError ("file_handler is set in options but 'name' or 'path' are missing" )
106
73
107
74
@@ -116,42 +83,41 @@ def __has_handler(handlers, handler_type):
116
83
return res
117
84
118
85
119
- def __create_stream_handler (json_opts = None ):
86
+ def __create_stream_handler ():
120
87
"""
121
88
Create a stream logger with default formatter
122
89
"""
123
90
stream_handler = logging .StreamHandler ()
124
- if json_opts :
125
- extra = json_opts ['extra_fields' ] if 'extra_fields' in json_opts else {}
126
- ts_fmt = json_opts ['timestamp_fmt' ] if 'timestamp_fmt' in json_opts else None
127
- formatter = QbitJsonFormatter (extra , ts_fmt )
128
- stream_handler .setFormatter (formatter )
129
- else :
130
- last_filter = LastPartFilter ()
131
- stream_handler .addFilter (last_filter )
132
- fmt_name = " %(log_color)s%(name_last)-8s%(reset)s"
133
- fmt_levelname = "%(log_color)s%(levelname)s%(reset)s"
134
- fmt_message = "%(log_color)s%(message)s%(reset)s"
135
-
136
- stream_log_fmt = " %s | %s | %s" % (fmt_name , fmt_levelname , fmt_message )
137
- stream_format = ColoredFormatter (stream_log_fmt )
138
- stream_handler .setFormatter (stream_format )
139
-
91
+ last_filter = LastPartFilter ()
92
+ stream_handler .addFilter (last_filter )
93
+ fmt_name = " %(log_color)s%(name_last)-8s%(reset)s"
94
+ fmt_levelname = "%(log_color)s%(levelname)s%(reset)s"
95
+ fmt_message = "%(log_color)s%(message)s%(reset)s"
96
+
97
+ stream_log_fmt = " %s | %s | %s" % (fmt_name , fmt_levelname , fmt_message )
98
+ stream_format = ColoredFormatter (stream_log_fmt )
99
+ stream_handler .setFormatter (stream_format )
140
100
return stream_handler
141
101
142
102
143
- def __create_json_file_handler (folder_path , fname ):
144
- """
145
- Create a json file logger
103
+ def __create_file_handler ():
104
+ """ Add filehandler
146
105
"""
147
- path = Path (folder_path )
148
- if not path .exists ():
149
- makedirs (path , exist_ok = True )
150
-
151
- file_handler = logging .FileHandler (path / fname )
152
- json_format = logging .Formatter (
153
- '{"timestamp": "%(asctime)s", "level": "%(levelname)s", "short_message": "%(message)s"}' ,
154
- datefmt = "%s"
106
+ last_filter = LastPartFilter ()
107
+ fmt_date = " %(asctime)s"
108
+ fmt_name = "%(name_last)-8s"
109
+ fmt_levelname = "%(levelname)s"
110
+ fmt_message = "%(message)s"
111
+
112
+ file_log_fmt = "%s %s | %s | %s" % (fmt_date , fmt_name , fmt_levelname , fmt_message )
113
+ if not APP_LOGFILE .parent .exists ():
114
+ Path .mkdir (APP_LOGFILE .parent , exist_ok = True )
115
+ file_handler = logging .handlers .RotatingFileHandler (
116
+ APP_LOGFILE ,
117
+ maxBytes = (1048576 * 5 ),
118
+ backupCount = 7
155
119
)
156
- file_handler .setFormatter (json_format )
120
+
121
+ file_handler .addFilter (last_filter )
122
+ file_handler .setFormatter (logging .Formatter (file_log_fmt ))
157
123
return file_handler
0 commit comments