logging:python标准日志处理库
简介logging就是针对处理日志的。日常我们都喜欢使用print函数来输出信息调试,但是有时候我们需要将这些保存在文件中,所以可以用Logging进行代替,而且还可以代替部分debug功能,给程序拍错。
logging就是针对处理日志的。日常我们都喜欢使用print函数来输出信息调试,但是有时候我们需要将这些保存在文件中,所以可以用Logging进行代替,而且还可以代替部分debug功能,给程序拍错。
logging模块6个级别:
- NOTSET:0
- DEBUG:10
- INFO:20
- WARNING:30
- ERROR:40
- CRITICAL:50
这些级别的用处就是先将自己的日志定义一个级别,logging模块会发出的信息级别高于定义的级别,将标准输出显示出来,发出的信息低于定义级别则略过。如果没有定义级别,默认的级别是WARNING。
先测试下上面的数据
import logging
print(logging.NOTSET)
print(logging.DEBUG)
print(logging.INFO)
print(logging.WARNING)
print(logging.ERROR)
print(logging.CRITICAL)
logging.debug("debug message")
logging.info("info message")
logging.warning("warning message")
logging.error("error message")
logging.critical("critical message")
输出:
0
10
20
30
40
50
WARNING:root:warning message
ERROR:root:error message
CRITICAL:root:critical message
使用logging最简单的方式就是logging.basicConfig。logging.basicConfig的应用方法为:
logging.basicConfig(**kwargs)
该函数的可用参数有:
- filename:用指定的文件名创建FiledHandler,日志会被存放到指定的文件中
- filemode:文件的打开方式,默认值为’a’还可以是’w’
- format:指定Handler使用的日志显示格式
- datefmt:日期时间格式
- level:设置日志的级别
- stream:用于指定stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时针指定了filename和stream,stream参数会被忽略
format参数用到的格式化:
- %(name)s Logger的名字
- %(levelno)s 数字形式的日志级别
- %(levelname)s 文本形式的日志级别
- %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
- %(filename)s 调用日志输出函数的模块的文件名
- %(module)s 调用日志输出函数的模块名|
- %(funcName)s 调用日志输出函数的函数名|
- %(lineno)d 调用日志输出函数的语句所在的代码行
- %(created)f 当前时间,用UNIX标准的表示时间的浮点数表示|
- %(relativeCreated)d 输出日志信息时的,自Logger创建以来的毫秒数|
- %(asctime)s 字符串形式的当前时间。默认格式是“2003-07-08 16:49:45,896”。逗号后面的是毫秒
- %(thread)d 线程ID。可能没有
- %(threadName)s 线程名。可能没有
- %(process)d 进程ID。可能没有
- %(message)s 用户输出的消息
datefmt的日期格式化,常用的格式有:
- %Y:年份的长格式,如2018
- %y:年份的短格式,如18
- %m:月份,01~12
- %d:日期,01~31
- %H:小时,0~23
- %M:分钟,00~59
- %S:秒钟,00~59
- %w:星期,0~6,星期天0
示例1
import logging
class TestLogging(object):
def __init__(self):
format = "%(asctime)-12s %(levelname)-8s %(name)-1s" #左右对齐, %±10s: 输出至少10个字符, 不够用空格补齐, +: 右对齐, -: 左对齐
filename = "./log.txt"
logging.basicConfig(filename=filename, level=logging.INFO, format=format, filemode='w')
logging.debug("debug message")
logging.info("info message")
logging.warning("warning message")
logging.error("error message")
logging.critical("critical message")
if __name__ == '__main__':
TestLogging()
运行后输出到文件log.txt
2018-07-11 20:07:09,909 INFO root
2018-07-11 20:07:09,910 WARNING root
2018-07-11 20:07:09,910 ERROR root
2018-07-11 20:07:09,910 CRITICAL root
默认的logging级别是logging.INFO,而logging.debug的级别低于loggin.INFO,所以不会显示。
示例2
自定义模块
import logging
import getpass
import sys
class MyLogging(object):
def __init__(self):
user = getpass.getuser()
self.logger = logging.getLogger(user)
self.logger.setLevel(logging.DEBUG)
logFileName = "./test.log"
format = logging.Formatter("%(asctime)-12s %(levelname)-8s %(name)-10s %(message)-12s")
#文件处理
logHand = logging.FileHandler(logFileName)
logHand.setFormatter(format)
logHand.setLevel(logging.ERROR) # 错误才会被记录到日志
#标准输出
logHandSt = logging.StreamHandler()
logHandSt.setFormatter(format)
self.logger.addHandler(logHand)
self.logger.addHandler(logHandSt)
def debug(self, msg):
self.logger.debug(msg)
def info(self, msg):
self.logger.info(msg)
def warn(self, msg):
self.logger.warning(msg)
def error(self, msg):
self.logger.error(msg)
def critical(self, msg):
self.logger.critical(msg)
if __name__ == '__main__':
mylog = MyLogging()
mylog.debug("debug message")
mylog.info("info message")
mylog.warn("warning message")
mylog.error("error message")
mylog.critical("critical message")
运行后:
#标准输出里的信息为
2018-07-11 20:23:59,369 DEBUG zhj debug message
2018-07-11 20:23:59,369 INFO zhj info message
2018-07-11 20:23:59,369 WARNING zhj warning message
2018-07-11 20:23:59,369 ERROR zhj error message
2018-07-11 20:23:59,370 CRITICAL zhj critical message
#test.log文件中的信息为
2018-07-11 20:23:59,369 ERROR zhj error message
2018-07-11 20:23:59,370 CRITICAL zhj critical message
可以将上面的这个类导入到其他里面进行使用。在全局只需要实例化一次,否则会重复打印或输出。