Python -- 日志管理模块logging学习

昨天看了同事的代码中用这个管理日志,作为一个小菜鸟我不得不去学习下这个模块logging,官方文档讲解的非常详细,但是无语的是没有中文版,看起来非常的吃力啊。于是我决定写下来便于理解学习。
Logging模块是用来管理日志打印,其拥有很好的线程安全性,使用非常方便,但是其不能用于多进程的模型中,网上有厉害的人改写了Logging 的代码保证其进程安全,我把地址贴出来Logging保证多进程模型中的代码安全性。同时有的时候错误的使用,会导致日志的重复打印等麻烦问题。
开始具体介绍下这个模块:
官网上讲Logging模块分为了四个部分详细讲解:

1.Loggers expose the interface that application code directly uses.
2.Handlers send the log records (created by loggers) to the appropriate destination.
3.Filters provide a finer grained facility for determining which log records to output.
4.Formatters specify the layout of log records in the final output.

其中:

1.Logger 实例化后可以用来打印日志信息。
2.Handler 用来设置日志的输出目的地,(在文件中输出时,可以设置
RotatingFileHandler来让日志文件的大小达到指定值时进行文件切分)
3.Filter 控制日志的输出等级,当达到指定等级的文件才能进行输出。
4.Formatter用来控制日志的输出格式。

实战出真理:

#coding:utf-8
import sys
import logging
if __name__=="__main__":
#通过getLogger接口创建实例化的日志打印对象
logger = logging.getLogger('rrswd')
#接下来对其进行配置
#formatter确定日至的输出格式
formatter = logging.Formatter('%(asctime)s - %(filename)s - %(message)s')
#Handler采用了StreamHandler 输出到stdout中 将日志输出格式和等级配置到console_handler中
console_handler = logging.StreamHandler(sys.stdout)
console_handler.formatter = formatter
console_handler.level = logging.DEBUG
#将console_handler添加到logger对象中,就可以按你配置的进行日志打印
logger.addHandler(console_handler)
logger.info('info information')
logger.warn('warn information')
logger.debug('debug information')
#同时可以配置多个Handler给一个对象
file_handler = logging.FileHandler('logger.log')
file_handler.formatter = formatter
file_handler.level = logging.DEBUG
#配置了文件输出handler后日志会将接下来的数据输入到文件logger.log中,因为之前console_handler的原因,还会在终端上输出一份
logger.addHandler(file_handler)
logger.warn('warn information')

其中logger的输出等级有如下几种:

CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET

对于日志的输出格式中提供了多个输出信息共选择:

Formatter.png

上面是一种调用logger写入日志的方法,还有其他一些方法。
接下来我来详细罗列下Handler的方法:

1.StreamHandler: instances send messages to streams(file-like objects).
2.FileHandler: instances send messages to disk files.
3.RotatingFileHandler: instances send messages to disk files, with support for maximum log file sizes and log file rotation
4.TimedRotatingFileHandler: instances send messages to disk files, rotating the log file at certain timed intervals.
5.SocketHandler: instances send messages to TCP/IP sockets.
6.DatagramHandler: instances send messages to UDP sockets.
7.SMTPHandler:instances send messages to a designated email address.
8.SysLogHandler:instances send messages to a Unix syslog daemon, possibly on a remote machine.
9.NTEventLogHandler:instances send messages to a Windows NT/2000/XP event log.
10.MemoryHandler: instances send messages to a buffer in memory, which is flushed whenever specific criteria are met.
11.HTTPHandler: instances send messages to an HTTP server using either GET or POST semantics.
12.WatchedFileHandler:instances watch the file they are logging to. If the file changes, it is closed and reopened using the file name. This handler is only useful on Unix-like systems; Windows does not support the underlying mechanism used.
13.NullHandler:instances do nothing with error messages. They are used by library developers who want to use logging, but want to avoid the ‘No handlers could be found for logger XXX’ message which can be displayed if the library user has not configured logging.

以上功能非常强大,其中logging可以自动做内存分割的RotatingFileHandler,网络通信进行日志处理,邮件处理,系统守护进行处理日志,通过内存加快日志的处理速度效率。上述就是logging的一种使用方法。
logging的日志格式如果都放在代码中配置就会显的非常麻烦和难看,所以其作者提供了配置项启动的方式。

#创建logger其中root是父类必须存在,其他为自己进行配置
[loggers]                                                                                                                                                                                                   
keys=root,mylog
 
[logger_root]
level=DEBUG
handlers=hand1
 
[logger_mylog]
level=INFO
handlers=hand1
qualname=mylog
propagate=0
 #配置handlers   formatter
[handlers]
keys=hand1
 
 
[formatters]
keys=format1
 
[handler_hand1]
class=StreamHandler
formatter=format1
level=INFO
args=(sys.stdout,)
 
[formatter_format1]
format=%(asctime)s - %(filename)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S
import logging
import logging.config
 
logging.config.fileConfig("logger.conf")
logger = logging.getLogger("mylog")
logger.error("from logger")#通过mylog对象
logging.error("from logging")#通过root对象

其实配置方法有很多种类官网介绍还可以通过dict等。需要自己看:https://docs.python.org/2/library/logging.config.html#access-to-internal-objects
再者是logging中容易遇到的问题。
logging每次添加一个handler都会执行,如果添加多个Streamhandler在logger中就会重复打多条日志
可以通过logging.getLogger().handlers = []来删除所有的handler
logging能够保证线程安全。通过还有一个问题,logging中处理日志是单线程,如果使用socket等网络打日志的方式可能会对代码的性能有影响,所以如何打日志的同时又保证代码的性能是个问题。可以思考,等我有了解决方案,会第一时间给出。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,561评论 18 139
  • 在写Python程序的时候不论老手或者新手一般都会用print 函数去console中打印信息,可以用来调试,警告...
    Sank阅读 1,566评论 0 1
  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 4,912评论 1 13
  • 5/15/2017 7:06:35 PM 纵观各大组件,配置文件占据极其重要的地位。可配置化也是当下开发的一流行趋...
    爱做梦的胖子阅读 4,407评论 0 8
  • 那天早上,决定来个一个人的出游。 到附近的海岛半日游。 岛上各式各样的活动! 回家!
    hkgo阅读 118评论 1 2