python 日志打印之logging使用介绍

by:授客QQ1033553122

测试环境:

Python版本:Python 2.7

 

简单的将日志打印到屏幕

import logging

logging.debug('this is a debug level message')

logging.info('this is info level message')

logging.warning('this is warning level message')

logging.error('this is error level message')

logging.critical('this is critical level message')

运行结果:

>>>

WARNING:root:this is warning level message

ERROR:root:this is error level message

CRITICAL:root:this is critical level message

>>>

默认情况下,logging将日志打印到屏幕,日志级别为WARNING,低于此级别的不显示;

日志级别从高到低:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,当然也可以自己定义日志级别。

通过logging.basicConfig函数对日志的输出格式及方式做相关配置

logging.basicConfig(**kwargs)

注:该函数必须在main线程除外的子线程启动之前调用,否则可能会造成日志重复记录

支持的常见关键词参数如下

filename   将使用指定的文件名,创建文件句柄(FileHandler),而非使用流处理器(StreamHandler)

filemode   指定打开文件的模式,如果指定了filename,但未指定filemode,则filemode默认为‘a’)。

format     指定handler使用的format.

datefmt        指定时间格式,同time.strftime()

level      设置root logger level为指定的level,默认为logging.WARNING

import logging

fmt = '%(asctime)s %(filename)s[line: %(lineno)d] %(levelname)s: %(message)s'

logging.basicConfig(level=logging.DEBUG,

format=fmt,

filename='d:/logs.txt',

filemode='w',

datefmt='%a, %d %b %Y %H:%M:%S'

)

logging.debug('this is a debug level message')

logging.info('this is info level message')

logging.warning('this is warning level message')

logging.error('this is error level message')

logging.critical('this is critical level message')

查看d:/logs.txt,文件内容如下

Sun, 17 Jan 2016 20:14:21 test2[line: 11] DEBUG: this is a debug level message

Sun, 17 Jan 2016 20:14:21 test2[line: 12] INFO: this is info level message

Sun, 17 Jan 2016 20:14:21 test2[line: 13] WARNING: this is warning level message

Sun, 17 Jan 2016 20:14:21 test2[line: 14] ERROR: this is error level message

Sun, 17 Jan 2016 20:14:21 test2[line: 15] CRITICAL: this is critical level message

format参数值说明:

%(name)s:   打印Logger的名字

%(levelno)s: 打印日志级别的数值

%(levelname)s: 打印日志级别名称

%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]

%(filename)s: 打印当前执行程序的文件名

%(funcName)s: 打印日志的当前函数

%(lineno)d:  打印日志的当前行号

%(asctime)s: 打印日志的时间

%(thread)d:  打印线程ID

%(threadName)s: 打印线程名称

%(process)d: 打印进程ID

%(message)s: 打印日志信息

将日志同时输出到文件和屏幕

import logging

fmt = '%(asctime)s %(filename)s[line: %(lineno)d] %(levelname)s: %(message)s'

logging.basicConfig(level=logging.DEBUG,

format=fmt,

filename='d:/logs.txt',

filemode='w',

datefmt='%a, %d %b %Y %H:%M:%S'

)

console = logging.StreamHandler()

console.setLevel(logging.INFO)

formatter = logging.Formatter(fmt)

console.setFormatter(formatter)

logging.getLogger().addHandler(console)

logging.debug('this is a debug level message')

logging.info('this is info level message')

logging.warning('this is warning level message')

logging.error('this is error level message')

logging.critical('this is critical level message')

控制台输出如下:

>>> ================================ RESTART ================================

>>>

2016-01-14 23:01:42,592 test.py[line: 18] INFO: this is info level message

2016-01-14 23:01:42,595 test.py[line: 19] WARNING: this is warning level message

2016-01-14 23:01:42,596 test.py[line: 20] ERROR: this is error level message

2016-01-14 23:01:42,598 test.py[line: 21] CRITICAL: this is critical level message

>>>

d:/logs.txt文件内容如下:

Thu, 14 Jan 2016 23:01:42 test.py[line: 17] DEBUG: this is a debug level message

Thu, 14 Jan 2016 23:01:42 test.py[line: 18] INFO: this is info level message

Thu, 14 Jan 2016 23:01:42 test.py[line: 19] WARNING: this is warning level message

Thu, 14 Jan 2016 23:01:42 test.py[line: 20] ERROR: this is error level message

Thu, 14 Jan 2016 23:01:42 test.py[line: 21] CRITICAL: this is critical level message

注意:logs.txt中记录比控制台输出的记录多一条,因为设置的level级别不一样

RotatingFileHandler介绍

该模块主要用于自动切换日志写入文件,将日志写入不同文件,保证单个日志文件不会太大。

class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0)

filename:指定初始文件名

mode:指定filename的打开方式

maxBytes:指定单个日志文件的文件最大值,当文件大小近乎maxBytes值时,自动关闭当前文件,自动创建一个新的文件,往新文件写入日志。如果为0,则不会发生日志切换事件。

backupCount:设置允许保留的最大文件数量,如果是非0值,当达到指定数量时,系统会创建新文件并自动删除最先创建的文件。

例子:比如设置filename为app.log,设置maxBytes=1024M, backupCount=5,那么当第一个文件app.log达到1024M时,自动关闭app.log,然后重命名为app.log.1,同时新建app.log,往里写入日志,当达到1024M时,自动关闭app.log,然后重命名为app.log.2,一直重复这样的操作,直到app.log.5,如果没达到app.log.5之前,如果app.log.x已存在,则重命名为app.log.x+1,如果达到5,则会删除之前的文件,顺序为按创建时间先后,如先删除app.log.1,自动关闭app.log, 然后重命名app.log.1,接着如果app.log文件又写满了,重复前面的删除操作,删除app.log.2……

例1:

import logging

from logging.handlers import RotatingFileHandler

rt_file_handler = RotatingFileHandler('d:/test1.log', maxBytes=10*1024*1024, backupCount=5)

rt_file_handler.setLevel(logging.INFO)

formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(me

ssage)s')

rt_file_handler.setFormatter(formatter)

logger = logging.getLogger()

logger.addHandler(rt_file_handler)

#logger.setLevel(logging.DEBUG) #设置日志级别,这里不能通过rt_file_handler.setLevel(logging.DEBUG)设置日志级别,不起作用

logger.debug('this is a debug level message')

logger.info('this is info level message')

logger.warning('this is warning level message')

logger.error('this is error level message')

logger.critical('this is critical level message')

运行查看结果:控制台无输出,d:\test1.log内容如下:

2016-01-17 23:34:35,200 test2[line:14] WARNING this is warning level message

2016-01-17 23:34:35,201 test2[line:15] ERROR this is error level message

2016-01-17 23:34:35,201 test2[line:16] CRITICAL this is critical level message

说明:可以设置maxBytes的值小一点,查看是会生成多个日志文件

通过logging.config模块配置日志

注意:配置文件必须包含[loggers],[handlers], [formatters],且每个结点下的logger,handler,formatter都必须有对应的结点,且格式必须正确:[loggers_logger], [handlers_handler], [handlers_formatter]

注:[logger_root],为root logger专用

D:/log.conf文件如下:

[loggers]

keys=root,eg01,eg02

[logger_root]

level=NOTSET

handlers=handler01, handler02

[logger_eg01]

handlers=handler01

qualname=eg01

propagate=0

[logger_eg02]

handlers=handler02

qualname=eg02

propagate=0

[handlers]

keys=handler01,handler02

[handler_handler01]

class=StreamHandler

level=WARNING

formatter=form01

args=(sys.stdout,)

[handler_handler02]

class=FileHandler

level=ERROR

formatter=form02

args=('d:/logs.txt', 'a')

[formatters]

keys=form01,form02

[formatter_form01]

format=%(name)s: %(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s

datefmt=%a, %d %b %Y %H:%M:%S

[formatter_form02]

format=%(name)-12s: %(levelname)-8s %(message)s

datefmt=

例:

import logging

import logging.config

logging.config.fileConfig('D:/log.conf')

logger = logging.getLogger('')

logging.debug('this is a debug level message')

logging.info('this is info level message')

logging.warning('this is warning level message')

logging.error('this is error level message')

logging.critical('this is critical level message')

运行结果

控制台输出:

>>> ================================ RESTART ================================

>>>

root: (asctime)s test2.py[line:9] WARNING this is warning level message

root: (asctime)s test2.py[line:10] ERROR this is error level message

root: (asctime)s test2.py[line:11] CRITICAL this is critical level message

>>>

说明:输出由handler_handler01 的level=WARNING控制

d:\logs.txt输出

root        : ERROR    this is error level message

root        : CRITICAL this is critical level message

说明:输出由handler_handler012的level=ERROR控制

修改logger_root结点下的level为DEBUG,如下

[logger_root]

level=DEBUG

执行后发现,输出结果不变

说明:

1. 如果设置日志级别为NOTSET,意味着所有消息都会被记录

2. propagete=0,表示输出日志,但消息不传递;propagate=1是输出日志,同时消息往更高级别的地方传递。若上面配置文件参数progagate=1,那么将会看到重复的消息记录

3.qualname指定logger的名称

4. class指定handler的类型

5.args根据class的不同而不同,即handler类型的初始化参数,详情可参考官方logging.config模块

对比实验1

修改logger_root结点下的level为NOTSET,修改 logger = logging.getLogger('')为:

logger = logging.getLogger('eg01'),,再次运行,查看输出结果:

控制台输出:

>>> ================================ RESTART ================================

>>>

eg01: (asctime)s test2.py[line:9] WARNING this is warning level message

eg01: (asctime)s test2.py[line:10] ERROR this is error level message

eg01: (asctime)s test2.py[line:11] CRITICAL this is critical level message

>>>

说明:输出由handler_handler01 的level=WARNING控制

d:\logs.txt为空

对比实验2

修改logger_root结点下的level为NOTSET,修改 logger = logging.getLogger('eg01')为:

logger = logging.getLogger('eg02'),,再次运行,查看输出结果:

控制台无输出

d:\logs.txt

eg02        : ERROR    this is error level message

eg02        : CRITICAL this is critical level message

说明:输出由handler_handler012的level=ERROR控制

对比实验3

 

修改logger_eg01结点,增加level为DEBUG,修改 logger = logging.getLogger(' eg02')为:

logger = logging.getLogger('eg01'),,再次运行,查看输出结果:

[logger_eg01]

level=DEBUG

结果,和没增加level时一样。

说明:当[logger_logname]和[handler_handlername]中同时指定了level值时,使用[handler_handlername]中设置的level。

对比实验4

在以上基础上,去掉[handler_handler01]中的level=WARNING,,同时,修改[logger_root]结点下

level=NOTSET为level=INFO,,再次运行

控制台输出:

>>> ================================ RESTART ================================

>>>

eg01: (asctime)s test2.py[line:7] DEBUG this is a debug level message

eg01: (asctime)s test2.py[line:8] INFO this is info level message

eg01: (asctime)s test2.py[line:9] WARNING this is warning level message

eg01: (asctime)s test2.py[line:10] ERROR this is error level message

eg01: (asctime)s test2.py[line:11] CRITICAL this is critical level message

说明:当[logger_logname]中设置了level,而[handler_handlername]未指定level值时,使用[handler_ logname]中设置的level

对比实验5

在以上基础上,去掉[logger_eg01]中的level=WARNING,,再次运行,查看结果

控制台输出:

>>> ================================ RESTART ================================

>>>

eg01: (asctime)s test2.py[line:8] INFO this is info level message

eg01: (asctime)s test2.py[line:9] WARNING this is warning level message

eg01: (asctime)s test2.py[line:10] ERROR this is error level message

eg01: (asctime)s test2.py[line:11] CRITICAL this is critical level message

说明:当[logger_logname]和[handler_handlername]都未指定level值时,使用[handler_root]中设置的level,如果[handler_root]未指定level则默认level为WARNING

对比实验6

修改[logger_eg02]结点handlers为:handlers=handler02,handler01,修改logger = logging.getLogger('eg01')为logger = logging.getLogger('eg02'),再次运行,查看结果

控制台输出:

>>> ================================ RESTART ================================

>>>

eg02: (asctime)s test2.py[line:8] INFO this is info level message

eg02: (asctime)s test2.py[line:9] WARNING this is warning level message

eg02: (asctime)s test2.py[line:10] ERROR this is error level message

eg02: (asctime)s test2.py[line:11] CRITICAL this is critical level message

>>>

d:/logs.txt输出:

eg02        : ERROR    this is error level message

eg02        : CRITICAL this is critical level message

说明:可在一个[logger_logname]结点中指定多个handlername以支持多个处理器

对比实验6

修改[handler_handler01]结点中args=(sys.stdout,)为args=(sys.stderr,), 运行后发现:控制台输出的记录都变成红色,类似如下:

>>> ================================ RESTART ================================

>>>

eg02: (asctime)s test2.py[line:8] INFO this is info level message

eg02: (asctime)s test2.py[line:9] WARNING this is warning level message

eg02: (asctime)s test2.py[line:10] ERROR this is error level message

eg02: (asctime)s test2.py[line:11] CRITICAL this is critical level message

>>>

注:上述本该显示时间的地方都显示为(asctime)s了,原因是format (astime)s前漏了%,修正如下:

format=%(name)s: %(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s

参考网络文章:

http://www.cnblogs.com/dkblog/archive/2011/08/26/2155018.html

python 日志打印之logging使用介绍的更多相关文章

  1. Python 日志打印之logging.config.dictConfig使用总结

    日志打印之logging.config.dictConfig使用总结 By:授客 QQ:1033553122 #实践环境 WIN 10 Python 3.6.5 #函数说明 logging.confi ...

  2. Python 日志打印之logging.getLogger源码分析

    日志打印之logging.getLogger源码分析 By:授客 QQ:1033553122 #实践环境 WIN 10 Python 3.6.5 #函数说明 logging.getLogger(nam ...

  3. python(36):python日志打印,保存,logging模块学习

    1.简单的将日志打印到屏幕 import logging logging.debug('This is debug message') logging.info('This is info messa ...

  4. Python 日志打印之自定义logger handler

    日志打印之自定义logger handler By:授客 QQ:1033553122 #实践环境 WIN 10 Python 3.6.5 #实践代码 handler.py #!/usr/bin/env ...

  5. Python——日志模块(logging)

    一.日志说明 日志是跟踪软件运行时所发生的事件的一种方法.软件开发者在代码中调用日志函数,表明发生了特定的事件.事件由描述性消息描述,该描述性消息可以可选地包含可变数据(即,对于事件的每次出现都潜在地 ...

  6. 『无为则无心』Python日志 — 67、logging日志模块处理流程

    目录 1.概括理解 2.详细说明 3.应用示例 1.概括理解 了解了四大组件的基本定义之后,我们通过图示的方式来理解下信息的传递过程: 也就是获取的日志信息,进入到Logger日志器中,传递给处理器确 ...

  7. Python日志记录(logging)

    import logging logfile = 'e:\\a.txt' # logging.basicConfig(filename=logfile,level=logging.INFO) # lo ...

  8. python 项目实战之logging日志打印

    官网介绍:https://docs.python.org/2/library/logging.html 一. 基础使用 1.1 logging使用场景 日志是什么?这个不用多解释.百分之九十的程序都需 ...

  9. python 以单例模式封装logging相关api实现日志打印类

    python 以单例模式封装logging相关api实现日志打印类   by:授客QQ:1033553122 测试环境: Python版本:Python 2.7   实现功能: 支持自由配置,如下lo ...

随机推荐

  1. C# 多线程五之Task(任务)一

    1.简介 为什么MS要推出Task,而不推Thread和ThreadPool,以下是我的见解: (1).Thread的Api并不靠谱,甚至MS自己都不推荐,原因,它将整个Thread类都不开放给Win ...

  2. 全网最详细的Sublime Text 3的设置字体及字体大小(图文详解)

    不多说,直接上干货! 前期博客 全网最详细的Windows里下载与安装Sublime Text *(图文详解) 全网最详细的Sublime Text 3的激活(图文详解) 你也许是如下的版本:   点 ...

  3. jdk8-lambda-stream的使用

    1, 认识stream(声明式编程) Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator, 原始版本的Iterator,用户只能一个一 ...

  4. paxos协议

    两将军问题 有两支军队,它们分别有一位将军领导,现在准备攻击一座修筑了防御工事的城市. 这两支军队都驻扎在那座城市的附近,分占一座山头. 一道山谷把两座山分隔开来,并且两位将军唯一的通信方式就是派各自 ...

  5. tsung压力测试——安装

    在安装之前确保安装了以下工具: erlang 必须要有安装java环境,要不然不成功 yum install gcc yum install gcc-c++ yum install libtool y ...

  6. Linux的僵尸进程及其解决方法

    1. 产生原因: 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程.通过ps命令查看其带有defunct的标志.僵尸进程是一个 ...

  7. java web 答辩总结

    今天我们组答辩.在昨天前三个组答辩之后,整理了一些试题. 在这个项目的答辩准备:首先把这个java web这本书大概的看了一遍:对整理的那些试题也把答案整理出来了:针对老师提问频率较高的试题:针对自己 ...

  8. SOA,Webservice,SOAP,REST,RPC,RMI的区别与联系

    SOA,Webservice,SOAP,REST,RPC,RMI的区别与联系 SOA面向服务的软件架构(Service Oriented Architecture) 是一种计算机软件的设计模式,主要应 ...

  9. Deep learning with Python 学习笔记(2)

    本节介绍基于Keras的CNN 卷积神经网络接收形状为 (image_height, image_width, image_channels)的输入张量(不包括批量维度),宽度和高度两个维度的尺寸通常 ...

  10. JVM学习记录-线程安全与锁优化(二)

    前言 高效并发是程序员们写代码时一直所追求的,HotSpot虚拟机开发团队也为此付出了很多努力,为了在线程之间更高效地共享数据,以及解决竞争问题,HotSpot开发团队做出了各种锁的优化技术常见的有: ...