正确使用安全套的八个步骤是,正确使用土豆片敷乳房图片

  正确使用安全套的八个步骤是,正确使用土豆片敷乳房图片

  本文主要参考:http://victorlin . me/posts/2012/08/26/good-logging-practice-in-python

  ==========================

  应用的测井实践

  ==========================

  1.对于主模块,直接为根记录器设置记录器输出。这样,所有模块都将根据root logger的设置注销。

  2.包括主模块在内的所有模块都应该使用logging.getLogger(__name__)来获取Logger实例。使用getLogger(__name__)获得的logger,输出日志可以反映模块的命名空间。主模块getLogger()调用应该在日志初始化之后进行。

  3.对于非主模块,不要做logger的初始化配置,不要在模块级调用getLogger(),而要在函数或类中调用。

  原因:主要原因是日志配置应该是主模块的特权。还有一个原因就是我们的主模块往往是先导入非主模块,然后用logging.config.fileConfig()初始化,而fileConfig()缺少了所有省会禁用现有的日志器,也就是说所有非主模块级别的日志器都被禁止,所以不能再用于日志记录。

  4.建议主模块和非主模块都使用logger.info()和logger.debug()来记录日志。不建议使用logging.info()和logging.debug()这样的方法。后者使用root logger,所有模块都使用root,无法区分哪个模块生成日志。

  5.建议使用cloghandler.py的ConcurrentRotatingFileHandler .

  而不是FileHandler和RotatingFileHandler和TimedRotatingFileHandler。

  原因是FileHandler,单文件日志有很多缺点。

  RotatingFileHandler的问题是在windows下当文件大小达到max时,日志记录操作会报错,有时会记录不到新的日志。另外,如果多个程序写入同一个日志文件,RotatingFileHandler也会报错,而cloghandler.py就没有这样的问题。

  TimedRotatingFileHandler的问题是,在windows下,如果23:59正在写日志文件,日志记录操作也会报错,而且日志文件不能重命名,所以新的日志有时会记不住。当然,这个概率小于RotatingFileHandler的失败概率。

  请参阅http://pydoc . net/python/cloud/2 . 3 . 9/cloud . util . clogghandler . clogghandler/

  6.我使用长日志格式,

  注意:在前面加上# # #,这样log parser就可以很容易的将不同的日志记录分开。使用代替逗号作为分隔符,因为时间字符串中会有逗号。

  格式化程序=记录。formatter(fmt= # # # # %(ASC time)s PID=%(process)d tid=%(thread)d %(name)s %(level name)s %(message)s )

  日志的简短格式,我用的是,

  shortFormatter=记录。formatter(fmt= # # # # %(ASC time)S %(name)S %(level name)S %(message)S ,datefmt=%H:%M:%S )

  7.关于应用如何合并第三方类库的日志输出,比如合并SqlAlchemy的日志。

  不要特别在意。只要我们的程序有一个根日志记录器,应用程序和SqlAlchemy的日志自然会合并并输出到根日志记录器的处理程序中。

  ==========================

  类库的日志实践

  ==========================

  1.类库日志的使用其实和应用的非主模块差不多。

  2.在类库的顶级库中,最好在logger中添加NullHandler,这样即使应用程序根本没有配置日志记录,也不会出现没有配置日志记录的警告信息。

  =========================

  几个相关的功能

  ==========================

  RootLogger=logging . get logger()# get logger()不带参数,结果是root logger。

  logging . basic config(level=logging . debug)#是一种方便的日志配置方案,其输出为stderr,非常适合演示和调试程序。

  logging . config . dict config(dict _ log _ config)#使用dict初始化记录器

  logging . config . file config(ini _ file)#使用ini文件初始化记录器

  ==========================

  选择适当的日志记录级别。

  ==========================

  这里也有很多误区,很多程序员喜欢滥用错误级别。但是最佳日志记录实践中的介绍,

  http://www.bitstech.net/2014/01/07/log-best-practice/调试:开发人员调试,比如记录详细的业务动作,比如SQL。

  信息:记录一些关键的行动和数据。

  警告:用于那些对业务功能已有影响,但不太严重的情形

  错误:仅用于记录那些已影响业务功能的错误或例外

  致命: (同关键)仅用于影响到程序完全不能工作的情况,比如非法退出

  如果还不容易区分,换另一个角度,警告和错误级别的问题,都是需要及时处理。

  =========================

  词典配置的写法

  ==========================

  1.具体初始化设置文件的后缀名配置文件如何写,参考大蟒日志不完全指南http://cjs.linuxapp.org/?p=116

  2.词典配置,后面有个样本。

  字典日志配置={

  #版本总是一

  版本:1,

  #

   disable _ existing _ loggers :False,

  格式化程序:{

  标准:{

  格式:%(ASC时间)s[%(级别名称)s]%(名称)s:%(消息)s

  },

  },

  处理程序:{

  默认:{

  级别:信息,

  类":"日志记录 StreamHandler ,

  },

  },

  "记录器":{

  #加一个根记录器

  : {

  处理程序:[默认],

  级别:信息,

  传播:真

  },

  #加其他记录器

  django.request :

  处理程序:[默认],

  级别:警告,

  “传播”:假

  },

  }

  }==========================

  初始化设置文件的后缀名配置的写法

  ==========================

  参考大蟒日志不完全指南http://cjs.linuxapp.org/?p=116

  # 定义记录器模块,根是必需的,其它的是自定义。

  [伐木工人]

  keys=root,web.debug,web.info,web.error

  # 定义格式化输出

  [格式化程序]

  keys=simpleFormatter,webSimpleFormatter

  # 定义处理者

  [经手人]

  keys=consoleHandler、rotateFileHandler、webDebugRotateFileHandler、webInfoRotateFileHandler、webErrorRotateFileHandler、webSMTPHandler

  # -

  # 实现上面定义的记录器模块,必需是[logger_xxxx]这样的形式

  # -

  # [logger_xxxx] logger_模块名称

  #级别级别,级别有调试、信息、警告、错误、严重

  #处理程序处理类,可以有多个,用逗号分开

  # qualname记录器名称,应用程序通过logging.getLogger获取。对于不能获取的名称,则记录到根模块。

  #传播是否继承父类的原木信息,0:否1:是

  [logger_root]

  级别=调试

  handlers=consoleHandler,rotateFileHandler

  [logger_web.debug]

  级别=调试

  handlers=consoleHandler,webDebugRotateFileHandler

  qualname=web.debug

  传播=0

  [logger_web.info]

  级别=信息

  handlers=consoleHandler,webInfoRotateFileHandler

  qualname=web.info

  传播=0

  [logger_web.error]

  级别=错误

  handlers=consoleHandler,webErrorRotateFileHandler,webSMTPHandler

  qualname=web.error

  传播=0

  # -

  # 日志格式

  # -

  # %(asctime)s年-月-日时-分-秒,毫秒2013-04-26 20:10:43,745

  # %(文件名)s文件名,不含目录

  # %(路径名)s目录名,完整路径

  # %(funcName)s函数名

  # %(级别名)s级别名

  # %(行号)d行号

  # %(模块)s模块名

  # %(消息)秒消息体

  # %(名称)s日志模块名

  # %(进程)d进程编号

  # %(进程名)s进程名

  # %(线程)d线程编号

  # %(线程名)s线程名

  [格式化程序_简单格式化程序]

  format=%(ASC time)s %(名称)s %(线程名称)s %(级别名称)s %(消息)s

  [formatter_webSimpleFormatter]

  格式=%(ASC时间)s %(客户端)s %(级别名称)s %(消息)s

  # -

  #处理程序

  # -

  # [handler_xxxx]

  #类处理程序类名

  #级别日志级别

  #格式化程序,上面定义的格式程序

  #参数处理程序初始化函数参数

  [处理程序_控制台处理程序]

  级别=调试

  格式化程序=简单格式化程序

  args=(sys.stdout,)

  [handler_rotateFileHandler]

  级别=调试

  格式化程序=简单格式化程序

  args=(access.log , a ,2000000,9)

  [handler _ webDebugRotateFileHandler]

  级别=调试

  格式化程序=简单格式化程序

  args=(debug.log , a ,2000000,9)

  [handler _ webInfoRotateFileHandler]

  级别=信息

  formatter=webSimpleFormatter

  args=(info.log , a ,2000000,9)

  [handler _ web errorrotatefilehandler]

  级别=错误

  formatter=webSimpleFormatter

  args=(error.log , a ,2000000,9)

  [handler_webSMTPHandler]

  级别=错误

  formatter=webSimpleFormatter

  args=(mailhost , fromaddr ,( toaddrs1 , toaddrs2 ), subject ,( username , password ))

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: