8000 Merge pull request #2 from kzk/master · ludwick/fluent-logger-python@9b2f75b · GitHub
[go: up one dir, main page]

Skip to content

Commit 9b2f75b

Browse files
committed
Merge pull request fluent#2 from kzk/master
added python loghandler-based client
2 parents fd51cb5 + 1c986c8 commit 9b2f75b

File tree

4 files changed

+123
-10
lines changed

4 files changed

+123
-10
lines changed

fluent/handler.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import logging
2+
import os
3+
import sys, urllib
4+
import msgpack
5+
import socket
6+
import threading
7+
import json
8+
9+
from fluent import sender
10+
11+
class FluentRecordFormatter(object):
12+
def __init__(self):
13+
self.hostname = socket.gethostname()
14+
15+
def format(self, record):
16+
data = {
17+
'sys_host' : self.hostname,
18+
'sys_name' : record.name,
19+
'sys_module' : record.module,
20+
# 'sys_lineno' : record.lineno,
21+
# 'sys_levelno' : record.levelno,
22+
# 'sys_levelname' : record.levelname,
23+
# 'sys_filename' : record.filename,
24+
# 'sys_funcname' : record.funcName,
25+
# 'sys_exc_info' : record.exc_info,
26+
}
27+
# if 'sys_exc_info' in data and data['sys_exc_info']:
28+
# data['sys_exc_info'] = self.formatException(data['sys_exc_info'])
29+
30+
self._structuring(data, record.msg)
31+
return data
32+
33+
def _structuring(self, data, msg):
34+
if isinstance(msg, dict):
35+
self._add_dic(data, msg)
36+
elif isinstance(msg, str):
37+
try:
38+
self.add_dic(data, json.loads(str(msg)))
39+
except:
40+
pass
41+
42+
def _add_dic(self, data, dic):
43+
for k, v in dic.items():
44+
if isinstance(k, str):
45+
data[str(k)] = v
46+
47+
class FluentHandler(logging.Handler):
48+
'''
49+
Logging Handler for fluent.
50+
'''
51+
def __init__(self,
52+
tag,
53+
host='localhost',
54+
port=24224,
55+
timeout=3.0,
56+
verbose=False):
57+
58+
self.tag = tag
59+
self.sender = sender.FluentSender(tag,
60+
host=host, port=port,
61+
timeout=timeout, verbose=verbose)
62+
self.fmt = FluentRecordFormatter()
63+
logging.Handler.__init__(self)
64+
65+
def emit(self, record):
66+
if record.levelno < self.level: return
67+
data = self.fmt.format(record)
68+
self.sender.emit('', data)
69+
70+
def _close(self):
71+
self.sender._close()

tests/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import sys
22
sys.path = ['..'] + sys.path
33

4-
from test_handler import *
4+
from test_event import *
55
from test_sender import *
6+
from test_handler import *

tests/test_event.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import unittest
2+
3+
import fluent
4+
from fluent import event, sender
5+
6+
sender.setup(server='localhost', tag='app')
7+
8+
class TestHandler(unittest.TestCase):
9+
def testLogging(self):
10+
# send event with tag app.follow
11+
event.Event('follow', {
12+
'from': 'userA',
13+
'to': 'userB'
14+
})

tests/test_handler.py

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,41 @@
11
import unittest
2+
import mockserver
3+
import logging
4+
import fluent.handler
5+
import msgpack
26

3-
import fluent
4-
from fluent import event, sender
7+
class TestLogger(unittest.TestCase):
8+
def setUp(self):
9+
super(TestLogger, self).setUp()
10+
for port in xrange(10000, 20000):
11+
try:
12+
self._server = mockserver.MockRecvServer(port)
13+
self._port = port
14+
break
15+
except IOError, e:
16+
pass
517

6-
sender.setup(server='localhost', tag='app')
18+
def get_data(self):
19+
return self._server.get_recieved()
D11A
720

8-
class TestHandler(unittest.TestCase):
9-
def testLogging(self):
10-
# send event with tag app.follow
11-
event.Event('follow', {
12-
'from': 'userA',
13-
'to': 'userB'
21+
def test_simple(self):
22+
h = fluent.handler.FluentHandler('app.follow', port=self._port)
23+
24+
logging.basicConfig(level=logging.INFO)
25+
l = logging.getLogger('fluent.test')
26+
l.addHandler(h)
27+
l.info({
28+
'from': 'userA',
29+
'to': 'userB'
1430
})
31+
h._close()
32+
33+
data = self.get_data()
34+
#print
35+
#eq = self.assertEqual
36+
#eq(1, len(data))
37+
#eq(3, len(data[0]))
38+
#eq('test.foo', data[0][0])
39+
#eq({'bar':'baz'}, data[0][2])
40+
#self.assert_(data[0][1])
41+
#self.assert_(isinstance(data[0][1], int))

0 commit comments

Comments
 (0)
0