Python 模块学习 logging

一、快速入门

1、基础知识

派出:

控制台输出:print()

报告事件,发生在一个程序的正常运行:logging.info()或logging.debug()

发出警告关于一个特定的运行时事件:warnings.warn()或logging.warning()

报告一个错误对于一个特定的运行时事件:异常处理

报告一个错误当没有引发一个异常:logging.error()、logging.exception()或logging.critical()

级别:

DEBUG:详细的信息,通常只出现在诊断问题上

INFO:确认一切按预期运行

WARNING:一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”)。这个软件还能按预期工作。

ERROR:个更严重的问题,软件没能执行一些功能

CRITICAL:一个严重的错误,这表明程序本身可能无法继续运行

日志一共分成5个等级,从低到高分别是:DEBUG INFO WARNING ERROR CRITICAL。这5个等级,也分别对应5种打日志的方法: debug 、info 、warning 、error 、critical。默认的是WARNING,当在WARNING或之上时才被跟踪。有两种方式记录跟踪,一种输出控制台,另一种是记录到文件中,如日志文件。

2、最简单的使用日志的方法:

(1) 设置logging.basic.Config

(2)使用logging.debug()、logging.info()、logging.warning()、logging.error()、logging.critical()输出相关日志


1

2

3

import
logging

logging.warning(‘error‘)   #在控制台输出WARNING:root:error

logging.info(‘msg‘)        #没有输出,因为默认级别是 WARNING,INFO小于此级别

写入一个文件里面:

#Logging to a file
import os
import logging
FILE = os.getcwd()
logging.basicConfig(filename=os.path.join(FILE,‘log.txt‘),level=logging.DEBUG)
logging.debug(‘写进去‘)
logging.info(‘滚进去‘)
logging.warning(‘也滚进去‘)

运行之后,打开该文件,效果如下:

3、被调用模块中的日志使用,也遵从调用模块中的日志配置

#log1.py

import logging
def lo():
    logging.info(‘log1--‘)

#log2.py

import logging
import os
FILE = os.getcwd()
import log1

def main():
    logging.basicConfig(filename=os.path.join(FILE,‘log.txt‘),level=logging.INFO)
    logging.info(‘start--‘)
    log1.lo()
    logging.info(‘end--‘)

if __name__ == ‘__main__‘:
    main()

运行后打开log.txt,结果如下:

INFO:root:start--

INFO:root:log1--

INFO:root:end--

4、日志消息内容可采用格式化输出

logging.warning(‘name:%s msg:%s‘,‘BeginMan‘,‘Hi‘)               #方式一
logging.warning(‘name:%s msg:%s‘ %(‘BeginMan‘,‘Hi‘))            #方式二
logging.warning(‘name:{0} msg:{1}‘.format(‘BeginMan‘,‘Hi‘))     #方式三
from string import Template                                     #方式四
msg = Template(‘name:$who msg:$what‘)
logging.warning(msg.substitute(who=‘BeginMan‘,what=‘Hi‘))

5、日志总体格式定义

指定自己所需的格式,如下:

logging.basicConfig(format=‘%(levelname)s:%(message)s‘)
logging.warning(‘msg‘)      #WARNING:msg
logging.basicConfig(format=‘Hi,试试这个:%(asctime)s:%(message)s‘)
logging.warning(‘msg‘)      #Hi,试试这个:2013-09-22 14:25:21,936:msg
logging.basicConfig(format=‘%(asctime)s:%(message)s‘,datefmt=‘%m/%d/%Y %I:%M:%S %p‘)
logging.warning(‘msg‘)      #09/22/2013 02:28:14 PM:msg

format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示:

%(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: 打印日志信息

logging.basicConfig(level=logging.DEBUG,
                    format=‘%(asctime)s:%(filename)s[line:%(lineno)d] %(levelname)s %(message)s‘,
                    datefmt=‘%a, %d %b %Y %H:%M:%S‘,
                    filename = os.path.join(FILE,‘log.txt‘),
                    filemode=‘w‘)
logging.info(‘msg‘)
logging.debug(‘msg2‘)

打开文件显示如下:

Sun, 22 Sep 2013 15:23:13:log1.py[line:41] INFO msg

Sun, 22 Sep 2013 15:23:13:log1.py[line:42] DEBUG msg2

二、高级进阶

1、logging.basicConfig([**kwargs]):

Does basic configuration for the logging system by creating aStreamHandler with a defaultFormatter and adding it to the root
logger. The functionsdebug(),
info()
, warning(),
error()
and critical() will callbasicConfig() automatically if no handlers are defined for the root logger.

This function does nothing if the root logger already has handlers configured for it.

为日志模块配置基本信息。kwargs 支持如下几个关键字参数:

filename :日志文件的保存路径。如果配置了些参数,将自动创建一个FileHandler作为Handler;

filemode :日志文件的打开模式。 默认值为‘a‘,表示日志消息以追加的形式添加到日志文件中。如果设为‘w‘, 那么每次程序启动的时候都会创建一个新的日志文件;

format :设置日志输出格式;

datefmt :定义日期格式;

level :设置日志的级别.对低于该级别的日志消息将被忽略;

stream :设置特定的流用于初始化StreamHandler;

演示如下:

import logging
import os
FILE=os.getcwd()

logging.basicConfig(level=logging.DEBUG,
                    format=‘%(asctime)s:%(filename)s[line:%(lineno)d] %(levelname)s %(message)s‘,
                    datefmt=‘%a, %d %b %Y %H:%M:%S‘,
                    filename = os.path.join(FILE,‘log.txt‘),
                    filemode=‘w‘)
logging.info(‘msg‘)
logging.debug(‘msg2‘)

2、logging.getLogger([name])

创建Logger对象。日志记录的工作主要由Logger对象来完成。在调用getLogger时要提供Logger的名称(注:多次使用相同名称 来调用getLogger,返回的是同一个对象的引用。),Logger实例之间有层次关系,这些关系通过Logger名称来体现,如:

p = logging.getLogger("root")

c1 = logging.getLogger("root.c1")

c2 = logging.getLogger("root.c2")

例子中,p是父logger, c1,c2分别是p的子logger。c1, c2将继承p的设置。如果省略了name参数, getLogger将返回日志对象层次关系中的根Logger。

import logging
‘‘‘命名‘‘‘
log2=logging.getLogger(‘BeginMan‘)  #生成一个日志对象
print log2  #<logging.Logger object at 0x00000000026D1710>

‘‘‘无名‘‘‘
log3 = logging.getLogger()
print log3  #<logging.RootLogger object at 0x0000000002721630> 如果没有指定name,则返回RootLogger

‘‘‘最好的方式‘‘‘
log = logging.getLogger(__name__)#__name__ is the module’s name in the Python package namespace.
print log   #<logging.Logger object at 0x0000000001CD5518>  Logger对象
print __name__  #__main__

3、logging.disable(level)

其作用是禁用所有日志(当其级别在给定级及以下),暂时截流日志输出

logging.disable(logging.WARNING)#提供一个覆盖所有优先于日志级别的级别
logging.warn(‘msg‘)     #没有输出
logging.critical(‘msg‘) #CRITICAL:msg

撤销的话,就使用logging.disable(level)或logging.disable(logging.NOSET)

4、logging.addLevelName(lel,levelname)

增加自定义的logging level,并起名。

logging.addLevelName(88,‘myLevelName‘)
logging.log(88, ‘自定义设置级别‘)  #myLevelName:root:自定义设置级别

级别是整数,系统设置如下:

5、logging.getLevelName(lvl)

返回的文本表示的日志级别

logging.addLevelName(88,‘myLevelName‘)
logging.log(88, ‘自定义设置级别‘)             #myLevelName:root:自定义设置级别
print logging.getLevelName(88)              #myLevelName
print logging.getLevelName(logging.INFO)    #INFO

三、Logger对象

通过logging.getLogger(nam)来获取Logger对象,

Class logging.Logger

有如下属性和方法:

1、Logger.propagate

print log.propagate         #1

具体参考:http://docs.python.org/2.7/library/logging.html

2、Logger.setLevel(lvl)

设置日志的级别。对于低于该级别的日志消息将被忽略.

import logging
import os
logging.basicConfig(format="%(levelname)s,%(message)s",filename=os.path.join(os.getcwd(),‘log.txt‘),level=logging.DEBUG)
log = logging.getLogger(‘root.set‘)   #Logger对象
print log.propagate         #1
log.setLevel(logging.WARN)  #日志记录级别为WARNNING
log.info(‘msg‘)             #不会被记录
log.debug(‘msg‘)            #不会被记录
log.warning(‘msg‘)
log.error(‘msg‘)

3、Logger.debug(msg
[ ,*args [, **kwargs]])

记录DEBUG级别的日志信息。参数msg是信息的格式,args与kwargs分别是格式参数。

import logging
logging.basicConfig(filename = os.path.join(os.getcwd(), ‘log.txt‘), level = logging.DEBUG)
log = logging.getLogger(‘root‘)
log.debug(‘%s, %s, %s‘, *(‘error‘, ‘debug‘, ‘info‘))
log.debug(‘%(module)s, %(info)s‘, {‘module‘: ‘log‘, ‘info‘: ‘error‘})

4、同上

Logger.info(msg[ , *args[ , **kwargs] ] )

Logger.warnning(msg[ , *args[ , **kwargs] ] )

Logger.error(msg[ , *args[ , **kwargs] ] )

Logger.critical(msg[ , *args[ , **kwargs] ] )

5、Logger.log(lvl, msg[ , *args[ , **kwargs]] )

记录日志,参数lvl用户设置日志信息的级别。参数msg, *args, **kwargs的含义与Logger.debug一样。

log.log(logging.ERROR,‘%(module)s %(info)s‘,{‘module‘:‘log日志‘,‘info‘:‘error‘}) #ERROR,log日志 error
log.log(logging.ERROR,‘再来一遍:%s,%s‘,*(‘log日志‘,‘error‘))  #ERROR,再来一遍:log日志,error

6、Logger.exception(msg[, *args])

以ERROR级别记录日志消息,异常跟踪信息将被自动添加到日志消息里。Logger.exception通过用在异常处理块中,如:

import logging
import os
logging.basicConfig(format="%(levelname)s,%(message)s",filename=os.path.join(os.getcwd(),‘log.txt‘),level=logging.DEBUG)
log = logging.getLogger(‘root‘)   #Logger对象
try:
    raise Exception,u‘错误异常‘
except:
    log.exception(‘exception‘)  #异常信息被自动添加到日志消息中
打开文件,显示如下:

‘‘‘ERROR,exception
Traceback (most recent call last):
  File "E:\project\py\src\log3.py", line 12, in <module>
    raise Exception,u‘错误异常‘
Exception: 错误异常
‘‘‘

四、logging的控制器

logging控制器的作用: 分类处理不同级别的日志,比如,

所有级别的日志我们都输出到日志文件中,采用格式1保存

error级别以上的日志我们都实时输出,输出格式采用格式2

对于critical级别的日志我们同时也要通过发送email通知管理者。

那我们就可以定义三种不同的控制器,对三种情况进行不同的处理,对于第一种情况,我们有FileHandler即可,第二种情况要使用StreamHandler, 而第三种情况,我们就需要自定义控制器。

loggiing的控制器有三类: StreamHandler、FileHandler、NullHandler

StreamHandler:发送日志输出流如: sys.stdout

FileHandler:发送日志输出到磁盘文件,格式:

debugging.FileHandler(filename, mode=‘a‘, encoding=None, delay=False )

返回一个FileHandler类的实例,如果存在延时(delay=True),那么,文件打开推迟到第一次调用emit()

它有如下方法:

.emit(record)  ---输出文件的记录

.close()   关闭文件

实例:

import socket, logging

import select, errno

logger = logging.getLogger("network-server")

def InitLog():

logger.setLevel(logging.DEBUG)

fh = logging.FileHandler("network-server.log")

fh.setLevel(logging.DEBUG)

ch = logging.StreamHandler()

ch.setLevel(logging.ERROR)

formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")

ch.setFormatter(formatter)

fh.setFormatter(formatter)

logger.addHandler(fh)

logger.addHandler(ch)

时间: 2024-11-06 19:04:50

Python 模块学习 logging的相关文章

python模块学习 logging

1.简单的将日志打印到屏幕 import logging logging.debug('This is debug message') logging.info('This is info message') logging.warning('This is warning message') 屏幕上打印: WARNING:root:This is warning message 默认情况下,logging将日志打印到屏幕,日志级别为WARNING:日志级别大小关系为:CRITICAL > ER

python模块学习(2)——re模块

正则表达式并不是python的一部分,正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大.得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同:但不用担心,不被支持的语法通常是不常用的部分.如果已经在其他语言里使用过正则表达式,只需要简单看一看就可以上手了. 下图展示了使用正则表达式进行匹配的流程:  正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符

Python模块学习之logging

logging模块是在2.3新引进的功能,下面是一些常用的类和模块级函数 模块级函数 logging.getLogger([name]):返回一个logger对象,如果没有指定名字将返回root logger logging.debug().logging.info().logging.warning().logging.error().logging.critical():设定root logger的日志级别 logging.basicConfig():用默认Formatter为日志系统建立一

Python 模块学习

模块学习: http://wsyht90.blog.51cto.com/9014030/1845737 1.getpass 2.os 3.sys 4.subprocess 5.hashlib 6.json 7.pickle 8.shutil 9.time 10.datetime 11.re 12.random 13.configparser 14.traceback 15.yaml 16.itertools 17.logging 18.urllib.urllib2 19.paramiko ###

python模块学习第 0000 题

将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果. 类似于图中效果: 好可爱>%<! 题目来源:https://github.com/Yixiaohan/show-me-the-code,感谢@史江歌以及其他人,让我找到了一个系统的学习python模块的好地方. 看到这个题目的第一印象是——额,难不成让我找qq的API,然后在手机APP的壁纸上提示QQ消息?好吧,我承认自己想复杂了,所以第二个想法就来了.因为博主最近学习比较杂乱无章,所以学习了tkin

Python 模块之Logging——常用handlers的使用

一.StreamHandler 流handler--包含在logging模块中的三个handler之一. 能够将日志信息输出到sys.stdout, sys.stderr 或者类文件对象(更确切点,就是能够支持write()和flush()方法的对象). 只有一个参数: class logging.StreamHandler(stream=None) 日志信息会输出到指定的stream中,如果stream为空则默认输出到sys.stderr. 二.FileHandler logging模块自带的

Python模块学习

python模块-time python模块-datetime

python模块之logging

在现实生活中,记录日志非常重要.银行转账时会有转账记录:飞机飞行过程中,会有黑盒子(飞行数据记录器)记录飞行过程中的一切.如果有出现什么问题,人们可以通过日志数据来搞清楚到底发生了什么.对于系统开发.调试以及运行,记录日志都是同样的重要.如果没有日志记录,程序崩溃时你几乎就没办法弄明白到底发生了什么事情.举个例子,当你在写一个服务器程序时,记录日志是非常有必要的.下面展示的就是 EZComet.com 服务器的日志文件截图. 服务崩溃后,如果没有日志,我几乎没办法知道到底发生了错误.日志不仅对于

python模块学习之数据结构--collections.counter

python包含非常多的标准数据结构,如list,tuple,dict 和set 都是内置类型.除了这些基本的内置类型.python的collections模块还很多种数据结构实现. collections----容器数据类型模块 python版本:2.6以及以后版本 collections模块包含除内置內型list,dict 和tuple之外的数据类型. 1.1 Counter 1.1.1 Counter作为一个容器(啥是容器呢,能装入不同的对象就是容器),可以跟踪相同数据的次数. 初始化输入