Skip to content

Commit 9270876

Browse files
add log_time
1 parent 293d760 commit 9270876

File tree

5 files changed

+101
-4
lines changed

5 files changed

+101
-4
lines changed

CHANGES.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
Changelog
33
=========
44

5+
Version 0.1.2
6+
================
7+
* add :code:`log_time` method
8+
59
Version 0.1.1
610
===============
711
* fix error in setup.py

pysenal/io/file.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def read_lines(filename, encoding=_ENCODING_UTF8, keep_end=False,
5454

5555

5656
def read_lines_lazy(filename, encoding=_ENCODING_UTF8, keep_end=False,
57-
strip=False, skip_empty=False, default=None):
57+
strip=False, skip_empty=False, default=None, is_gzip=False):
5858
"""
5959
use generator to load files, one line every time
6060
:param filename: source file path
@@ -64,11 +64,16 @@ def read_lines_lazy(filename, encoding=_ENCODING_UTF8, keep_end=False,
6464
:param skip_empty: whether skip empty line, when strip is False, judge after strip
6565
:param default: returned value when filename is not existed.
6666
If it's None, exception will be raised as usual.
67+
:param is_gzip: whether the file is in gzip format
6768
:return: lines in file one by one
6869
"""
6970
if not os.path.exists(filename) and default is not None:
7071
return default
71-
file = open(filename, encoding=encoding)
72+
if not is_gzip:
73+
file = open(filename, encoding=encoding)
74+
else:
75+
file = gzip.open(filename, 'rt', encoding=encoding)
76+
7277
for line in file:
7378
if not keep_end:
7479
line = line.rstrip(_LINE_BREAKS)

pysenal/utils/logger.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# -*- coding: UTF-8 -*-
22
import sys
3+
import time
34
import logging
45

56

@@ -13,6 +14,63 @@ def get_logger(name, handler=logging.StreamHandler(sys.stderr), level=logging.DE
1314
"""
1415
logger = logging.getLogger(name)
1516
handler.setFormatter(logging.Formatter('[%(asctime)s] [{}] %(message)s'.format(name)))
17+
handler.setLevel(level)
1618
logger.addHandler(handler)
1719
logger.setLevel(level)
1820
return logger
21+
22+
23+
def log_time(logger=None, log_result=False, log_in_msg=False, request_stage='during'):
24+
"""
25+
func used this decorator must satisfy following condition
26+
1. first parameter is dict, indicate the query instance with query_id and start_time
27+
2. If log_result is True, logger will print str result or key `log` value of dict result.
28+
Result in other data type will raise exception.
29+
:param logger: python logger object,
30+
:param log_result: whether log func return value
31+
:param log_in_msg: whether log time in msg
32+
:param request_stage: request stage, default is during
33+
:return:
34+
"""
35+
if logger is None:
36+
logger = get_logger('default logger')
37+
38+
def log_time_func(f):
39+
new_logger = logger
40+
41+
def wrap(*args, **kwargs):
42+
if args and not isinstance(args[0], dict):
43+
if hasattr(args[0], 'logger'):
44+
logger = args[0].logger
45+
else:
46+
logger = new_logger
47+
else:
48+
logger = new_logger
49+
50+
name = f.__name__
51+
52+
start = time.time()
53+
ret = f(*args, **kwargs)
54+
step_time = time.time() - start
55+
step_time *= 1000
56+
57+
info = {'_funcName': name,
58+
'request_stage': request_stage,
59+
'step_time': '{:.0f}ms'.format(step_time)}
60+
61+
if log_in_msg:
62+
ret_str_tmpl = '[func_name:{}] [step_time:{}] [request_stage:{}]'
63+
ret_str = ret_str_tmpl.format(name, '{:.0f}ms'.format(step_time), request_stage)
64+
else:
65+
ret_str = ''
66+
67+
if log_result:
68+
ret_str += ' ' + str(ret)
69+
70+
ret_str = ret_str.strip()
71+
logger.info(ret_str, extra=info)
72+
return ret
73+
74+
return wrap
75+
76+
return log_time_func

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# -*- coding: utf-8 -*-
33
from setuptools import setup, find_packages
44

5-
VERSION = "0.1.1"
5+
VERSION = "0.1.2"
66

77
requirments = []
88

tests/utils/test_logger.py

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,31 @@
1-
# -*- coding: UTF-8 -*-
1+
# -*- coding: UTF-8 -*-
2+
import logging
3+
4+
from pysenal.utils.logger import *
5+
6+
7+
def test_get_logger():
8+
logger = get_logger('test_logger')
9+
assert logger.name == 'test_logger'
10+
11+
12+
def test_log_time():
13+
class T(object):
14+
def __init__(self):
15+
self.logger = get_logger('test_logger', level=logging.INFO)
16+
17+
@log_time(log_in_msg=True)
18+
def test(self):
19+
a = 1
20+
21+
@log_time(log_result=True)
22+
def test1(self):
23+
return 10
24+
25+
@log_time(log_in_msg=True)
26+
def test_time():
27+
a = 1
28+
29+
assert T().test() is None
30+
assert T().test1() == 10
31+
assert test_time() is None

0 commit comments

Comments
 (0)