Python logging模块的基本使用

logging 模块是 Python 内置的标准模块,用于输出代码日志。

一、logging 模块简介

在工作中,运行的代码量是非常大的,为了更方便的管理代码运行,监控代码运行的过程,需要在代码中添加一些必要的日志输出。

Python 内置了 logging 模块,在 Python 中,可以使用 logging 模块来实现与日志相关的功能。如输出运行日志到控制台,将运行日志写入文件,日志文件滚动存储等。

相对直接 print 打印运行信息而言,使用 logging 模块输出日志可以设置日志等级,指定输出位置,写入文件等,使用起来方便很多。在一个成熟的项目中,打印的日志量是非常大的,logging 模块还可以帮助我们管理日志,以便更好地维护项目和定位问题。

logging 模块主要包含四个部分:

Loggers: 提供程序调用的接口,在代码中调用 api 来记录日志

Handlers: 对日志信息进行不同的处理,如记录日志的方式

Formatters: 定义日志的打印格式

Filters:对日志信息进行过滤, 自定义日志是否输出的判断

二、logging 模块的基本使用

# coding=utf-8
import loggingfile_name = 'logger.txt'
formatter = '%(asctime)s -- %(filename)s[line:%(lineno)d] %(levelname)s\t%(message)s'
logging.basicConfig(format=formatter, level=logging.DEBUG)
# logging.basicConfig(filename=file_name, format=formatter, level=logging.DEBUG)logger = logging.getLogger(__name__)logger.debug('debug10')
logger.info('info20')
logger.warning('warning30')
logger.error('error40')
logger.critical('critical50')

运行结果:

2019-10-02 21:16:29,860 -- logging_demo.py[line:12] DEBUG    debug10
2019-10-02 21:16:29,860 -- logging_demo.py[line:13] INFO    info20
2019-10-02 21:16:29,861 -- logging_demo.py[line:14] WARNING warning30
2019-10-02 21:16:29,861 -- logging_demo.py[line:15] ERROR   error40
2019-10-02 21:16:29,861 -- logging_demo.py[line:16] CRITICAL    critical50

上面的代码中,使用 logging 中的 basicConfig() 方法,传入日志的格式和输出日志的等级,然后通过 getLogger() 方法创建一个  logger 对象,就可以通过 logger 对象来输出日志了。basicConfig() 是 logging 中实现日志输出最简单和最基本的方法。

运行上面的代码,会在控制台打印代码的日志信息,因为 basicConfig() 默认是将日志信息打印到控制台。如果在 basicConfig() 中传入 filename 参数,指定日志输出的文件,则日志信息会写到文件中,不会在控制台打印。

logger 对象有 debug() 、info() 等5个基本的日志输出方法,分别对应了5个日志等级。除此之外还有几个方法,可以在 PyCharm 中点击 getLogger 进入源码查看。

三、basicConfig的参数说明

1. filename: 日志输出到文件的文件名

2. filemode: 文件读写模式,r[+]、w[+]、a[+]

3. format: 日志输出的格式

4. datefat: 日志附带日期时间的格式

5. style:格式占位符,默认为 "%" 和 “{}”

6. level:设置日志输出级别

7. stream: 定义输出流,用来初始化 StreamHandler 对象,不能和 filename 参数一起使用,否则会 ValueError 异常

8. handles: 定义处理器,用来创建 Handler 对象,不能和 filename 、stream 参数一起使用,否则也会抛出 ValueError 异常

四、日志信息同时输出控制台和写入文件

import loggingfile_name = 'logger.txt'
formatter = '%(asctime)s -- %(filename)s[line:%(lineno)d] %(levelname)s\t%(message)s'
logging.basicConfig(filename=file_name, format=formatter, level=logging.DEBUG)logger = logging.getLogger(__name__)console = logging.StreamHandler()
# console.setLevel(logging.DEBUG)
console.setLevel(20)
console_formatter = logging.Formatter('%(asctime)s - %(filename)s - [line]:%(lineno)d - %(levelname)s - %(message)s')
console.setFormatter(console_formatter)
logger.addHandler(console)logger.debug('debug->10')
logger.info('info->20')
logger.warning('warning->30')
logger.error('error->40')
logger.exception('exception->40')
logger.critical('critical->50')
logger.fatal('fatal->50')

运行结果:

2019-10-02 21:29:41,016 - logging_demo.py - [line]:36 - INFO - info->20
2019-10-02 21:29:41,016 - logging_demo.py - [line]:37 - WARNING - warning->30
2019-10-02 21:29:41,016 - logging_demo.py - [line]:38 - ERROR - error->40
2019-10-02 21:29:41,016 - logging_demo.py - [line]:39 - ERROR - exception->40
NoneType: None
2019-10-02 21:29:41,016 - logging_demo.py - [line]:40 - CRITICAL - critical->50
2019-10-02 21:29:41,016 - logging_demo.py - [line]:41 - CRITICAL - fatal->50

在使用 basicConfig() 方法实现日志输出时,如果不指定 filename 参数,则日志信息被输出在控制台,如果指定 filename 参数,则日志被写入文件中。

在实际开发中,通常是即需要写入文件,也需要控制台输出。

这时,可以再定义一个日志处理对象,一个对象写文件,一个对象输出控制台。如上面通过 logging 中的 StreamHandler() 创建一个 console 对象,然后通过 addHandler() 将 console 加入到 logger 对象中。console 可以设置与  basicConfig() 不一样的日志输出格式,可以设置不一样的日志输出等级,是互相独立的。

五、logging 的日志级别

在 logging 中,日志主要有5个等级。

1. DEBUG: 对应数值10,打印调式信息。

2. INFO: 对应数值20,处理请求,状态变化等日常信息。

3. WARNING: 对应数值30,比较重要的提醒信息,警告信息。

4. ERROR: 对应数值40,程序发生了报错,如连接错误,编译错误。

5. CRITICAL: 对应数值50,特别严重的问题,如服务器故障等。

对于日志级别来说,对应的数值表示日志信息的重要程度,或问题的严重程度,数值越大,日志等级越高。

通常,日志级别越低,量越大,级别越高,量越少(天天有重大故障项目就不用做了),在日志的输出过程中,可以指定输出级别,来过滤掉低级别的日志信息。指定日志级别后,只会输出大于等于指定级别的日志,如指定 DEBUG 则会输出所有5个级别的日志,指定 INFO 则不再输出 DEBUG 级别的日志(参考上面代码)。

上面5个日志等级对应的日志输出方法分别为它们的小写。debug(),inifo(), ... 除此之外,还有两个方法,exception() 和 fatal() 。exception() 对应的日志等级与 error() 相同,都是40,exception() 默认返回一个空值。fatal() 有对应的日志等级 FATAL ,fatal() 对应的日志等级与 critical() 相同,都是50,在源码中就是 fatal = critical,两个完全相同。

关于日志级别,我们也可以自定义,自定义日志等级时注意不要和默认的日志等级数值相同。设置日志输出等级的时候,也可以通过数值来指定,只有大于数值的日志等级会被输出(参考上面的代码)。

六、logging 日志的输出格式

1. asctime:日志的输出时间,默认为 YYYY-mm-DD HH:MM:SS,SSS,如: 2019-10-02 21:29:41,016,一直精确到毫秒。可以额外指定 datefmt 参数来指定该变量的格式

2. name: 日志对象的名称

3. filename: 不包含路径的文件名

4. pathname:包含路径的文件名

5. funcName: 日志记录所在的函数名

6. levelname: 日志的级别名称

7. message: 具体的日志信息

8. lineno: 日志记录的代码所在的行号

9. pathname: 完整路径

10. process: 当前进程ID

11. processName: 当前进程名称

12. thread: 当前线程ID

13. threadName: 当前线程名称

这些日志信息是可选的,需要哪些可以自定义,其中 asctime 和 message 是必须有的,不然就失去日志的意义了。常用的有 filename,lineno,levelname,其他的根据情况选用。

定义日志输出格式时,%() 是用来为实际的数据占位用的,后面的 s ,d 表示数据的类型,s 表示字符串, d 表示整数。

Python logging模块的基本使用相关推荐

  1. 关于使用python logging模块的几点总结

    关于使用python logging模块的几点总结 使用python的标准日志模块logging可以非常方便地记录日志.Python日志系统非常丰富.添加结构化或非结构化日志输出到python代码,写 ...

  2. python logging模块使用

    python logging模块使用 logging模块 日志记录的重要性 在开发过程中,我们可以printf或者Debug来排查问题. 但是在生产环境中(黑盒环境)出现问题,我们并不能知道在运行的环 ...

  3. python logging模块使用_python logging模块使用

    近来再弄一个小项目,已经到收尾阶段了.希望加入写log机制来增加程序出错后的判断分析.尝试使用了python logging模块. #-*- coding:utf-8 -*- importloggin ...

  4. Python logging模块切分和轮转日志

    Python logging模块切分和轮转日志 logging 模块可以实现日志的输出和写入文件,但实际工作中,对于日志是使用不仅限于输出那么简单. logging基本使用参考:https://blo ...

  5. python调用微信客户端_python模拟微信客户端打开链接Python Logging 模块研究

    背景 在一个新的项目里面加入了日志功能,想自己写一个,但是一个偶然的机会,通过google发现Python内建了一个非常强大的日志(log)模块:logging.粗略的研究了一下,下面是我的一些心得札 ...

  6. python logging模块-写日志、log回滚

    python包/模块,专栏总目录: 1.python自定义模块 2.python模块调用顺序 3.python logging模块 4.python定义跨模块的全局变量 1.logging模块简介 l ...

  7. Python Logging模块实现运行的程序写入 日志

    参考文章:  Python使用logging模块实现打印log到指定文件的方法_python_脚本之家 https://www.jb51.net/article/146909.htm 步骤: (1) ...

  8. python logging模块的作用_Python 日志模块logging分析及使用-2

    本文作为Python日志模块的补充,主要介绍日志回滚RotatingFileHandler和TimedRotatingFileHandler的使用,以及其所带来的问题.Logger对象的日志等级是如何 ...

  9. Python logging模块日志存储位置踩坑

    问题描述 项目过程中写了一个小模块,设计到了日志存储的问题,结果发现了个小问题. 代码结构如下: db.py run.py 其中db.py是操作数据库抽象出来的一个类,run.py是业务逻辑代码.两个 ...

最新文章

  1. 重装系统找不到固态_90%的人重装系统后,感觉电脑变快了
  2. 中国新能源重卡行业十四五规划及投资可行性研究报告2022-2028年版
  3. 2apt-get命令,deb包安装,源码安装
  4. 京东布局消费物联网 聚合产业链共建生态
  5. python图形界面编程库_Python支持哪些图形界面的第三方库
  6. 9:14 2009-7-22
  7. C++ 中map容器
  8. 原生JS转Vue格式的思路
  9. CF1109F Sasha and Algorithm of Silence's Sounds LCT、线段树
  10. 列表左右移动 2017-03-23
  11. spring mvc数据绑定与表单标签库
  12. 手机图形计算器matlab,Mathlab图形计算器下载
  13. spring使用之旅 ---- bean的装配
  14. cassandra cqlsh 使用实际IP或者locahost都可以进入命令行
  15. activeMQ吐血总结
  16. 20210725个人周复盘
  17. 荣耀开发者平台全面升级,加强分发场景服务与能力开放
  18. 【Java EE 学习 55】【酒店会员管理系统项目总结】
  19. Robotics XM430-W350 云台电机使用记录
  20. Metasploit-MS17-010(永恒之蓝 EternalBlue )复现

热门文章

  1. git比较两个分支的文件的差异
  2. 【转载】asp.net中弹出确认窗口(confirm),实现删除确认的功能
  3. 【编程好习惯】避免使用魔数
  4. 如何优化WebAPP性能:从四个层面上彻底优化前端项目性能
  5. VueRouter源码分析
  6. CSS那些不大不小的事
  7. servlet url-pattern配置中 / 和 /* 的区别 记录
  8. 【网络编程】中文字符、时间等编码转换
  9. 【Nginx那些事】nginx配置实例(一)反向代理
  10. C#LeetCode刷题-几何