1
- # -*- coding: utf-8 -*-
2
-
1
+ import json
3
2
import logging
4
3
import socket
5
- import sys
6
-
7
- try :
8
- import simplejson as json
9
- except ImportError : # pragma: no cover
10
- import json
11
4
12
5
from fluent import sender
13
6
14
7
15
- class FluentRecordFormatter (logging .Formatter , object ):
16
- """ A structured formatter for Fluent.
8
+ class FluentRecordFormatter (logging .Formatter ):
9
+ """A structured formatter for Fluent.
17
10
18
11
Best used with server storing data in an ElasticSearch cluster for example.
19
12
@@ -33,36 +26,49 @@ class FluentRecordFormatter(logging.Formatter, object):
33
26
Can be an iterable.
34
27
"""
35
28
36
- def __init__ (self , fmt = None , datefmt = None , style = '%' , fill_missing_fmt_key = False , format_json = True ,
37
- exclude_attrs = None ):
38
- super (FluentRecordFormatter , self ).__init__ (None , datefmt )
39
-
40
- if sys .version_info [0 :2 ] >= (3 , 2 ) and style != '%' :
29
+ def __init__ (
30
+ self ,
31
+ fmt = None ,
32
+ datefmt = None ,
33
+ style = "%" ,
34
+ fill_missing_fmt_key = False ,
35
+ format_json = True ,
36
+ exclude_attrs = None ,
37
+ ):
38
+ super ().__init__ (None , datefmt )
39
+
40
+ if style != "%" :
41
41
self .__style , basic_fmt_dict = {
42
- '{' : (logging .StrFormatStyle , {
43
- 'sys_host' : '{hostname}' ,
44
- 'sys_name' : '{name}' ,
45
- 'sys_module' : '{module}' ,
46
- }),
47
- '$' : (logging .StringTemplateStyle , {
48
- 'sys_host' : '${hostname}' ,
49
- 'sys_name' : '${name}' ,
50
- 'sys_module' : '${module}' ,
51
- }),
42
+ "{" : (
43
+ logging .StrFormatStyle ,
44
+ {
45
+ "sys_host" : "{hostname}" ,
46
+ "sys_name" : "{name}" ,
47
+ "sys_module" : "{module}" ,
48
+ },
49
+ ),
50
+ "$" : (
51
+ logging .StringTemplateStyle ,
52
+ {
53
+ "sys_host" : "${hostname}" ,
54
+ "sys_name" : "${name}" ,
55
+ "sys_module" : "${module}" ,
56
+ },
57
+ ),
52
58
}[style ]
53
59
else :
54
60
self .__style = None
55
61
basic_fmt_dict = {
56
- ' sys_host' : ' %(hostname)s' ,
57
- ' sys_name' : ' %(name)s' ,
58
- ' sys_module' : ' %(module)s' ,
62
+ " sys_host" : " %(hostname)s" ,
63
+ " sys_name" : " %(name)s" ,
64
+ " sys_module" : " %(module)s" ,
59
65
}
60
66
61
67
if exclude_attrs is not None :
62
68
self ._exc_attrs = set (exclude_attrs )
63
69
self ._fmt_dict = None
64
70
self ._formatter = self ._format_by_exclusion
65
- self .usesTime = super (FluentRecordFormatter , self ).usesTime
71
+ self .usesTime = super ().usesTime
66
72
else :
67
73
self ._exc_attrs = None
68
74
if not fmt :
@@ -89,7 +95,7 @@ def __init__(self, fmt=None, datefmt=None, style='%', fill_missing_fmt_key=False
89
95
90
96
def format (self , record ):
91
97
# Compute attributes handled by parent class.
92
- super (FluentRecordFormatter , self ).format (record )
98
+ super ().format (record )
93
99
# Add ours
94
100
record .hostname = self .hostname
95
101
@@ -103,7 +109,7 @@ def usesTime(self):
103
109
"""This method is substituted on construction based on settings for performance reasons"""
104
110
105
111
def _structuring (self , data , record ):
106
- """ Melds `msg` into `data`.
112
+ """Melds `msg` into `data`.
107
113
108
114
:param data: dictionary to be sent to fluent server
109
115
:param msg: :class:`LogRecord`'s message to add to `data`.
@@ -118,7 +124,7 @@ def _structuring(self, data, record):
118
124
elif isinstance (msg , str ):
119
125
self ._add_dic (data , self ._format_msg (record , msg ))
120
126
else :
121
- self ._add_dic (data , {' message' : msg })
127
+ self ._add_dic (data , {" message" : msg })
122
128
123
129
def _format_msg_json (self , record , msg ):
124
130
try :
@@ -131,7 +137,7 @@ def _format_msg_json(self, record, msg):
131
137
return self ._format_msg_default (record , msg )
132
138
133
139
def _format_msg_default (self , record , msg ):
134
- return {' message' : super (FluentRecordFormatter , self ).format (record )}
140
+ return {" message" : super ().format (record )}
135
141
136
142
def _format_by_exclusion (self , record ):
137
143
data = {}
@@ -175,17 +181,18 @@ class FluentHandler(logging.Handler):
175
181
Logging Handler for fluent.
176
182
"""
177
183
178
- def __init__ (self ,
179
- tag ,
180
- host = 'localhost' ,
181
- port = 24224 ,
182
- timeout = 3.0 ,
183
- verbose = False ,
184
- buffer_overflow_handler = None ,
185
- msgpack_kwargs = None ,
186
- nanosecond_precision = False ,
187
- ** kwargs ):
188
-
184
+ def __init__ (
185
+ self ,
186
+ tag ,
187
+ host = "localhost" ,
188
+ port = 24224 ,
189
+ timeout = 3.0 ,
190
+ verbose = False ,
191
+ buffer_overflow_handler = None ,
192
+ msgpack_kwargs = None ,
193
+ nanosecond_precision = False ,
194
+ ** kwargs ,
195
+ ):
189
196
self .tag = tag
190
197
self ._host = host
191
198
self ._port = port
@@ -213,37 +220,53 @@ def sender(self):
213
220
buffer_overflow_handler = self ._buffer_overflow_handler ,
214
221
msgpack_kwargs = self ._msgpack_kwargs ,
215
222
nanosecond_precision = self ._nanosecond_precision ,
216
- ** self ._kwargs
223
+ ** self ._kwargs ,
217
224
)
218
225
return self ._sender
219
226
220
- def getSenderInstance (self , tag , host , port , timeout , verbose ,
221
- buffer_overflow_handler , msgpack_kwargs ,
222
- nanosecond_precision , ** kwargs ):
227
+ def getSenderInstance (
228
+ self ,
229
+ tag ,
230
+ host ,
231
+ port ,
232
+ timeout ,
233
+ verbose ,
234
+ buffer_overflow_handler ,
235
+ msgpack_kwargs ,
236
+ nanosecond_precision ,
237
+ ** kwargs ,
238
+ ):
223
239
sender_class = self .getSenderClass ()
224
- return sender_class (tag ,
225
- host = host , port = port ,
226
- timeout = timeout , verbose = verbose ,
227
- buffer_overflow_handler = buffer_overflow_handler ,
228
- msgpack_kwargs = msgpack_kwargs ,
229
- nanosecond_precision = nanosecond_precision , ** kwargs )
240
+ return sender_class (
241
+ tag ,
242
+ host = host ,
243
+ port = port ,
244
+ timeout = timeout ,
245
+ verbose = verbose ,
246
+ buffer_overflow_handler = buffer_overflow_handler ,
247
+ msgpack_kwargs = msgpack_kwargs ,
248
+ nanosecond_precision = nanosecond_precision ,
249
+ ** kwargs ,
250
+ )
230
251
231
252
def emit (self , record ):
232
253
data = self .format (record )
233
254
_sender = self .sender
234
- return _sender .emit_with_time (None ,
235
- sender .EventTime (record .created )
236
- if _sender .nanosecond_precision
237
- else int (record .created ),
238
- data )
255
+ return _sender .emit_with_time (
256
+ None ,
257
+ sender .EventTime (record .created )
258
+ if _sender .nanosecond_precision
259
+ else int (record .created ),
260
+ data ,
261
+ )
239
262
240
263
def close (self ):
241
264
self .acquire ()
242
265
try :
243
266
try :
244
267
self .sender .close ()
245
268
finally :
246
- super (FluentHandler , self ).close ()
269
+ super ().close ()
247
270
finally :
248
271
self .release ()
249
272
0 commit comments