1111from fluent import sender
1212
1313
14- class FluentRecordFormatter (object ):
15- def __init__ (self ):
14+ class FluentRecordFormatter (logging .Formatter , object ):
15+ """ A structured formatter for Fluent.
16+
17+ Best used with server storing data in an ElasticSearch cluster for example.
18+
19+ :param fmt: a dict with format string as values to map to provided keys.
20+ """
21+ def __init__ (self , fmt = None , datefmt = None ):
22+ super (FluentRecordFormatter , self ).__init__ (None , datefmt )
23+
24+ if not fmt :
25+ self ._fmt_dict = {
26+ 'sys_host' : '%(hostname)s' ,
27+ 'sys_name' : '%(name)s' ,
28+ 'sys_module' : '%(module)s' ,
29+ }
30+ else :
31+ self ._fmt_dict = fmt
32+
1633 self .hostname = socket .gethostname ()
1734
1835 def format (self , record ):
19- data = {'sys_host' : self .hostname ,
20- 'sys_name' : record .name ,
21- 'sys_module' : record .module ,
22- # 'sys_lineno': record.lineno,
23- # 'sys_levelno': record.levelno,
24- # 'sys_levelname': record.levelname,
25- # 'sys_filename': record.filename,
26- # 'sys_funcname': record.funcName,
27- # 'sys_exc_info': record.exc_info,
28- }
29- # if 'sys_exc_info' in data and data['sys_exc_info']:
30- # data['sys_exc_info'] = self.formatException(data['sys_exc_info'])
36+ # Compute attributes handled by parent class.
37+ super (FluentRecordFormatter , self ).format (record )
38+ # Add ours
39+ record .hostname = self .hostname
40+ # Apply format
41+ data = dict ([(key , value % record .__dict__ )
42+ for key , value in self ._fmt_dict .items ()])
3143
3244 self ._structuring (data , record .msg )
3345 return data
@@ -75,4 +87,4 @@ def close(self):
7587 self .sender ._close ()
7688 logging .Handler .close (self )
7789 finally :
78- self .release ()
90+ self .release ()
0 commit comments