好的日志对一个软件的重要性是显而易见的。如果函数的入口都要写一行代码来记录日志,这种方式实在是太低效了,但一直没有找到更好的方法。后来用python写一些软件,了解到python的装饰器功能时,突然人品爆发,结合装饰器来记录日志那是绝对的简单有效!

下面简单演示一下用装饰器来协助记录Log,示例代码如下:

  1. #!/usr/bin/env python
  2. def trace_func(func):
  3. '''''
  4. A decorate function to track all function invoke information with DEBUG level
  5. Usage:
  6. @trace_func
  7. def any_function(any parametet)
  8. '''
  9. def tmp(*args, **kargs):
  10. print 'Start %s(%s, %s)...' % (func.__name__, args, kargs)
  11. return func(*args, **kargs)
  12. return tmp
  13. @trace_func
  14. def log_test_with_empty_parameter():
  15. pass
  16. @trace_func
  17. def log_test_with_many_parameter(a_int, b_string, c_list, d_dict):
  18. pass
  19. @trace_func
  20. def log_test_with_key_parameter(a = 'www', b = 1, c = [1,2]):
  21. pass
  22. if __name__ == '__main__':
  23. log_test_with_empty_parameter()
  24. log_test_with_many_parameter(1, 'wwww', [1,2,'c'], {1: 'a', 2 : 'ww'})
  25. 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])

运行结果如下:

  1. [root@localhost python2]# ./a.py
  2. Start log_test_with_empty_parameter((), {})...
  3. Start log_test_with_many_parameter((1, 'wwww', [1, 2, 'c'], {1: 'a', 2: 'ww'}), {})...
  4. 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】装饰器实现日志记录的更多相关文章

  1. python 装饰器 一篇就能讲清楚

    装饰器一直是我们学习python难以理解并且纠结的问题,想要弄明白装饰器,必须理解一下函数式编程概念,并且对python中函数调用语法中的特性有所了解,使用装饰器非常简单,但是写装饰器却很复杂.为了讲 ...

  2. Python装饰器用法

    在Python中,装饰器一般用来修饰函数,实现公共功能,达到代码复用的目的.在函数定义前加上@xxxx,然后函数就注入了某些行为,很神奇!然而,这只是语法糖而已. 场景 假设,有一些工作函数,用来对数 ...

  3. 理解 Python 装饰器看这一篇就够了

    讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它 ...

  4. Python高级特性: 12步轻松搞定Python装饰器

    12步轻松搞定Python装饰器 通过 Python 装饰器实现DRY(不重复代码)原则:  http://python.jobbole.com/84151/   基本上一开始很难搞定python的装 ...

  5. Python装饰器高级用法

    在Python中,装饰器一般用来修饰函数,实现公共功能,达到代码复用的目的.在函数定义前加上@xxxx,然后函数就注入了某些行为,很神奇!然而,这只是语法糖而已. 场景 假设,有一些工作函数,用来对数 ...

  6. 你必须学写 Python 装饰器的五个理由

    你必须学写Python装饰器的五个理由 ----装饰器能对你所写的代码产生极大的正面作用 作者:Aaron Maxwell,2016年5月5日 Python装饰器是很容易使用的.任何一个会写Pytho ...

  7. Python装饰器基础

    一.Python装饰器引入 讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个 ...

  8. Python——装饰器(Decorator)

    1.什么是装饰器? 装饰器放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上.和这个函数绑定在一起.在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶 ...

  9. 粗浅聊聊Python装饰器

    浅析装饰器 通常情况下,给一个对象添加新功能有三种方式: 直接给对象所属的类添加方法: 使用组合:(在新类中创建原有类的对象,重复利用已有类的功能) 使用继承:(可以使用现有类的,无需重复编写原有类进 ...

随机推荐

  1. 关于Logstash中grok插件的正则表达式例子

    一.前言 近期需要对Nginx产生的日志进行采集,问了下度娘,业内最著名的解决方案非ELK(Elasticsearch, Logstash, Kibana)莫属. Logstash负责采集日志,Ela ...

  2. node-java模块

    node-java模块 node-java使得开发人员,可以调用java优秀的jar包资源.有些方法逻辑,可能node不容易实现,但是java就可以很方便去做.这个时候,就可以使用node-java这 ...

  3. python No migrations to apply

    错误显示:  “No migrations to apply” 错误情况:python在通过model同步数据库时,提示 No migrations to apply 查看数据库,新表没有被创建,只是 ...

  4. C# 推送到极光

    https://docs.jiguang.cn/jpush/resources/ 下载后有完整的例子 引用 Jiguang.JPush.dll using System; using Jiguang. ...

  5. PAT L3-011. 直捣黄龙

    最短路. 先求出一个只包含最短路的$DAG$,然后在$DAG$上$dp$一下就可以了.英文变数字还有$map$转一下. #include<map> #include<set> ...

  6. CNN-感受野

    CNN中感受野的计算:http://blog.csdn.net/kuaitoukid/article/details/46829355(好像有错误)http://blog.csdn.net/green ...

  7. Java 获取JVM内存和物理内存信息

    package com.sysinfo; public class MonitorInfo { /** jvm可使用内存. */ private long totalMemory; /** jvm剩余 ...

  8. Bzoj 4524 [Cqoi2016]伪光滑数(堆)

    题面 题解 先筛出$<128$的质数,很少,打个表即可 然后钦定一个质数最大,不断替换即可(丢进大根堆里面,然后取出一个,替换在丢进去即可) 具体来说,设一个四元组$[t,x,y,z]$表示当前 ...

  9. 洛谷——P1208 [USACO1.3]混合牛奶 Mixing Milk

    P1208 [USACO1.3]混合牛奶 Mixing Milk 题目描述 由于乳制品产业利润很低,所以降低原材料(牛奶)价格就变得十分重要.帮助Marry乳业找到最优的牛奶采购方案. Marry乳业 ...

  10. 【模拟退火】poj1379 Run Away

    题意:平面上找一个点,使得其到给定的n个点的距离的最小值最大. 模拟退火看这篇:http://www.cnblogs.com/autsky-jadek/p/7524208.html 这题稍有不同之处仅 ...