正确使用安全套的八个步骤是,正确使用土豆片敷乳房图片
本文主要参考: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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。