PythonloggingPython模块学习logging日志记录(一)许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪。在.NET平台中,有非常著名的第三方开源日志组件log4net,c++中,有人们熟悉的log4cpp,而在python中,我们不需要第三方的日志组件,因为它已经为我们提供了简单易用、且功能强大的日志模块:logging。logging模块支持将日志信息保存到不同的目标域中,如:保存到日志文件中;以邮件的形式发送日志信息;以httpget或post的方式提交日志到web服务器;以windows事件的形式记录等等。这些日志保存方式可以组合使用,每种方式可以设置自己的日志级别以及日志格式。4个主要的组件logger:日志类,应用程序往往通过调用它提供的api来记录日志;Pythonlogginghandler:对日志信息处理,可以将日志发送(保存)到不同的目标域中;filter:对日志信息进行过滤;formatter:日志的格式化;日志级别在记录日志时,日志消息都会关联一个级别(级别本质上是一个非负整数)。系统默认提供了6个级别,它们分别是:级别对应的值CRITICAL50ERROR40WARNING30INFO20DEBUG10NOTSET0可以给日志对象(LoggerInstance)设置日志级别,低于该级别的日志消息将会被忽略,也可以给Hanlder设置日志级别,对于低于该级别的日志消息,Handler也会忽略。Pythonlogginglogging模块中的常用函数:logging.basicConfig([**kwargs]):为日志模块配置基本信息。kwargs支持如下几个关键字参数:filename:日志文件的保存路径。如果配置了些参数,将自动创建一个FileHandler作为Handler;filemode:日志文件的打开模式。默认值为'a',表示日志消息以追加的形式添加到日志文件中。如果设为'w',那么每次程序启动的时候都会创建一个新的日志文件;format:设置日志输出格式;datefmt:定义日期格式;level:设置日志的级别.对低于该级别的日志消息将被忽略;stream:设置特定的流用于初始化StreamHandler;几个简单的例子:Pythonloggingimportlogging(log日志记录logging登陆)LOG_FILENAME=C:\Python25\log_test.txtlogging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)logging.debug(Thismessageshouldgotothelogfile)然后我们就可以在C盘python25目录下发现一个名为log_test.txt的文件,打开里面的内容为:DEBUG:root:Thismessageshouldgotothelogfile然后我们重复运行最后一句,会发现这个文本文件每次都会多出一行:DEBUG:root:Thismessageshouldgotothelogfile下面我们看一个更标准的程序:importlogginglogger=logging.getLogger()Pythonlogginghandler=logging.FileHandler(Log_test.txt)logger.addHandler(handler)logger.setLevel(logging.NOTSET)logger.error(Thisisanerrormessage)logger.info(Thisisaninfomessage)logger.critical(Thisisacriticalmessage)日志文件中会出现三行内容:ThisisanerrormessageThisisaninfomessageThisisacriticalmessage上面程序的第2行是生成一个日志对象,里面的参数时日志的名字,可以带,也可以不带(真的是吗)。第3行是生成了一个handler,logging支持很多种Handler,像FileHandler,SocketHandler等等,这里由于我们要写文件,所以用了FileHandler,它的参数就是filename,默认当前路径,当然我们可以自己指定路径。Pythonlogging第5行设置日志信息输出的级别。Logging提供了多种日志级别,如NOTSET,DEBUG,INFO,WARNING,ERROR,CRITICAL(严重错误)等,每个级别都对应一个数值,如果我们不自己设置输出级别,那么系统会执行缺省级别,值为30,就warning。Logging也提供了一个方法来查看缺省日志级别,getLevelName(logger,getEffectiveLevel())。日志对象对于不同的级别信息提供不同的函数进行输出,如:info(),error(),debug()等。当写入日志时,小于指定级别的信息将被忽略。因此为了输出想要的日志级别一定要设置好此参数。这里我设为NOTSET(值为0),也就是想输出所有信息。系统默认Pythonlogging的日志级别排序为,CRITICAL,ERROR,WARNING,INFO,DEBUG,NOTSET。比如说我们要输出的信息为CRITICAL,但是我们的日志级别为DEBUG,(?)那么这个信息将被忽略掉。我们看下面的例子:importloggingimportsysLEVELS={'debug':logging.DEBUG,'info':logging.INFO,'warning':logging.WARNING,'error':logging.ERROR,'critical':logging.CRITICAL}iflen(sys.argv)1:level_name=sys.argv[1]level=LEVELS.get(level_name,logging.NOTSET)logging.basicConfig(level=level)Pythonlogginglogging.debug(Thisisadebugmessage)logging.info(Thisisaninfomessage)logging.warning(Thisisawarningmessage)logging.error(Thisisanerrormessage)logging.critical(Thisisacriticalerrormessage)运行时候,我们根据给的参数时debug,info等等,来看看输出情况,就可以知道各个日志级别的输出情况了,下面是结果:Pythonlogging可以看到过滤进行的很明显。当我们设置级别最低位debug时,所有的信息都输出了,当我们设为最高位critical时候,只有critical输出了,低于critical的被过滤了。Logging是非常有用的,一个程序的健壮性也这个有关,当一个程序包含很多的调试信息时,可以方便我们发现问题,发现错误。