1、把日志信息保存到文件中

代码如下所示:

"""
logging模块是Python的内置模块,不需要安装。 步骤:
1,创建一个把日志信息保存到文件中的处理器FileHandler
2,把文件处理器添加到logger中
3,把格式器传入到文件处理器中
"""
# 导入logging模块
import logging # 创建一个日志器,就是一个logger对象
logger = logging.getLogger('logger') # 设置logger输入级别
logger.setLevel(logging.DEBUG) # 创建日志格式器
formator = logging.Formatter(fmt="%(asctime)s [ %(filename)s ] %(lineno)d行 | [ %(levelname)s ] | [%(message)s]",
datefmt="%Y/%m/%d/%X") # 创建一个输出的处理器,让它输入到控制台
sh = logging.StreamHandler() # 1.创建一个把日志信息存储到文件中的处理器
# 要加编码,不然后可能会乱码
fh = logging.FileHandler("../log/test_log_01.log", encoding="utf-8") # 把输出处理器添加到日志器中
logger.addHandler(sh) # 给处理器添加格式器
sh.setFormatter(formator) # 2.把文件处理器,加载到logger中
logger.addHandler(fh) # 3.给文件处理器添加格式器
fh.setFormatter(formator) # 输出日志信息
logger.debug('输出debug级别的日志')
logger.info('输出info级别的日志')
logger.warning('输出warning级别的日志')
logger.error('输出error级别的日志')
logger.critical('输出critical级别的日志')

2、拓展

(1)观察代码

看下面一段代码说明问题。

# 主要看标号1,2,3

# 导入logging模块
import logging # 创建一个日志器,就是一个logger对象
logger = logging.getLogger('logger') # 1.设置logger日志器的日志级别为DEBUG
logger.setLevel(logging.ERROR) # 定义日志处理器File_handler
File_handler = logging.FileHandler('../log/all.log', encoding="utf-8") # 2.给日志处理器File_handler设置日志级别
File_handler.setLevel(logging.WARNING) # 给处理器传入格式器
File_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")) # 定义日志处理器console_handler
console_handler = logging.StreamHandler() # 3.设置处理器日志级别
console_handler.setLevel(logging.DEBUG) # 给处理器传入格式器
console_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s[:%(lineno)d] - %(message)s")) # 把两个处理器添加到日志器中
logger.addHandler(File_handler)
logger.addHandler(console_handler) logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')

运行结果:

log文件中日志:

2021-01-16 23:17:14,149 - ERROR - demo_log3.py[:33] - error message
2021-01-16 23:17:14,150 - CRITICAL - demo_log3.py[:34] - critical message

控制台中的日志:

2021-01-16 23:17:14,149 - ERROR - error message
2021-01-16 23:17:14,150 - CRITICAL - critical message

(2)提出问题

在上面代码中:

  • logger日志器设置的日志级别是ERROR。

    logger.setLevel(logging.ERROR)
  • 文件日志处理器File_handler设置的日志级别是WARNING。

    File_handler.setLevel(logging.WARNING)
  • 控制台日志处理器console_handler设置的日志级别是DEBUG。

    console_handler.setLevel(logging.DEBUG)

那么产生疑问:

  • 已经对日志器设置了输出级别,为什么还要对日志处理器的日志最低输出级别进行设置呢?
  • 日志器(logger)和日志处理器(handler)中设置的日志输出级别,谁的优先级更高?

(3)问题说明

  1. 无论是logger实例还是handler实例,它们都可以设置日志的最低输出级别。
  2. logger日志器设置的日志输出等级优先级更高,其内部的处理器就不会接收到低于该级别的日志信息。

    如上面的示例,logger日志器设置的输出级别为ERROR,那么File_handlerconsole_handler只能接收到ERROR和以上级别的日志信息。

    所以看上面示例的结果可以看出,File_handlerconsole_handler处理器都只输出了ERROR级别以上的日志。

    因此在设置各handler实例输出级别时需要小心谨慎。
  3. 在实际的应用工作应用过程中,可以在日志器(logger)和日志处理器(handler)中设置不同的日志级别,相互配合,实现按业务需求过滤日志。

『无为则无心』Python日志 — 66、将日志信息保存到文件中的更多相关文章

  1. 『无为则无心』Python面向对象 — 52、私有成员方法(类中行为的封装)

    Python对于类的成员没有严格的访问控制限制,这与其他面向对象的编程语言是有所区别的. 关于私有方法其实和私有属性差不多,有如下要点: 1.通常我们约定,两个下划线开头的方法是私有方法. 2.类内部 ...

  2. 『无为则无心』Python面向对象 — 55、多层继承和继承中的私有成员

    目录 1.Python支持多层继承 (1)多层继承实现 (2)多层继承和多重继承区别 2.继承中的私有成员 (1)继承中父类私有属性和私有方法 (2)获取和修改私有属性值 1.Python支持多层继承 ...

  3. 『无为则无心』Python日志 — 64、Python日志模块logging介绍

    目录 1.日志的作用 2.为什么需要写日志 3.Python中的日志处理 (1)logging模块介绍 (2)logging模块的四大组件 (3)logging日志级别 1.日志的作用 从事与软件相关 ...

  4. 『无为则无心』Python日志 — 65、日志模块logging的使用

    目录 1.logger类用法 2.handler类用法 3.formatter类用法 4.filter类用法 1.logger类用法 logger类:logger用于提供日志接口,常用于配置和发送日志 ...

  5. 『无为则无心』Python日志 — 67、logging日志模块处理流程

    目录 1.概括理解 2.详细说明 3.应用示例 1.概括理解 了解了四大组件的基本定义之后,我们通过图示的方式来理解下信息的传递过程: 也就是获取的日志信息,进入到Logger日志器中,传递给处理器确 ...

  6. 『无为则无心』Python基础 — 3、搭建Python开发环境

    目录 1.Python开发环境介绍 2.Python解释器的分类 3.下载Python解释器 4.安装Python解释器 5.Python解释器验证 1.Python开发环境介绍 所谓"工欲 ...

  7. 『无为则无心』Python日志 — 69、补充:logging.basicConfig()函数说明

    目录 1.basicConfig()函数说明 2.应用 1.basicConfig()函数说明 此函数,通过创建一个带有默认Formatter(格式器)的StreamHandler(处理器),并将其添 ...

  8. 『无为则无心』Python面向对象 — 51、私有成员变量(类中数据的封装)

    目录 1.私有成员变量介绍 (1)私有成员变量概念 (2)私有成员变量特点 (3)私有成员变量体验 2.属性私有化工作原理 3.定义成员变量的标识符规范 4.私有成员变量的获取和设置方式 1.私有成员 ...

  9. 『无为则无心』Python基础 — 2、编译型语言和解释型语言的区别

    目录 1.什么是计算机语言 2.高级语言中的编译型语言和解释型语言 (1)编译型语言 (2)解释型语言 (3)编译型语言和解释型语言执行流程 3.知识扩展: 4.关于Python 1.什么是计算机语言 ...

随机推荐

  1. java单例模式(饿汉式和懒汉式)

    1 /* 2 * 设计模式:对问题行之有效的解决方式.其实它是一种思想. 3 * 4 * 1,单例设计模式 5 * 解决的问题:就是可以保证一个类在内容中的对象唯一性. 6 * 7 * 必须对于多个程 ...

  2. GitHub镜像

    GitHub 官网镜像(可以用来clone push等,但是不能登录) https://github.com.cnpmjs.org https://git.sdut.me https://hub.fa ...

  3. Web播放器

    web视频播放器的使用及遇到的问题记录 TcPlayer播放器(腾讯Web超级播放器) https://cloud.tencent.com/document/product/881/20207 Ste ...

  4. K8S SVC 转发原理

    在前面的文章中,我们已经多次使用到了 Service 这个 Kubernetes 里重要的服务对象.而 Kubernetes 之所以需要 Service,一方面是因为 Pod 的 IP 不是固定的,另 ...

  5. maven 项目搭建,本地环境配置。

    一,下载地址 http://maven.apache.org/download.cgi 英文不好的,可以在浏览器下载个翻译的插件,就好了,我用的是谷歌. 二, 解压文件,安装在自己制定的目录,注意安装 ...

  6. contos 6.9 和 centos7 配置docker?

    一.contos 6.9 配置docker? 1.检查centos的内核,因为目前docker的版本所支持的centos最低内核版本为2.4 // uname -r // 2.6.32-696.el6 ...

  7. 理解https中的安全及其实现原理

    Google的一份网络上的 HTTPS 加密透明报告(数据截至2022年1月)中指出HTTPS 连接的普及率在过去几年激增,互联网上排名前 100 位的非 Google 网站HTTPS 使用情况为:9 ...

  8. AtCoder AGC003 简要题解

    A 首先横向和纵向互相独立,因此只考虑横向的情况. 那么显然只要不只往一边走都一定存在一种构造方式,直接判断即可,复杂度 \(\mathcal{O}(|S|)\). B 首先相邻两个数同时配对两次可以 ...

  9. Idea Error:java: System Java Compiler was not found in classpath:

    前言 这个问题和IDEA的版本有关系,或者有时不小心把项目错误操作了一步,导致出现,这个属于常见错误 解决办法 1:关闭项目,找一个正常运行的项目,将其.idea..mvn文件夹拷贝出来,替换到不能运 ...

  10. Java 书写规范简单整理

    本文带有华为Logo的PPT图片,引自:华为云课堂 目录 Java基础语句使用规范 选择结构 switch 默认要有default分支 注意break的使用 如果使用枚举,并且选项已全部列出,可以没有 ...