python-25 logging日志模块之一

1.日志的作用     

      1.程序调试 ;  2.了解软件程序运行情况,是否正常;   3.软件程序运行故障分析与问题定位

2.日志的等级

日志等级(level) 数值 描 述
NOTSET 0  
DEBUG 10 最详细的日志信息,典型应用场景是 问题诊断
INFO 20 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
WARNING 30(默认) 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
ERROR 40 由于一个更严重的问题导致某些功能不能正常运行时记录的信息
CRITICAL 50 当发生严重错误,导致应用程序不能继续运行时记录的信息

   上面列表中的日志等级是从上到下依次升高的,即:NOTSET<DEBUG < INFO < WARNING < ERROR < CRITICAL,而日志的信息量是依次减少的;

      eg.

---------------返回结果----------------------------

   

    默认 显示warning及以上的所有级别

3.日志字段信息一般格式

-  事件发生时间
-  事件发生位置
-  事件的严重程度--日志级别
-  事件内容

4.日志功能的实现
Python自身也提供了一个用于记录日志的标准库模块--logging。

logging模块提供了两种记录日志的方式:
    第一种:logging提供的模块级别的函数
    第二种:使用Logging日志系统的四大组件(Loggers,Handlers,Filters,Formatters),其实,logging提供的模块级别的函数,也是对logging日志系统相关类的封装而已。

主要包括四部分:

  • Loggers: 可供程序直接调用的接口,app通过调用提供的api来记录日志
  • Handlers: 决定将日志记录分配至正确的目的地
  • Filters:对日志信息进行过滤, 提供更细粒度的日志是否输出的判断
  • Formatters: 制定最终记录打印的格式布

可见在logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有
filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。
level:设置rootlogger(后边会讲解具体概念)的日志级别
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open('test.log','w')),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。


format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示:
 %(levelno)s: 打印日志级别的数值
 %(levelname)s: 打印日志级别名称
 %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
 %(filename)s: 打印当前执行程序名
 %(funcName)s: 打印日志的当前函数

%(module)s 调用日志输出函数的模块名

%(name)s : 所使用的日志名称,默认是'root',因为默认使用的是 rootLogger

%(msecs)d 日志事件发生事件的毫秒部分

 %(lineno)d: 打印日志的当前行号
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数

%(relativeCreated)d 日志事件发生的时间相对于logging模块加载时间的相对毫秒数(目前还不知道干嘛用的)
 %(thread)d: 打印线程ID
 %(threadName)s: 打印线程名称
 %(process)d: 打印进程ID
 %(message)s: 打印日志信息

 6.logging.basicConfig()函数其它说明

       logging.basicConfig()函数是一个一次性的简单配置工具,也就是说只有在第一次调用该函数时会起作用,后续再次调用该函数时完全不会产生任何操作的,多次调用的设  置并不是累加操作。

     日志器(Logger)是有层级关系的,上面调用的logging模块级别的函数所使用的日志器是RootLogger类的实例,其名称为'root',它是处于日志器层级关系最顶层的日志器,且该实例是以单例模式存在的。 

    如果要记录的日志中包含变量数据,可使用一个格式字符串作为这个事件的描述消息(logging.debug、logging.info等函数的第一个参数),然后将变量数据作为第二个参数*args的值进行传递,如:logging.warning('%s is %d years old.', 'Tom', 10),输出内容为WARNING:root:Tom is 10 years old.
logging.debug(), logging.info()等方法的定义中,除了msg和args参数外,还有一个**kwargs参数。

它们支持3个关键字参数: exc_info, stack_info, extra,下面对这几个关键字参数作个说明。

    exc_info: 其值为布尔值,如果该参数的值设置为True,则会将异常异常信息添加到日志消息中。如果没有异常信息则添加None到日志信息中。
   stack_info: 其值也为布尔值,默认值为False。如果该参数的值设置为True,栈信息将会被添加到日志信息中。
   extra: 这是一个字典(dict)参数,它可以用来自定义消息格式中所包含的字段,但是它的key不能与logging模块定义的字段冲突。

posted @ 2019-01-09 22:03  优雅的代码  阅读(233)  评论(0编辑  收藏  举报