【Python】装饰器实现日志记录
好的日志对一个软件的重要性是显而易见的。如果函数的入口都要写一行代码来记录日志,这种方式实在是太低效了,但一直没有找到更好的方法。后来用python写一些软件,了解到python的装饰器功能时,突然人品爆发,结合装饰器来记录日志那是绝对的简单有效!
下面简单演示一下用装饰器来协助记录Log,示例代码如下:
- #!/usr/bin/env python
- def trace_func(func):
- '''''
- A decorate function to track all function invoke information with DEBUG level
- Usage:
- @trace_func
- def any_function(any parametet)
- '''
- def tmp(*args, **kargs):
- print 'Start %s(%s, %s)...' % (func.__name__, args, kargs)
- return func(*args, **kargs)
- return tmp
- @trace_func
- def log_test_with_empty_parameter():
- pass
- @trace_func
- def log_test_with_many_parameter(a_int, b_string, c_list, d_dict):
- pass
- @trace_func
- def log_test_with_key_parameter(a = 'www', b = 1, c = [1,2]):
- pass
- if __name__ == '__main__':
- log_test_with_empty_parameter()
- log_test_with_many_parameter(1, 'wwww', [1,2,'c'], {1: 'a', 2 : 'ww'})
- log_test_with_key_parameter(1, 'wwww', c = [3, 4])
#!/usr/bin/env python
def trace_func(func):
'''
A decorate function to track all function invoke information with DEBUG level
Usage:
@trace_func
def any_function(any parametet)
'''
def tmp(*args, **kargs):
print 'Start %s(%s, %s)...' % (func.__name__, args, kargs)
return func(*args, **kargs)
return tmp
@trace_func
def log_test_with_empty_parameter():
pass
@trace_func
def log_test_with_many_parameter(a_int, b_string, c_list, d_dict):
pass
@trace_func
def log_test_with_key_parameter(a = 'www', b = 1, c = [1,2]):
pass
if __name__ == '__main__':
log_test_with_empty_parameter()
log_test_with_many_parameter(1, 'wwww', [1,2,'c'], {1: 'a', 2 : 'ww'})
log_test_with_key_parameter(1, 'wwww', c = [3, 4])
运行结果如下:
- [root@localhost python2]# ./a.py
- Start log_test_with_empty_parameter((), {})...
- Start log_test_with_many_parameter((1, 'wwww', [1, 2, 'c'], {1: 'a', 2: 'ww'}), {})...
- Start log_test_with_key_parameter((1, 'wwww'), {'c': [3, 4]})...
[root@localhost python2]# ./a.py
Start log_test_with_empty_parameter((), {})...
Start log_test_with_many_parameter((1, 'wwww', [1, 2, 'c'], {1: 'a', 2: 'ww'}), {})...
Start log_test_with_key_parameter((1, 'wwww'), {'c': [3, 4]})...
用这种方式记录日志一段时间以后,我还在为创意沾沾自喜时,却无意中发现,利用装饰器函数记录日志的方法早就是python程序员记录日志常用方法了。
参考资料:
Python 日志方法(装饰器):http://www.thinksaas.cn/group/topic/92386/
利用python的装饰器函数来记录日志:http://blog.csdn.net/guosha/article/details/6457171
Python精选文章: 装饰器与AOP:http://www.django-china.cn/topic/148/
【Python】装饰器实现日志记录的更多相关文章
- python 装饰器 一篇就能讲清楚
装饰器一直是我们学习python难以理解并且纠结的问题,想要弄明白装饰器,必须理解一下函数式编程概念,并且对python中函数调用语法中的特性有所了解,使用装饰器非常简单,但是写装饰器却很复杂.为了讲 ...
- Python装饰器用法
在Python中,装饰器一般用来修饰函数,实现公共功能,达到代码复用的目的.在函数定义前加上@xxxx,然后函数就注入了某些行为,很神奇!然而,这只是语法糖而已. 场景 假设,有一些工作函数,用来对数 ...
- 理解 Python 装饰器看这一篇就够了
讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它 ...
- Python高级特性: 12步轻松搞定Python装饰器
12步轻松搞定Python装饰器 通过 Python 装饰器实现DRY(不重复代码)原则: http://python.jobbole.com/84151/ 基本上一开始很难搞定python的装 ...
- Python装饰器高级用法
在Python中,装饰器一般用来修饰函数,实现公共功能,达到代码复用的目的.在函数定义前加上@xxxx,然后函数就注入了某些行为,很神奇!然而,这只是语法糖而已. 场景 假设,有一些工作函数,用来对数 ...
- 你必须学写 Python 装饰器的五个理由
你必须学写Python装饰器的五个理由 ----装饰器能对你所写的代码产生极大的正面作用 作者:Aaron Maxwell,2016年5月5日 Python装饰器是很容易使用的.任何一个会写Pytho ...
- Python装饰器基础
一.Python装饰器引入 讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个 ...
- Python——装饰器(Decorator)
1.什么是装饰器? 装饰器放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上.和这个函数绑定在一起.在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶 ...
- 粗浅聊聊Python装饰器
浅析装饰器 通常情况下,给一个对象添加新功能有三种方式: 直接给对象所属的类添加方法: 使用组合:(在新类中创建原有类的对象,重复利用已有类的功能) 使用继承:(可以使用现有类的,无需重复编写原有类进 ...
随机推荐
- ssm框架问题和Java
http://blog.csdn.net/zzjjiandan/article/details/20853233 BeanFactory的作用是什么? BeanFactory是配置.创建.管理bean ...
- initerrlog: 无法打开错误日志文件 'D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log 解决办法
initerrlog: 无法打开错误日志文件 'D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log 1. 设置 ...
- python的vim的环境配置(后续慢慢补充进来)
#vim ~/.vimrc set smartindent set smarttab set expandtab set tabstop= set softtabshtop= set shiftwid ...
- HDU 1611 敌兵布阵【线段树模板】
#include<cstdio> #include<string> #include<cstdlib> #include<cmath> #include ...
- CodeForces 738E Subordinates
排序,构造. 相当于告诉我们一棵树$n$个节点,每个节点在哪一层,至少需要移动多少个节点,才能让这些节点变成一棵树. 按照层次排个序移动一下就可以了,优先选择那些不是$s$但是层次是$0$的节点,如果 ...
- vue中keep-alive
vue2.0提供了一个keep-alive组件用来缓存组件,避免多次加载相应的组件,减少性能消耗 1.基本用法,缓存整个页面或组件 <keep-alive> <component&g ...
- mysql 删除表记录 delete和truncate table区别
MySQL中删除表记录delete from和truncate table的用法区别: mysql中有两种删除表中记录的方法: (1)delete from语句, (2)truncate table语 ...
- xUtils 中的 BitmapUtils
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha xUtils框架,包括BitmapUtils.DbUtils.ViewUtils和Htt ...
- [TCO2013]LitPanels
题意:一个$n\times m$的无色网格,你可以在其中选择两个$x\times y$的子矩形并在其中将其中任意的格子涂上颜色,问最终能得到多少种不同的网格 做这题会用到一个概念叫包围盒(boundi ...
- 【搜索】【约数个数定理】[HAOI2007]反素数ant
对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数. 所以,n以内的反质数即为不超过n的 ...