logging的主要作用有2个:
1.代替print,可以把大部分你想要进行调试的信息打印出来或者输出到指定文件.
2.可以对输出的调试信息做分类输出,比如:
DEBUG,INFO,WARNING,ERROR,CRITICAL.
完整的日志包含收集和输出,默认只收集和输出warnning以上的级别
为解决这个问题我们需要自定义收集级别和输出级别:
formate格式:%(asctime)s-%(levelname)s-%(filename)s-%(name)s-日志信息:%(message)s
%(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 | 用户输出的消息 |
结果:控制台输出:
文件输出:
优化为工具类:
import logging
class Mylog:
def my_logger(self,level,msg):
# 定义一个收集器
my_logger = logging.getLogger("pythonStudy")
# 设置级别
my_logger.setLevel("DEBUG")
# 设置输出格式信息
formater = logging.Formatter("%(asctime)s-%(levelname)s-%(filename)s-%(name)s-日志信息:%(message)s")
# 创建一个输出渠道:控制台
outLog = logging.StreamHandler()
# 设置级别
outLog.setLevel("ERROR")
outLog.setFormatter(formater)
# 创建一个输出渠道:文件,文件自动创建
outfile = logging.FileHandler("myLogFile", encoding="utf-8")
outfile.setLevel("DEBUG")
outfile.setFormatter(formater)
# 两者对接
my_logger.addHandler(outLog)
my_logger.addHandler(outfile)
if level=="DEBUG":
my_logger.debug(msg)
elif level=="INFO":
my_logger.info(msg)
elif level=="WARNING":
my_logger.warning(msg)
elif level=="ERROR":
my_logger.error(msg)
elif level=="CRITICAL":
my_logger.critical(msg)
#关闭渠道:不然会生成重复日志
my_logger.removeHandler(outLog)
my_logger.removeHandler(outfile)
#方法2:加入下面代码
# def debug(self,msg):
# self.my_logger("DEBUG",msg)
#
# def info(self, msg):
# self.my_logger("INFO",msg)
#
# def warning(self,msg):
# self.my_logger("WARNING",msg)
#
# def error(self,msg):
# self.my_logger("ERROR",msg)
#
# def critical(self,msg):
# self.my_logger("CRITICAL",msg)
if __name__ == '__main__':
#方法1:直接传入级别
Mylog().my_logger("DEBUG","我是debug方法")
Mylog().my_logger("ERROR", "我是error方法")
Mylog().my_logger("CRITICAL", "我是critical方法")
# 方法2,不传入级别
# mylog = Mylog()
# mylog.debug("这是一条debug信息")
# mylog.critical("这是一条critical信息")
# mylog.error("这是一个error信息")