Python自动化课程又上了一节课,每一个自动化框架都涉及到日志的使用,logging模块是Python的一个标准库模块,由标准库模块提供日志记录API的关键好处是所有Python模块都可以使用这个日志记录功能。

  接下来就来整理一下昨天上课的内容,整理的目标是把日志模块的一些难点去记录下来。

  第一,日志是什么?日志有什么作用?

  日志是一种可以追踪某些软件运行时所发生事件的方法。

  日志的作用是通过记录和分析日志可以了解一个系统或软件程序运行情况是否正常,也可以在应用程序出现故障时快速定位问题。可以总结为3点: 

  • 程序调试
  • 了解软件的运行情况,检查是否正常
  • 程序运行时的故障分析与问题定位

  第二,关于日志的等级

  首先,我们要知道为什么日志要分为等级?

  其实是因为在程序开发阶段,开发人员需要调试代码确保软件的正常运行,需要将所有的日志信息全部记录下来,去定位和分析问题,但是这样是非常消耗性能的。而在程序发布上线后,我们并不需要所有的日志信息,只需要记录一些关于异常信息和报错信息,这样记录可以减少I/O的压力,优化性能,而且可以防止报错信息被淹没在日志的海洋中。所以,日志的等级就是为了解决前面的问题出现的。

  python日志的等级分为:

日志等级(level) 描述
DEBUG 最详细的日志信息,典型应用场景是 问题诊断
INFO 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
WARNING 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
ERROR 由于一个更严重的问题导致某些功能不能正常运行时记录的信息
CRITICAL 当发生严重错误,导致应用程序不能继续运行时记录的信息

  在python中,logging模块提供的日志记录函数所使用的日志器默认设置的日志级别是WARNING,因此只有WARNING级别的日志记录以及大于它的ERRORCRITICAL级别的日志记录被输出了,而小于它的DEBUGINFO级别的日志记录被丢弃了。而如果我们需要放开所有信息全部显示的话,则需要调用logging.basicConfig或者使用logger对象调用setLevel()方法:

  1. 调用logging.basicConfig配置日志等级

import logging
# 设置日志等级
logging.basicConfig(level=logging.DEBUG)

  2. logger对象调用setLevel()配置日志等级

import logging

# 创建Logger
logger = logging.getLogger("Test")
# 设置日志等级
logger.setLevel(logging.DEBUG)

  第三,关于格式化日志输出

  在logging模块中,默认的日志输出格式在logging.basicConfig方法中设置的如下:

  默认格式:          日志级别:日志器名称:日志内容

  对应BASIC_FORMAT:   "%(levelname)s:%(name)s:%(message)s"

  昨天在课上的时候,没有讲关于格式化的字符串有哪些,今天就列出来:

  

字段/属性名称 使用格式 描述
asctime %(asctime)s 日志事件发生的时间--人类可读时间,如:2003-07-08 16:49:45,896
created %(created)f 日志事件发生的时间--时间戳,就是当时调用time.time()函数返回的值
relativeCreated %(relativeCreated)d 日志事件发生的时间相对于logging模块加载时间的相对毫秒数(目前还不知道干嘛用的)
msecs %(msecs)d 日志事件发生事件的毫秒部分
levelname %(levelname)s 该日志记录的文字形式的日志级别('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')
levelno %(levelno)s 该日志记录的数字形式的日志级别(10, 20, 30, 40, 50)
name %(name)s 所使用的日志器名称,默认是'root',因为默认使用的是 rootLogger
message %(message)s 日志记录的文本内容,通过 msg % args计算得到的
pathname %(pathname)s 调用日志记录函数的源码文件的全路径
filename %(filename)s pathname的文件名部分,包含文件后缀
module %(module)s filename的名称部分,不包含后缀
lineno %(lineno)d 调用日志记录函数的源代码所在的行号
funcName %(funcName)s 调用日志记录函数的函数名
process %(process)d 进程ID
processName %(processName)s 进程名称,Python 3.1新增
thread %(thread)d 线程ID
threadName %(thread)s 线程名称

  

  如果说我们要自己去设置自己自定义的格式化输出日志,则我们有两种方法去进行设置日志的输出格式:

  1. 使用logging.basicConfig进行格式化输出:

  


__author__ = "清风"
import logging

LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s"

logging.basicConfig(level=logging.DEBUG,format=LOG_FORMAT)

logging.debug("This is a debug log")

#输出
>> 2018-04-18 15:42:59,429 - DEBUG - This is a debug log

  2. 使用日志输出对象进行格式化输出配置


__author__ = "清风" 

import logging logger = logging.getLogger() # 控制台Handler对象
consoleHandler = logging.StreamHandler()
# 设置日志输出格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
# 将格式添加到对象中
consoleHandler.setFormatter(formatter)
# 添加到Logger中
logger.addHandler(consoleHandler)
logger.warning("This is a warning log.") #输出
>>2018-04-18 15:51:35,991 - WARNING - This is a warning log.

  ok,今天的整理就到这里。

  

logging模块培训小结的更多相关文章

  1. logging模块知识点及应用小结

    Logging模块知识点: 一.分为5个级别:debug(),info(),warning(),error(),critical().级别由低到高  1.1最简单的用法: 1.2 如果想把日志写到文件 ...

  2. Python中的logging模块

    http://python.jobbole.com/86887/ 最近修改了项目里的logging相关功能,用到了python标准库里的logging模块,在此做一些记录.主要是从官方文档和stack ...

  3. python logging 模块的应用

    对一名开发者来说最糟糕的情况,莫过于要弄清楚一个不熟悉的应用为何不工作.有时候,你甚至不知道系统运行,是否跟原始设计一致. 在线运行的应用就是黑盒子,需要被跟踪监控.最简单也最重要的方式就是记录日志. ...

  4. Python入门之Python中的logging模块

    基本用法 下面的代码展示了logging最基本的用法. import logging import sys # 获取logger实例,如果参数为空则返回root logger logger = log ...

  5. Python Logging模块的简单使用

    前言 日志是非常重要的,最近有接触到这个,所以系统的看一下Python这个模块的用法.本文即为Logging模块的用法简介,主要参考文章为Python官方文档,链接见参考列表. 另外,Python的H ...

  6. logging 模块误用导致的内存泄露

    首先介绍下怎么发现的吧, 线上的项目日志是通过 logging 模块打到 syslog 里, 跑了一段时间后发现 syslog 的 UDP 连接超过了 8W, 没错是 8 W. 主要是 logging ...

  7. python logging模块详解[转]

    一.简单将日志打印到屏幕: import logging logging.debug('debug message') logging.info('info message') logging.war ...

  8. python logging模块

    1.logging模块提供了四个组件logger:日志类,有两个功能1)配置日志的等级,处理器handler,过滤器filterlogger.setLevel(logging.INFO)logger. ...

  9. python logging模块可能会令人困惑的地方

    python logging模块主要是python提供的通用日志系统,使用的方法其实挺简单的,这块就不多介绍.下面主要会讲到在使用python logging模块的时候,涉及到多个python文件的调 ...

随机推荐

  1. 放眼SEM现状及发展历程

    http://www.wocaoseo.com/thread-187-1-1.html 由于近年来移动应用的基本普及,搜索引擎营销随之进入高速发展时代,应用层次的提升已经成为企业营销策略的一个重要组成 ...

  2. 【Pod Terminating原因追踪系列之一】containerd中被漏掉的runc错误信息

    前一段时间发现有一些containerd集群出现了Pod卡在Terminating的问题,经过一系列的排查发现是containerd对底层异常处理的问题.最后虽然通过一个短小的PR修复了这个bug,但 ...

  3. 点击穿透事件-----CSS新属性

    面试被问,一脸懵,被提示,还蒙,好丢脸的感觉....赶紧百度了解 .noclick{ pointer-events: none; /* 上层加上这句样式可以实现点击穿透 */ } 就是说重叠在一起的两 ...

  4. Database4.exe用来导入excel

    从ACCESS数据库导出的EXCEL表格,可以通过database4.exe来连接,并导出sql脚本,再用database4.exe来连接ACCESS并先创建于脚本结构一致的表,然后复制脚本,从新生成 ...

  5. MD5截断比较验证 - 补充

    继上篇MD5截断比较验证文章之后有朋友提示除了数字以外,许多字母数字混合的明文在MD5加密之后也是可以达到同样效果的 同时在De1CTF中Web4题目中遇到了另一种较为特殊的截断比较验证,如图所示: ...

  6. C011:分数相加

    代码: #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int up1,down1,up2,down2; do ...

  7. Java里一个线程两次调用start()方法会出现什么情况

    Java的线程是不允许启动两次的,第二次调用必然会抛出IllegalThreadStateException,这是一种运行时异常,多次调用start被认为是编程错误. 如果业务需要线程run中的代码再 ...

  8. 转载:MySQL万字总结篇

    转载自:https://database.51cto.com/art/202001/609409.htm 开局一张图 这张图是重点!!!咱要先对 MySQL 有一个宏观的了解,知道他的执行流程. 一条 ...

  9. 【Flutter 实战】1.20版本更新及新增组件

    老孟导读:Flutter 1.20 更新了 Slider.RangeSlider.日期选择器组件.时间选择器组件的样式,新增了交换组件:InteractiveViewer,下面详细介绍其用法. 滑块 ...

  10. kickstart半自动安装centos系统与pxe自动安装centos系统

    一.kickstart半自动安装centos系统 关闭防火墙,关闭selinux,使用system-config-kickstart生成kickstart配置文件,启动xmanger-Passive ...