python使用logging模块方法 教程

logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点:

可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;
print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出;

  1. logging模块的日志级别

logging模块默认定义了以下几个日志等级,它允许开发人员自定义其他日志级别,但是这是不被推荐的,尤其是在开发供别人使用的库时,因为这会导致日志级别的混乱。

日志等级(level) 描述

DEBUG   最详细的日志信息,典型应用场景是 问题诊断
INFO    信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
WARNING 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
ERROR   由于一个更严重的问题导致某些功能不能正常运行时记录的信息
CRITICAL    当发生严重错误,导致应用程序不能继续运行时记录的信息
开发应用程序或部署开发环境时,可以使用DEBUG或INFO级别的日志获取尽可能详细的日志信息来进行开发或部署调试;应用上线或部署生产环境时,应该使用WARNING或ERROR或CRITICAL级别的日志来降低机器的I/O压力和提高获取错误日志信息的效率。日志级别的指定通常都是在应用程序的配置文件中进行指定的。

说明:

上面列表中的日志等级是从上到下依次升高的,即:DEBUG < INFO < WARNING < ERROR < CRITICAL,而日志的信息量是依次减少的;
当为某个应用程序指定一个日志级别后,应用程序会记录所有日志级别大于或等于指定日志级别的日志信息,而不是仅仅记录指定级别的日志信息,nginx、php等应用程序以及这里要提高的python的logging模块都是这样的。同样,logging模块也可以指定日志记录器的日志级别,只有级别大于或等于该指定日志级别的日志记录才会被输出,小于该等级的日志记录将会被丢弃。

1.输出到日志里,详细见如下代码:

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

import logging

# 第一步
# 创建一个logger
terLog = logging.getLogger('__nginx__')
# 设置logger级别 log等级总开关
terLog.setLevel(level=logging.INFO)

# 第二步
# 输出到file名称
fileLog = logging.FileHandler('nginxLog.txt')
# 输出到file的log等级开关
fileLog.setLevel(logging.INFO)

# 第三步定义handler输出格式
deFormat = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fileLog.setFormatter(deFormat)

# 第四步 将fileLog添加到terLog里面
terLog.addHandler(fileLog)

# 日志
terLog.info("Start print log 123 魏若愚")
terLog.debug("Do something debug魏若愚")
terLog.warning("Something maybe fail.warning魏若愚")
terLog.info("Finish info魏若愚")

2只输出到屏幕

3同时输出到屏幕,并且输出到日志里,如下代码:

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

import logging

# 第一步
# 创建一个logger
terLog = logging.getLogger('__nginx__')
# 设置logger级别 log等级总开关
terLog.setLevel(level=logging.INFO)

# 第二步
# 输出到file名称
fileLog = logging.FileHandler('nginxLog.txt')
# 输出到file的log等级开关
fileLog.setLevel(logging.INFO)

#同时输出到屏幕
outputConsole = logging.StreamHandler()
outputConsole.setLevel(logging.INFO)

# 第三步定义handler输出格式
deFormat = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fileLog.setFormatter(deFormat)
# 同时设置输出屏幕格式
outputConsole.setFormatter(deFormat)

# 第四步 将fileLog添加到terLog里面
terLog.addHandler(fileLog)

# 同时输出到屏幕东中
terLog.addHandler(outputConsole)

# 日志
terLog.info("Start print log 123 魏若愚")
terLog.debug("Do something debug魏若愚")
terLog.warning("Something maybe fail.warning魏若愚")
terLog.info("Finish info魏若愚")

输出屏幕结果:

2019-03-11 16:55:16,066 - __nginx__ - INFO - Start print log 123 魏若愚
2019-03-11 16:55:16,086 - __nginx__ - WARNING - Something maybe fail.warning魏若愚
2019-03-11 16:55:16,086 - __nginx__ - INFO - Finish info魏若愚
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章