27. Python logging 日志模块上(适合小白)

27. Python logging 日志模块上(适合小白)

文章目录

  • 27. Python logging 日志模块上(适合小白)
    • 1. 什么是日志
    • 2. logging 日志模块的作用
    • 3. loggging 日志模块的导入
    • 4. 日志的5种级别
    • 5. 知识回顾:调用模块的类、函数、变量
    • 6. 什么时候使用日志
    • 7. logging模块的函数
    • 7. 知识回顾:open函数参数
    • 8. basicConfig函数源码
    • 9. basicConfig函数的参数
    • 10. level参数:指定日志级别
      • 10.1 将日志级别设置为5级:CRITICAL
      • 10.2 将日志级别设置为4级:ERROR
      • 10.3 将日志级别设置为3级:ERROR
      • 10.4 将日志级别设置为2级:INFO
      • 10.5 将日志级别设置为1级:DEBUG
      • 10.6 不指定级别时输出warning级别(含)以上的信息
    • 11. filename 参数:将日志输出到文件

1. 什么是日志

【日志的百科释义】

日志主要发表在网络,详细介绍一个过程和经历的记录。

【生活日志】

生活中,我们可以把日志等同于日记。

日记记录着我们生活中的点点滴滴。

我们可以通过查看日记,回忆某年某月某日我们做了什么有意义的事情。

【程序日志】

在编程中我们可以通过日志来记录代码的运行轨迹。

跟生活日记是一个意思,就是记录代码运行时发生了什么。

在Python中,日志是对程序执行时所发生事件的一种追踪方式。

【logging官方链接】

日志常用指引官方链接

2. logging 日志模块的作用

logging模块是Python大项目中常用的记录日志模块。

【宏观看logging的作用】

  1. 测试

  2. 辅助定位

日志可以帮助开发人员记录程序正在运行的状态。

比如说开发者写了一个很复杂的程序。

程序里面有很多库和模块。

开发者可以通过日志查看程序运行到哪个模块,哪个方法,哪行具体的代码。

通过日志,开发者可以快速的定位到有问题的代码。

【微观看logging的作用】

  1. 存储各种格式的日志,

  2. 可以输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件。

【相比print,logging模块具备如下优点】

  1. print函数将所有信息都输出到终端,严重影响开发者从终端查看其它数据。

  2. logging模块可以通过设置不同的日志等级,只输出重要信息,而不必显示大量的调试信息。

  3. logging模块可以由开发者决定将信息输出到什么地方以及输出的格式。

3. loggging 日志模块的导入

logging是模块名。

logging模块是Python内置的标准模块。

内置模块直接导入即可使用,不需要安装。

【导入语法】

import+模块名

【代码示例】

import logging

4. 日志的5种级别

开发者根据事件的重要性对程序日志进行了等级划分。

我们可以通过函数、参数等确定输出的日志等级。

27. Python logging 日志模块上(适合小白)_第1张图片

【五种级别】

  1. debug:最低级别,作用是输出详细信息。

debug [diːˈbʌɡ]:调试。

  1. info:作用是输出一般类型的信息。

info [ˈɪnfəʊ]:一般信息。

  1. warning:作用是输出警告类型的信息。

warning[ˈwɔːnɪŋ]:警告。

  1. error:作用是输出严重的问题信息。error类型的信息通常会影响到程序的正常运行。

error[ˈerə®]:错误。

  1. critical:作用是输出关键信息。critical类型的信息表明程序已经不能继续执行。

critical[ˈkrɪtɪkl]:关键的。

【温馨提示】

日志的严重等级:debug < info

日志的默认级别是warning

默认是指在不改变级别参数的情况下,程序默认输出warning级别及以上级别的日志。

5. 知识回顾:调用模块的类、函数、变量

导入模块后,我们就能使用模块里面具体的功能。

【调用语法】

  1. 调用模块的类:模块名.类名(),如 csv.DictReader()

  2. 调用模块的函数:模块名.函数名(),如 os.mkdir()

  3. 调用模块的变量:模块名.变量名,如 os.name

6. 什么时候使用日志

刚开始接触日志模块,你如果不能理解日志的作用,你可以把日志当做一个输出函数来理解。

我们把日志模块理解成一个可以设置输出条件的输出模块。

日志最终实现的也是输出。

注意我说的是理解成,不是完全等同(喷子请绕行)。

对于需要输出到终端(控制台)给开发者看的内容,我们可以用print函数。

对于需要监控程序运行的状态、记录运行异常等,我们通常用日志。

日志可以输出到终端,也可以输出到文件中。

开发项目中我们通常将日志输出到一个log文件中。

7. logging模块的函数

【调用logging模块的函数】

调用模块的函数语法:模块名.函数名()

logging.debug

【代码示例】

import logging 

logging.debug
logging.info
logging.warning
logging.error
logging.critical

logging是模块名

debug、info、warning、error、critical 是5个打印信息函数。

【1级:debug级别】

import logging
logging.debug('所有信息!') 

运行上述代码,终端没有输出。

【2级:info级别】

import logging
logging.debug('所有信息!') 
logging.info('一般信息!') 

运行上述代码,终端没有输出。

【3级:warning级别】

import logging
logging.debug('所有信息!') 
logging.info('一般信息!') 
logging.warning('警告信息!') 

【终端输出】

WARNING:root:警告信息!

运行上述代码,终端输出了logging.warning('警告信息!') 中的文本信息,即WARNING:root:警告信息!

WARNING是表示信息的级别。

root [ruːt]:根。终端输出中的root大家先放一放,暂时不用深究。

警告信息!指信息的提示内容。

【4级:error级别】

import logging
logging.debug('所有信息!') 
logging.info('一般信息!') 
logging.warning('警告信息!') 
logging.error('严重信息!') 

【终端输出】

WARNING:root:警告信息!
ERROR:root:严重信息!

运行上述代码,终端输出了:

warning函数后的提示信息警告信息!

error函数后的提示信息严重信息!

【5级:critical级别】

import logging
logging.debug('所有信息!') 
logging.info('一般信息!') 
logging.warning('警告信息!') 
logging.error('严重信息!') 
logging.critical('最严重信息!') 

【终端输出】

WARNING:root:警告信息!
ERROR:root:严重信息!
CRITICAL:root:最严重信息!

运行上述代码,终端输出了:

warning函数后的提示信息警告信息!

error函数后的提示信息严重信息!

critical函数后的提示信息最严重信息!

【温馨提示】

观察输出结果我们发现:

调用debug函数和info函数,程序没有输出任何信息。

这是因为:

日志的默认级别是warning

在不改变级别参数的情况下,程序默认输出warning级别及以上级别的日志。

因此,在不改变参数的情况下,5个日志级别同时存在时,只会输出warning , error, critical3个级别的日志。

【深度思考】

既然有5种日志级别,那我们肯定也是可以查看另2个低级别的日志的。

那如何才能输出另2个低级别的日志呢?

想要输出低级别的日志可以使用logging模块的basiConfig函数。

7. 知识回顾:open函数参数

open 函数语法如下:

open(file, mode='r', encoding='None', errors='None')
  1. 参数 file 表示要打开文件的路径

  2. 参数 mode 决定了打开文件的模式。

r:以只读模式打开文件。

w:以只写模式打开文件,不能读内容。如果文件不存在,则创建文件;如果文件存在,则覆盖文件的内容。

a:以追加模式打开文件,不能读内容。如果文件不存在,则创建文件;如果文件存在,则在文件末尾追加。

参数 mode 可以不写,不写时mode默认值为r,即只读模式。

  1. 参数 encoding 表示文件的编码方式,文件编码方式一般为 ‘utf-8’。

  2. 参数 errors 表示读写文件时碰到错误的报错级别。

8. basicConfig函数源码

basic[ˈbeɪsɪk]:基本的。

config [kənˈfɪg]:配置。

basicConfig:基本配置。

【logging模块中定义的basicConfig函数源码】

def basicConfig(
    *,
    filename: StrPath | None = ...,
    filemode: str = ...,
    format: str = ...,
    datefmt: str | None = ...,
    style: _FormatStyle = ...,
    level: _Level | None = ...,
    stream: SupportsWrite[str] | None = ...,
    handlers: Iterable[Handler] | None = ...,
) -> None: ...

【basicConfig函数的备注说明】

def basicConfig(**kwargs):
    """
    Do basic configuration for the logging system.

    This function does nothing if the root logger already has handlers
    configured, unless the keyword argument *force* is set to ``True``.
    It is a convenience method intended for use by simple scripts
    to do one-shot configuration of the logging package.

    The default behaviour is to create a StreamHandler which writes to
    sys.stderr, set a formatter using the BASIC_FORMAT format string, and
    add the handler to the root logger.

    A number of optional keyword arguments may be specified, which can alter
    the default behaviour.

    filename  Specifies that a FileHandler be created, using the specified
              filename, rather than a StreamHandler.
    filemode  Specifies the mode to open the file, if filename is specified
              (if filemode is unspecified, it defaults to 'a').
    format    Use the specified format string for the handler.
    datefmt   Use the specified date/time format.
    style     If a format string is specified, use this to specify the
              type of format string (possible values '%', '{', '$', for
              %-formatting, :meth:`str.format` and :class:`string.Template`
              - defaults to '%').
    level     Set the root logger level to the specified level.
    stream    Use the specified stream to initialize the StreamHandler. Note
              that this argument is incompatible with 'filename' - if both
              are present, 'stream' is ignored.
    handlers  If specified, this should be an iterable of already created
              handlers, which will be added to the root handler. Any handler
              in the list which does not have a formatter assigned will be
              assigned the formatter created in this function.
    force     If this keyword  is specified as true, any existing handlers
              attached to the root logger are removed and closed, before
              carrying out the configuration as specified by the other
              arguments.
    encoding  If specified together with a filename, this encoding is passed to
              the created FileHandler, causing it to be used when the file is
              opened.
    errors    If specified together with a filename, this value is passed to the
              created FileHandler, causing it to be used when the file is
              opened in text mode. If not specified, the default value is
              `backslashreplace`.

    Note that you could specify a stream created using open(filename, mode)
    rather than passing the filename and mode in. However, it should be
    remembered that StreamHandler does not close its stream (since it may be
    using sys.stdout or sys.stderr), whereas FileHandler closes its stream
    when the handler is closed.

    .. versionchanged:: 3.2
       Added the ``style`` parameter.

    .. versionchanged:: 3.3
       Added the ``handlers`` parameter. A ``ValueError`` is now thrown for
       incompatible arguments (e.g. ``handlers`` specified together with
       ``filename``/``filemode``, or ``filename``/``filemode`` specified
       together with ``stream``, or ``handlers`` specified together with
       ``stream``.

    .. versionchanged:: 3.8
       Added the ``force`` parameter.

    .. versionchanged:: 3.9
       Added the ``encoding`` and ``errors`` parameters.
    """

Do basic configuration for the logging system.:对记录系统进行基本配置。

This function does nothing if the root logger already has handlers configured, unless the keyword argument *force* is set to ``True``.:如果根记录器已经有了处理程序,这个函数什么也不做除非关键字参数force设置为“True”。

A number of optional keyword arguments may be specified, which can alter the default behaviour.:可以指定许多可选的关键字参数,这些参数可以改变默认行为。

【备注】

上面的备注解释了每个参数的作用。有兴趣的同学可以自行翻译理解。

9. basicConfig函数的参数

【模块中定义的参数】

basicConfig(*, 
            filename=..., 
            filemode=..., 
            format=..., 
            datefmt=..., 
            style=..., 
            level=..., 
            stream=..., 
            handlers=...)

大家刚开始接触,理解不了,也用不到那么多参数。

我们讲几个常用的参数:

  1. filename 参数:文件的路径。

  2. filemode 参数:创建文件的模式。

  3. format参数:可以设置输出的格式。

  4. datefmt:可以指定日期及时间格式。

  5. level:指定输出的日志级别。

10. level参数:指定日志级别

10.1 将日志级别设置为5级:CRITICAL

import logging
logging.basicConfig(level=logging.CRITICAL)
logging.debug('所有信息!') 
logging.info('一般信息!') 
logging.warning('警告信息!') 
logging.error('严重信息!') 
logging.critical('最严重信息!') 

【终端输出】

CRITICAL:root:最严重信息!

CRITICAL已是最高级别。

当日志级别为CRITICAL时,仅输出该级别对应的信息。

【语法解析】

level=logging.CRITICAL

level是参数名

logging是模块名。

CRITICAL是日志级别。

【温馨提示】

CRITICAL表示日志级别必须大写。

【小写表示函数名,程序会报错】

import logging
logging.basicConfig(level=logging.critical)
logging.debug('所有信息!') 
logging.info('一般信息!') 
logging.warning('警告信息!') 
logging.error('严重信息!') 
logging.critical('最严重信息!') 

【终端输出】

TypeError: Level not an integer or a valid string: 

10.2 将日志级别设置为4级:ERROR

import logging
logging.basicConfig(level=logging.ERROR)
logging.debug('所有信息!') 
logging.info('一般信息!') 
logging.warning('警告信息!') 
logging.error('严重信息!') 
logging.critical('最严重信息!') 

【终端输出】

ERROR:root:严重信息!
CRITICAL:root:最严重信息!

当level参数为ERROR时,输出ERROR、CRITICA级别信息。

注意ERROR必须大写。

10.3 将日志级别设置为3级:ERROR

import logging
logging.basicConfig(level=logging.WARNING)
logging.debug('所有信息!') 
logging.info('一般信息!') 
logging.warning('警告信息!') 
logging.error('严重信息!') 
logging.critical('最严重信息!') 

【终端输出】

WARNING:root:警告信息!
ERROR:root:严重信息!
CRITICAL:root:最严重信息!

当level参数为WARNIN时,输出WARNING、ERROR、CRITICA级别信息。

注意WARNING必须大写。

10.4 将日志级别设置为2级:INFO

import logging
logging.basicConfig(level=logging.INFO)
logging.debug('所有信息!') 
logging.info('一般信息!') 
logging.warning('警告信息!') 
logging.error('严重信息!') 
logging.critical('最严重信息!') 

【终端输出】

INFO:root:一般信息!
WARNING:root:警告信息!
ERROR:root:严重信息!
CRITICAL:root:最严重信息!

当level参数为WARNIN时,输出INFO、WARNING、ERROR、CRITICA级别信息。

注意INFO必须大写。

10.5 将日志级别设置为1级:DEBUG

import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug('所有信息!') 
logging.info('一般信息!') 
logging.warning('警告信息!') 
logging.error('严重信息!') 
logging.critical('最严重信息!') 

【终端输出】

DEBUG:root:所有信息!
INFO:root:一般信息!
WARNING:root:警告信息!
ERROR:root:严重信息!
CRITICAL:root:最严重信息!

当level参数为WARNIN时,输出DEBUG、INFO、WARNING、ERROR、CRITICA级别信息。

注意DEBUG必须大写。

10.6 不指定级别时输出warning级别(含)以上的信息

import logging
logging.basicConfig( )
logging.debug('所有信息!') 
logging.info('一般信息!') 
logging.warning('警告信息!') 
logging.error('严重信息!') 
logging.critical('最严重信息!') 

【终端输出】

WARNING:root:警告信息!
ERROR:root:严重信息!
CRITICAL:root:最严重信息!

在不改变级别参数的情况下,程序默认输出warning级别及以上级别的日志。

因此,这里只会输出warning , error, critical3个级别的日志。

【总结】

当你对输出的日志级别有要求的时候,可以通过设置basicConfig函数的level参数来实现。

注意,程序输出的是该级别及以上级别的信息。

11. filename 参数:将日志输出到文件

我们刚才打印的日志都输出到了程序终端。

除了输出到终端,我们还可添加路径参数,使日志保存到一个log文件中。

log文件就是一个常用的存储日志的文件类型。

【准备工作】

  1. 在电脑D盘新建一个【27】文件夹。

  2. 用VScode编辑器打开【27】文件夹。

  3. 在【27】文件夹中新建一个27.py文件。

  4. 大家在27.py文件中编写代码。

【实操练习1】

import logging
logging.basicConfig(filename='日志1.log', 
                    encoding='utf-8', 
                    level=logging.DEBUG)
logging.debug('所有信息!') 
logging.info('一般信息!') 
logging.warning('警告信息!') 
logging.error('严重信息!') 
logging.critical('最严重信息!') 

运上述代码,【27】文件夹中生成了一个【日志1.log】,log文件内容如下:

27. Python logging 日志模块上(适合小白)_第2张图片

【语法解析】

logging.basicConfig(filename='日志1.log', encoding='utf-8', level=logging.DEBUG)
  1. filename参数:文件的路径参数,这里用的是绝对路径。

  2. encoding字符串编码。

  3. level打印日志的级别。

【实操练习2】

将路径参数filename的值设置为绝对路径:

filename=r'C:\Users\zhou\Desktop\日志2.log'

这是我电脑桌面的绝对路径。

你的电脑需要修改成你电脑的绝对路径。

【快速查看某文件的绝对地址】

  1. 按住【shift】键;

  2. 点击某文件或文件夹;

  3. 鼠标右键选择【复制文件地址(A)】

import logging
logging.basicConfig(filename=r'C:\Users\zhou\Desktop\日志2.log', 
                    encoding='utf-8', 
                    level=logging.INFO)
logging.debug('所有信息!') 
logging.info('一般信息!') 
logging.warning('警告信息!') 
logging.error('严重信息!') 
logging.critical('最严重信息!') 

运行上面的代码,电脑桌面新增了一个【日志2.log】文件,文件内容如下图所示:

27. Python logging 日志模块上(适合小白)_第3张图片

你可能感兴趣的:(网络爬虫,python,开发语言)