Python的logging模块基本用法


Posted in Python onDecember 24, 2020

在服务器部署时,往往都是在后台运行。当程序发生特定的错误时,我希望能够在日志中查询。因此这里熟悉以下 logging 模块的用法。

logging 模块定义了报告错误和状态信息的标准 API。

logging 的组件

日志系统有 4 个相互交互的组件。我们需要使用 Logger 实例来向日志添加信息。触发日志会创建一个 LogRecord,用于内存中存储信息。Logger 可能有很多 Handler 对象,用于接收和处理日志记录。Handler 使用 Formatter 来输出日志记录。

向文件输入日志

大多数应用都是把日志输入到文件。使用 basicConfig() 函数可以设置默认的 handler,让日志输入到文件。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging

LOG_FILENAME = 'log.txt'
logging.basicConfig(
  filename=LOG_FILENAME,
  level=logging.DEBUG,
)

logging.debug('hello logging!')

with open(LOG_FILENAME, 'rt') as f:
  body = f.read()

print('FILE: ')
print(body)

运行脚本后输出如下:

FILE:
DEBUG:root:hello logging!

日志文件的循环

要让每次程序运行时,生成一个新的文件,需要向 basicConfig() 传一个值为 w 的 filemode 参数。还有一个更方便的方法,就是使用 RotatingFileHandler,可以同时自动创建文件和保存旧文件。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import glob
import logging.handlers

LOG_FILENAME = 'log.txt'

my_logger = logging.getLogger('SpecificLogger')
my_logger.setLevel(logging.DEBUG)

# Add the log message handler to the logger
handler = logging.handlers.RotatingFileHandler(
  LOG_FILENAME,
  maxBytes=20,
  backupCount=5,
)
my_logger.addHandler(handler)

# Log some messages
for i in range(20):
  my_logger.debug(f'i = {i}')

# See what files are created
log_files = glob.glob(f'{LOG_FILENAME}*')
for filename in sorted(log_files):
  print(filename)

运行脚本后输出如下:

log.txt
log.txt.1
log.txt.2
log.txt.3
log.txt.4
log.txt.5

可以返现,log.txt 存储的都是最新的内容,logging 会自动地对这些文件进行重命名。 

信息显示的级别

logging 有不同的日志级别。

级别(level) 值(value)
CRITICAL 50
ERROR 40
WARNING 30
INFO 20
DEBUG 10
UNSET 0

日志可以只在某一级别之上的情况才会触发。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
import sys

level = int(sys.argv[1])
logging.basicConfig(
  level=level
)

logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')
$ python logging_level.py 10
DEBUG:root:debug message
INFO:root:info message
WARNING:root:warning message
ERROR:root:error message
CRITICAL:root:critical message
$ python logging_level 40
ERROR:root:error message
CRITICAL:root:critical message

命名 logging 实例

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging

logging.basicConfig(
  level=logging.WARNING
)

logger1 = logging.getLogger('package1.module1')
logger2 = logging.getLogger('package2.module2')

logger1.warning('hello 1')
logger2.warning('hello 2')

运行脚本后输出:

WARNING:package1.module1:hello 1
WARNING:package2.module2:hello 2

以上就是Python的logging模块基本用法的详细内容,更多关于Python logging模块的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
基于Python如何使用AIML搭建聊天机器人
Jan 27 Python
Python程序中设置HTTP代理
Nov 06 Python
python的exec、eval使用分析
Dec 11 Python
Python处理文本换行符实例代码
Feb 03 Python
python3+PyQt5实现自定义流体混合窗口部件
Apr 24 Python
Python数据结构之栈、队列及二叉树定义与用法浅析
Dec 27 Python
使用python批量化音乐文件格式转换的实例
Jan 09 Python
Django获取应用下的所有models的例子
Aug 30 Python
Python callable内置函数原理解析
Mar 05 Python
Python检测端口IP字符串是否合法
Jun 05 Python
Idea安装python显示无SDK问题解决方案
Aug 12 Python
python自动化测试三部曲之unittest框架的实现
Oct 07 Python
python 通过exifread读取照片信息
Dec 24 #Python
python 如何上传包到pypi
Dec 24 #Python
python 基于PYMYSQL使用MYSQL数据库
Dec 24 #Python
python xlsxwriter模块的使用
Dec 24 #Python
想学画画?python满足你!
Dec 24 #Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
Dec 24 #Python
用python获取txt文件中关键字的数量
Dec 24 #Python
You might like
MySQL中create table语句的基本语法是
2007/01/15 PHP
PHP登陆后跳转到登陆前页面实现思路及代码
2014/01/17 PHP
PHP编程中的__clone()方法使用详解
2015/11/27 PHP
ext form 表单提交数据的方法小结
2008/08/08 Javascript
Javascript的一种模块模式
2010/09/08 Javascript
在JS中最常看到切最容易迷惑的语法(转)
2010/10/29 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
屏蔽IE弹出"您查看的网页正在试图关闭窗口,是否关闭此窗口"的方法
2013/12/31 Javascript
JS使用parseInt解析数字实现求和的方法
2015/08/05 Javascript
全面解析JavaScript中“&&”和“||”操作符(总结篇)
2016/07/18 Javascript
深入理解vue $refs的基本用法
2017/07/13 Javascript
Bootstrap导航菜单点击后无法自动添加active的处理方法
2018/08/10 Javascript
React Native开发封装Toast与加载Loading组件示例
2018/09/08 Javascript
vue-router传递参数的几种方式实例详解
2018/11/13 Javascript
node(koa2) web应用模块介绍详解
2019/03/29 Javascript
使用Vue父子组件通信实现todolist的功能示例代码
2019/04/11 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
element-ui中Table表格省市区合并单元格的方法实现
2019/08/07 Javascript
小程序使用分包的示例代码
2020/03/23 Javascript
Python正则表达式介绍
2012/08/06 Python
Python字符串匹配算法KMP实例
2015/07/18 Python
python爬虫入门教程--优雅的HTTP库requests(二)
2017/05/25 Python
Python 加密的实例详解
2017/10/09 Python
python生成n个元素的全组合方法
2018/11/13 Python
pytorch 预训练层的使用方法
2019/08/20 Python
python 非线性规划方式(scipy.optimize.minimize)
2020/02/11 Python
django Layui界面点击弹出对话框并请求逻辑生成分页的动态表格实例
2020/05/12 Python
HTML5中div、article、section的区别及使用介绍
2013/08/14 HTML / CSS
详解HTML5中表单验证的8种方法介绍
2016/12/19 HTML / CSS
写一个在SQL Server创建表的SQL语句
2012/03/10 面试题
运动会方队口号
2014/06/07 职场文书
素质教育标语
2014/06/27 职场文书
美术兴趣小组活动总结
2014/07/07 职场文书
2015年高二班主任工作总结
2015/05/25 职场文书
导游词之澳门玫瑰圣母堂
2019/12/03 职场文书
PHP对接阿里云虚拟号的实现(号码隐私保护)
2021/04/06 PHP