Python日志功能与处理逻辑
前言
在应用程序执行过程中,我们希望通过规范格式输出程序执行的详细信息,这时我们需要用到日志功能。在Python语言中,有个內建模块logging能够很好的实现日志功能。整体来说,logging配置可以分成4个部分: Loggers、Handlers、Filters和Formatters。接下来我们详细探讨其处理逻辑和配置方法。
1.日志功能逻辑

LogRecord
每个事件生成日志条目称之为LogRecord,在LogRecord中包含了日志级别,日志元数据信息两个重要组成部分。在Python语言中日志级别可以分为5个等级:
- DEBUG: Low level system information for debugging purposes.
- INFO: General system information.
- WARNING: Information describing a minor problem that has occurred.
- ERROR: Information describing a major problem that has occurred.
- CRITICAL: Information describing a critical problem that has occurred.
当LogRecord传入Logger中处理时,会比较LogRecord和Logger中的日志级别。若日志级别相等或者高于Logger的日志级别,该条LogRecord才会被Logger处理。
Formatter
Formatter主要用于渲染日志的输出格式,在Python中给定了内置的格式变量,我们可以自定义日志信息的输出格式。
格式变量列举:
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s用户输出的消息
Filter
Filter用来为日志信息的处理提供额外的过滤选项。在默认情况下,从Logger获取到的每一条LogRecord都会交给Handler处理。但是,当我们有一些额外的处理逻辑,比方说我希望将LogRecord的日志级别变更,或者我希望后续仅处理ERROR类型的记录,那么就可以使用Filter来过滤。
Handler
Handler是日志处理的核心,描述了程序日志的后续执行方式。一般而言,我们希望日志能够输出到Console显示,或者写成文件本地持久化存储,都要靠Handler来实现。为此,Python中主要提供了FileHandler和StreamHandler两种Handler来分别执行文件存储和控制台打印两种日志处理方式。
2.函数式配置日志
函数式配置日志输出是最简单的方式,我们可以将日志打印到文件中。但是,这种方式有个缺陷,即无法将日志打印到Console。
特点:配置简单,但无法同时输出控制台和文件
import logging
logging.basicConfig(
level=logging.DEBUG, # 设定打印日志的级别
# 日志消息格式,level=日志级别 format=日志格式 asctime=对应下面的datefmt filename=日志文件路径
format="%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s",
datefmt="%Y-%d-%d %H:%M:%S",
filename="1.log",
# a=追加 w=覆盖
filemode="a"
)
logging.debug("debug")
logging.info("info")
3.对象式配置日志
对象式配置日志能够较强的进行定制化配置,包括日志的输出格式、控制台输出、输出本地文件持久化存储。因此,在实际使用时一般都采用对象式配置日志的方式来处理。
特点:定制化强,配置较为复杂
配置流程:
- 创建并获取logger对象;
- 创建FileHandler对象;
- 创建StreamHandler对象;
- 创建Formatter对象;
- 给Handler对象绑定Formatter;
- 给logger对象绑定Handler
import logging
logger = logging.RootLogger("DEBUG") # 如果要自定义level,则可使用RootLogger,或者logger.setLevel()
# logger = logging.getLogger() # 使用getLogger默认level为WARNING
fh = logging.FileHandler('test.log', encoding='utf-8') # 创建FileHandler对象
sh = logging.StreamHandler() # 创建StreamHandler对象
fmt = logging.Formatter("%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s")
fh.setFormatter(fmt) # 给Handler对象绑定Formatter
sh.setFormatter(fmt) # 给Handler对象绑定Formatter
logger.addHandler(fh) # 给logger对象绑定Handler
logger.addHandler(sh) # 给logger对象绑定Handler
logger.info('info')
logger.debug('debug')
logger.error("error")
Python日志功能与处理逻辑的更多相关文章
- Atitit php java python nodejs错误日志功能的比较
Atitit php java python nodejs错误日志功能的比较 1.1. Php方案 自带 1 1.2. Java解决方案 SLF4J 1 1.3. Python解决方案 自带lo ...
- 使用python实现日志功能
Python脚本日志系统 Python通过logging模块提供日志功能,关于logging模块的使用网络上已经有很多详细的资料,这里要分享的是怎样在实际工程中使用日志功能. 假设要开发一个自动化 ...
- 【Python】自己写日志功能
Python有自带的logging模块,用于日志记录,功能很强大,但不好用,使用挺麻烦的,而且发现了几个bug,调用了一个logger.warning()一次,结果日志文件中出现了n行记录,且逐渐变成 ...
- python接口测试之日志功能
之前在简书中看了一篇关于日志功能的文档,供大家参考:https://www.jianshu.com/p/62f7b49b41e7 Python通过logging模块提供日志功能,所以直接导入即可 im ...
- Spring AOP 实现写事件日志功能
什么是AOP?AOP使用场景?AOP相关概念?Spring AOP组件?如何使用Spring AOP?等等这些问题请参考博文:Spring AOP 实现原理 下面重点介绍如何写事件日志功能,把日志保存 ...
- python日志模块logging
python日志模块logging 1. 基础用法 python提供了一个标准的日志接口,就是logging模块.日志级别有DEBUG.INFO.WARNING.ERROR.CRITICAL五种( ...
- Asp.Net Core中利用Seq组件展示结构化日志功能
在一次.Net Core小项目的开发中,掌握的不够深入,对日志记录并没有好好利用,以至于一出现异常问题,都得跑动服务器上查看,那时一度怀疑自己肯定没学好,不然这一块日志不可能需要自己扒服务器日志来查看 ...
- python日志模块笔记
前言 在应用中记录日志是程序开发的重要一环,也是调试的重要工具.但却很容易让人忽略.之前用flask写的一个服务就因为没有处理好日志的问题导致线上的错误难以察觉,修复错误的定位也很困难.最近恰好有时间 ...
- Node.js / Python 日志
一.Node.js 日志 1.原生 Node.js 原生方法其实很简单,就四个: // 输出到 stdout console.log() console.info() = console.log() ...
随机推荐
- Kinect+unity 实现体感格斗闯关小游戏
文章目录 项目地址 1 项目概况 1.1 项目简介 1.2 项目目的 1.3 主要技术 2 设计 2.1 基本概念 2.2 框架 2.3 算法 2.4 模型 2.5 调查问卷 3 实现 3.1 技术难 ...
- JS实现call,apply,bind函数
实现之前的预备知识 ...用作展开 ...用作剩余参数 Object.create()的作用 原型链与构造函数 这些有时间补上吧 call函数实现 Function.prototype.myCall ...
- Python 3.x pip安装报错ERROR: No matching distribution found for PIL
安装完成即可解决无法引入PIL的问题.
- Oracle元数据信息
一.schema操作 1)查看当前schema select user, sys_context('userenv','current_schema') from dual; 2)切换schema a ...
- RocketMQ在windows环境下的安装(转)
原博地址:https://www.jianshu.com/p/4a275e779afa 一.预备环境 1.系统 Windows 2. 环境 JDK1.8.Maven.Git 二. RocketMQ部署 ...
- Jmeter 常用函数(31)- 详解 __iterationNum
如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.html 作用 获取当前线程的循环次数,跟线程组属性挂 ...
- JavaScript学习系列博客_20_JavaScript 作用域
作用域 - 作用域指一个变量的作用的范围 - 在JS中一共有两种作用域 1.全局作用域 - 直接编写在script标签中的JS代码,都在全局作用域- 全局作用域在页面打开时创建,在页面关闭时销毁 - ...
- 一文说通Jwt、Session、Cooike区别
JWT 全称是 JSON Web Token,是目前非常流行的跨域认证解决方案,在单点登录场景中经常使用到. 有些人觉得它非常好用,用了它之后就不用在服务端借助 redis 实现认证过程了,但是,还有 ...
- Linux用户和组密令大全
本文总结了Linux添加或者删除用户和用户组时常用的一些命令和参数. 1.建用户: adduser phpq passwd phpq ...
- 小白式DPDK搭建方法(附相关错误得处理方法)
搭建环境:VM VM搭建参考其他博客 步骤一 点击虚拟机设置,添加两个网卡(我这里都是使用的都是桥接模式) 步骤二.从网上下载dpdk的压缩包: 命令:wget http://fast.dpdk.or ...