Python-学习之路-14 Log 日志

2019-02-27  本文已影响0人  末世狂人

log

logging模块

日志相关概念

log的作用

logging模块

logging模块级别的日志

logging.debug(msg, *args, **kwargs)     创建一条严重级别为DEBUG的日志记录
logging.info(msg, *args, **kwargs)      创建一条严重级别为INFO的日志记录
logging.warning(msg, *args, **kwargs)   创建一条严重级别为WARNING的日志记录
logging.error(msg, *args, **kwargs)     创建一条严重级别为ERROR的日志记录
logging.critical(msg, *args, **kwargs)  创建一条严重级别为CRITICAL的日志记录
logging.log(level, *args, **kwargs)     创建一条严重级别为level的日志记录
logging.basicConfig(**kwargs)           对root logger进行一次性配置
# log案例
import logging
# 方法1
logging.debug("this is a debug log")
logging.info("this is a info log")
logging.warning("this is a warning log")
logging.error("this is a error log")
logging.critical("this is a critical log")

#方法2
logging.log(logging.DEBUG,"this is a debug log")
logging.log(logging.INFO,"this is a INFO log")
logging.log(logging.WARNING,"this is a WARNING log")
logging.log(logging.ERROR,"this is a ERROR log")
logging.log(logging.CRITICAL,"this is a CRITICAL log")

WARNING:root:this is a warning log
ERROR:root:this is a error log
CRITICAL:root:this is a critical log
WARNING:root:this is a WARNING log
ERROR:root:this is a ERROR log
CRITICAL:root:this is a CRITICAL log
# log案例2

import logging

#配置log的format
LOG_FORMAT = "%(asctime)s   %(levelname)s    %(message)s"
# 将日志打印级别调整至debug 并且将日志保存在log.log文件中
logging.basicConfig(filename="testlog.log",level=logging.DEBUG,format=LOG_FORMAT)
# 方法1
logging.debug("this is a debug log")
logging.info("this is a info log")
logging.warning("this is a warning log")
logging.error("this is a error log")
logging.critical("this is a critical log")

WARNING:root:this is a warning log
ERROR:root:this is a error log
CRITICAL:root:this is a critical log

logging format

asctime     %(asctime)s     日志事件发生的时间--人类可读时间,如:2003-07-08 16:49:45,896
created     %(created)f     日志事件发生的时间--时间戳,就是当时调用time.time()函数返回的值
relativeCreated     %(relativeCreated)d     日志事件发生的时间相对于logging模块加载时间的相对毫秒数(目前还不知道干嘛用的)
msecs   %(msecs)d   日志事件发生事件的毫秒部分
levelname   %(levelname)s   该日志记录的文字形式的日志级别('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')
levelno     %(levelno)s     该日志记录的数字形式的日志级别(10, 20, 30, 40, 50)
name    %(name)s    所使用的日志器名称,默认是'root',因为默认使用的是 rootLogger
message     %(message)s     日志记录的文本内容,通过 msg % args计算得到的
pathname    %(pathname)s    调用日志记录函数的源码文件的全路径
filename    %(filename)s    pathname的文件名部分,包含文件后缀
module  %(module)s  filename的名称部分,不包含后缀
lineno  %(lineno)d  调用日志记录函数的源代码所在的行号
funcName    %(funcName)s    调用日志记录函数的函数名
process     %(process)d     进程ID
processName     %(processName)s     进程名称,Python 3.1新增
thread  %(thread)d  线程ID
threadName  %(thread)s  线程名称

四大组件

Logger

  1. 向应用程序代码暴露几个方法,使应用程序可以在运行时记录日志消息;
  2. 基于日志严重等级(默认的过滤设施)或filter对象来决定要对哪些日志进行后续处理;
  3. 将日志消息传送给所有感兴趣的日志handlers。

Handler

Formatter

Filter

    filter(record)

使用logging四大组件记录日志

  1. 需求

    1. 要求将所有级别的所有日志都写入磁盘文件中
    2. all.log文件中记录所有的日志信息,日志格式为:日期和时间 - 日志级别 - 日志信息
    3. error.log文件中单独记录error及以上级别的日志信息,日志格式为:日期和时间 - 日志级别 - 文件名[:行号] - 日志信息
    4. 要求all.log在每天凌晨进行日志切割
  2. 分析

    1. 要记录所有级别的日志,因此日志器的有效level需要设置为最低级别--DEBUG;
    2. 日志需要被发送到两个不同的目的地,因此需要为日志器设置两个handler;另外,两个目的地都是磁盘文件,因此这两个handler都是与FileHandler相关的;
    3. all.log要求按照时间进行日志切割,因此他需要用logging.handlers.TimedRotatingFileHandler; 而error.log没有要求日志切割,因此可以使用FileHandler;
    4. 两个日志文件的格式不同,因此需要对这两个handler分别设置格式器;
import logging
import logging.handlers
import datetime

logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)

rf_handler = logging.handlers.TimedRotatingFileHandler('all.log', when='midnight', interval=1, backupCount=7, atTime=datetime.time(0, 0, 0, 0))
rf_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))

f_handler = logging.FileHandler('error.log')
f_handler.setLevel(logging.ERROR)
f_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s[:%(lineno)d] - %(message)s"))

logger.addHandler(rf_handler)
logger.addHandler(f_handler)

logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')
上一篇下一篇

猜你喜欢

热点阅读