一、快速入门
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 |
|
写入一个文件里面:
#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)