python使用装饰器作日志处理的方法_python

来源:脚本之家  责任编辑:小易  

把每个页面作为 dict 的键,其对应的值用于记录出现的次数,逐行处理每条日志将得到的字典(比如名字是 record),对其作以下操作:most_visited=sorted(record.items(),key=lambda r:r[1],reverse=True)[:10]www.zgxue.com防采集请勿采集本网。

装饰器这东西我看了一会儿才明白,在函数外面套了一层函数,感觉和java里的aop功能很像;写了2个装饰器日志的例子,

对于研究者来说,纪录一份有关他们工作的详尽日志是一种标准要求。它提供了日后详细了解工作执行过程、方式、结果以及结论。保证正确的焦点和提高效率:大多数的办公室和实验室有太多的令人分心

第一个是不带参数的装饰器用法示例,功能相当于给函数包了层异常处理,第二个是带参数的装饰器用法示例,将日志输出到文件。

在以往某些项目的施工安全日志不难发现,今天已经是六月几日,但往往施工安全日志的填写还停留在五月份中旬,更甚者出现三、四月份的都没有填写。(2)记录简单:没有把当天的天气情况、施工的分项工程

```#coding=utf8import tracebackimport loggingfrom logging.handlers import TimedRotatingFileHandlerdef logger(func): def inner(*args, **kwargs): #1 try: #print "Arguments were: %s, %s" % (args, kwargs) func(*args, **kwargs) #2 except: #print 'error',traceback.format_exc() print 'error' return innerdef loggerInFile(filename):#带参数的装饰器需要2层装饰器实现,第一层传参数,第二层传函数,每层函数在上一层返回 def decorator(func): def inner(*args, **kwargs): #1 logFilePath = filename # 日志按日期滚动,保留5天 logger = logging.getLogger() logger.setLevel(logging.INFO) handler = TimedRotatingFileHandler(logFilePath, when="d", interval=1, backupCount=5) formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) try: #print "Arguments were: %s, %s" % (args, kwargs) result = func(*args, **kwargs) #2 logger.info(result) except: logger.error(traceback.format_exc()) return inner return decorator@loggerdef test(): print 2/0test()@loggerInFile('newloglog')def test2(n): print 100/ntest2(10)test2(0)print 'end'```

一、删除日志文件。二、手动收缩。操作百如下: 1、在数据库页面中选择“选项度”;2、在打开的选项页面中,将恢复模式更改为知“简单”;道 3、然后点击下方的“确定”;4、然后在数据库文件和

以上这篇python使用装饰器作日志处理的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持真格学网。

1、首先确认你日7a686964616fe58685e5aeb931333365643661志是否启用了mysql>show variables like 'log_bin'。2、如果启用了,即ON,那日志文件就在mysql的安装目录的data目录下。3、怎样知道当前

作者:zhijun liu链接:http://www.zhihu.com/question/26930016/answer/99243411来源:知乎著作权归作者所有,转载请联系作者获得授权。先来个形象比方内裤可以用来遮羞,但是到了冬天它没法为我们防风御寒,聪明的人们发明了长裤,有了长裤后宝宝再也不冷了,装饰器就像我们这里说的长裤,在不影响内裤作用的前提下,给我们的身子提供了保暖的功效。再回到我们的主题装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。先来看一个简单例子:def foo():print('i am foo')现在有一个新的需求,希望可以记录下函数的执行日志,于是在代码中添加日志代码:def foo():print('i am foo')logging.info("foo is running")bar()、bar2()也有类似的需求,怎么做?再写一个logging在bar函数里?这样就造成大量雷同的代码,为了减少重复写代码,我们可以这样做,重新定义一个函数:专门处理日志,日志处理完之后再执行真正的业务代码def use_logging(func):logging.warn("%s is running"%func._name_)func()def bar():print('i am bar')use_logging(bar)逻辑上不难理解,但是这样的话,我们每次都要将一个函数作为参数传递给use_logging函数。而且这种方式已经破坏了原有的代码逻辑结构,之前执行业务逻辑时,执行运行bar(),但是现在不得不改成use_logging(bar)。那么有没有更好的方式的呢?当然有,答案就是装饰器。简单装饰器def use_logging(func):def wrapper(*args,*kwargs):logging.warn("%s is running"%func._name_)return func(*args,*kwargs)return wrapperdef bar():print('i am bar')bar=use_logging(bar)bar()函数use_logging就是装饰器,它把执行真正业务方法的func包裹在函数里面,看起来像bar被use_logging装饰了。在这个例子中,函数进入和退出时,被称为一个横切面(Aspect),这种编程方式被称为面向切面的编程(Aspect-Oriented Programming)。符号是装饰器的语法糖,在定义函数的时候使用,避免再一次赋值操作def use_logging(func):def wrapper(*args,*kwargs):logging.warn("%s is running"%func._name_)return func(*args)return wrapperuse_loggingdef foo():print("i am foo")use_loggingdef bar():print("i am bar")bar()如上所示,这样我们就可以省去bar=use_logging(bar)这一句了,直接调用bar()即可得到想要的结果。如果我们有其他的类似函数,我们可以继续调用装饰器来修饰函数,而不用重复修改函数或者增加新的封装。这样,我们就提高了程序的可重复利用性,并增加了程序的可读性。装饰器在Python使用如此方便都要归因于Python的函数能像普通的对象一样能作为参数传递给其他函数,可以被赋值给其他变量,可以作为返回值,可以被定义在另外一个函数内。带参数的装饰器装饰器还有更大的灵活性,例如带参数的装饰器:在上面的装饰器调用中,比如@use_logging,该装饰器唯一的参数就是执行业务的函数。装饰器的语法允许我们在调用时,提供其它参数,比如@decorator(a)。这样,就为装饰器的编写和使用提供了更大的灵活性。def use_logging(level):def decorator(func):def wrapper(*args,*kwargs):if level="warn":logging.warn("%s is running"%func._name_)return func(*args)return wrapperreturn decoratoruse_logging(level="warn")def foo(name='foo'):print("i am%s"%name)foo()上面的use_logging是允许带参数的装饰器。它实际上是对原有装饰器的一个函数封装,并返回一个装饰器。我们可以将它理解为一个含有参数的闭包。当我 们使用@use_logging(level="warn")调用的时候,Python能够发现这一层的封装,并把参数传递到装饰器的环境中。类装饰器再来看看类装饰器,相比函数装饰器,类装饰器具有灵活度大、高内聚、封装性等优点。使用类装饰器还可以依靠类内部的\\_\\_call\\_\\_方法,当使用@形式将装饰器附加到函数上时,就会调用此方法。class Foo(object):def_init_(self,func):self._func=funcdef_call_(self):print('class decorator runing')self._func()print('class decorator ending')Foodef bar():print('bar')bar()functools.wraps使用装饰器极大地复用了代码,但是他有一个缺点就是原函数的元信息不见了,比如函数的docstring、_name_、参数列表,先看例子:装饰器def logged(func):def with_logging(*args,*kwargs):print func._name_+"was calledreturn func(*args,*kwargs)return with_logging函数loggeddef f(x):does some math""return x+x*x该函数完成等价于:def f(x):does some math""return x+x*xf=logged(f)不难发现,函数f被with_logging取代了,当然它的docstring,_name_就是变成了with_logging函数的信息了。print f._name_#prints 'with_logging'print f._doc_#prints None这个问题就比较严重的,好在我们有functools.wraps,wraps本身也是一个装饰器,它能把原函数的元信息拷贝到装饰器函数中,这使得装饰器函数也有和原函数一样的元信息了。from functools import wrapsdef logged(func):wraps(func)def with_logging(*args,*kwargs):print func._name_+"was calledreturn func(*args,*kwargs)return with_loggingloggeddef f(x):does some math""return x+x*xprint f._name_#prints 'f'print f._doc_#prints 'does some math'内置装饰器staticmathod、@classmethod、@property装饰器的顺序abcdef f():等效于f=a(b(c(f)))编辑于 2016-08-098 条评论感谢没有帮助作者保留权利4反对,不会显示你的姓名许多人选择编程是因为他们喜欢把时间花在…4 人赞同先理解一下闭包的概念吧,之前回答过一个有关闭包和装饰器的问题,可以参考一下:Python 里函数里返回一个函数内部定义的函数?知乎用户的回答显示全部先理解一下闭包的概念吧,之前回答过一个有关闭包和装饰器的问题,可以参考一下:Python 里函数里返回一个函数内部定义的函数?知乎用户的回答发布于 2014-12-092 条评论感谢没有帮助作者保留权利1反对,不会显示你的姓名罗伊后端工程师1 人赞同内置语法糖 格式优美 逼格较高在代码中使用洽到好处的装饰器瞬间让代码优美很多 写起来也很简单 无参的装饰器参数是要装饰的函数 有参装饰器参数是需要的参数 最后返回的是内部函数 参考http://m.blog.csdn.net/blog/yueguanghaidao/10089181显示全部内置语法糖 格式优美 逼格较高在代码中使用洽到好处的装饰器瞬间让代码优美很多写起来也很简单 无参的装饰器参数是要装饰的函数 有参装饰器参数是需要的参数 最后返回的是内部函数 参考http://m.blog.csdn.net/blog/yueguanghaidao/10089181发布于 2014-12-06添加评论感谢没有帮助作者保留权利Chasing Stars.12 人赞同之前给出一个链接,现在尝试用自己方式梳理一下#有时爱用蹩脚的英文注释,唔.>>#先从函数说起def foo1():print('this is a function')foo1()#print.in console.'这是一种最为简单的函数-不涉及到任何变量,参数 只是做了一件不以为然的事儿'…显示全部之前给出一个链接,现在尝试用自己方式梳理一下#有时爱用蹩脚的英文注释,唔.先从函数说起def foo1():print('this is a function')foo1()#print.in console.'这是一种最为简单的函数-不涉及到任何变量,参数 只是做了一件不以为然的事儿'函数的域 作用范围 以及一个局部变量global_string='this is a global string,my name is global_string'def foo2():lets see its locals variablelocal variable in foo2x=3print('foo2 locals:',locals())foo2()#foo2 locals:{'x':3}print('-'*40)check global variable#gets a dictionary,and global_string inside.print('globals:',globals())一个变量的生存的周期def foo3():x=3print("x value:",x)foo3()'try to run x+3'x+5,uncomment when you run.get NameError-x is not defined=x is dead.下面来看带有参数的函数def foo4(s):print(',i can print>',s)foo4('foobar')或者可以多个参数,甚至是默认的def foo5(s,repeat=3):print(',i can print over and over>',s*repeat)foo5('foobar')'if call a function with un-matched arguments,error comes'foo5(1,2,3)#TypeError:foo5()takes from 1 to 2 positional arguments but 3 were given'foo5 能接收1-2个参数,大哥你给了3个.typeerror'嵌套函数def outer():x=71def inner():print('hello,i am inner')print('outer variable x ',x)inner()outer()'可以看到 内部函数能够访问外部函数的变量'把函数当作一个对象'查看类的属性_class_built-in function'i=3print(i._class_)#print(outer._class_)#'''所以 既然 一个整数i 可以当作某函数的参数,那么 这里的 函数 outer 当然也可以作为某个函数的参数!'''def applyfunc(func,args,repeat=3):i=0repeat=3 if repeatwhile ifunc(args)i+1def test(s):print('a test function',s)applyfunc(test,'love is important',repeat=3)'可以看到 通过调用一个函数 applyfunc-让一个简单函数运行至少3次'Closures 不想翻译成闭包def outer2():x=127def inner2():print(x)return inner2foobar=outer2()foobar#print nothingprint(foobar._closure_)#(,)'可以看到 foobar中封存了一个整数对象 int object at 0x...内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • python @property装饰器原理解析
  • python中property和setter装饰器用法
  • python装饰器使用实例详解
  • python函数装饰器之带参数的函数和带参数的装饰器用法示例
  • python装饰器练习题及答案
  • python3.7 新特性之dataclass装饰器
  • python装饰器的应用场景代码总结
  • python中常用的内置方法
  • python多进程入门、分布式进程数据共享实例详解
  • python+jinja2实现接口数据批量生成工具
  • python pillow模块使用方法详解
  • python实现字符串格式化的方法小结
  • 关于阿里云oss获取sts凭证 app直传 python的实例
  • python面向对象程序设计类的多态用法详解
  • python解析文件示例
  • 对python 调用类属性的方法详解
  • python3使用tcp编写一个简易的文件下载器功能
  • 如何理解Python装饰器
  • 用python如何找到日志数据中访问次数最多的前10个页面
  • windows系统日志是作什么用的?能删除吗?
  • 前台的工作日志怎么写嘛
  • 写工作日志有什么好处?
  • 安全生产工作日志
  • SQL server数据库日志满了怎么处理?
  • 如何查看mysql数据库操作记录日志
  • 施工日志怎么写?
  • 如何查看oracle的日志文件
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全vbsdos/bathtahtcpythonperl游戏相关vba远程脚本coldfusionruby专题autoitseraphzonepowershelllinux shellluagolangerlang其它首页python @property装饰器原理解析python中property和setter装饰器用法python装饰器使用实例详解python函数装饰器之带参数的函数和带参数的装饰器用法示例python装饰器练习题及答案python3.7 新特性之dataclass装饰器python装饰器的应用场景代码总结python中常用的内置方法python多进程入门、分布式进程数据共享实例详解python+jinja2实现接口数据批量生成工具python pillow模块使用方法详解python实现字符串格式化的方法小结关于阿里云oss获取sts凭证 app直传 python的实例python面向对象程序设计类的多态用法详解python解析文件示例对python 调用类属性的方法详解python3使用tcp编写一个简易的文件下载器功能python入门教程 超详细1小时学会python 列表(list)操作方法详解python 元组(tuple)操作详解python 字典(dictionary)操作详解pycharm 使用心得(一)安装和首python strip()函数 介绍python 中文乱码问题深入分析python中使用xlrd、xlwt操作excepython科学计算环境推荐——anacpython逐行读取文件内容的三种方python遍历小写英文字母的方法在ipython中执行python程序文件的示例python使用pygame播放midi和mp3文件的方法python实现的线性回归算法示例【附csv文件python 将字符串中的数字相加求和的实现python实现flappy bird小游戏python 网络编程起步(socket发送消息)python smtp实现发送带附件电子邮件python微信跳一跳系列之色块轮廓定位棋盘浅谈python 四种数值类型(int,long,float
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved