一、Log:之前写了一篇python log模块的笔记,但是写了又忘记,回头去看又蒙圈。最近在写项目,于是又复习回顾了一遍,更加的系统:
※整体来说,遵循以下几个步骤,就不混乱了:
- 创建日志器logger = logging.getLogger(),初始化
- 创建控制台处理器StreamHandler
- 定义格式器处理器,包括终端打印&写入文件时候的格式,为全局格式
- 将日志器logger放到控制台处理器
- 将格式器放到控制台处理器
※一定遵循创建了handler,就添加一次formatter和handler,以免混乱
代码如下:
import logging
import os
from logging.handlers import TimedRotatingFileHandler
log_path = os.path.dirname(os.path.abspath('.')) + "\\logs\\"
# file_info_name = os.path.join(log_path, "info", "info.log")
# print(file_info_name)
class Logger(object):
# 初始化,am可以不填写
logger = logging.getLogger("am")
# 清除logger,避免多个文件引用重复打印log
logger.handlers.clear()
# 设置log等级
logger.setLevel(logging.DEBUG)
backup_count = 5
formatter = logging.Formatter('[%(asctime)s %(filename)s line:%(lineno)d] %(levelname)s: %(message)s')
# 设置控制台
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# 给handler添加formatter
console_handler.setFormatter(formatter)
# 给logger添加handler
logger.addHandler(console_handler)
# 文件--Info
file_info_name = os.path.join(log_path, "info", "info.log")
file_info_handler = logging.handlers.TimedRotatingFileHandler(filename=file_info_name, when='D',
interval=1, backupCount=backup_count,
encoding='utf-8')
file_info_handler.setLevel(logging.INFO)
# 给handler添加formatter
file_info_handler.setFormatter(formatter)
# 给logger添加handler
logger.addHandler(file_info_handler)
# 文件--Error
file_error_name = os.path.join(log_path, "error", "error.log")
file_error_handler = logging.handlers.TimedRotatingFileHandler(filename=file_error_name, when='D',
interval=1, backupCount=backup_count,
encoding='utf-8')
file_error_handler.setLevel(logging.ERROR)
file_error_handler.setFormatter(formatter)
logger.addHandler(file_error_handler)
def info(self, msg, *args, **kwargs):
self.logger.info(msg, *args, **kwargs)
def error(self, msg, *args, **kwargs):
self.logger.error(msg, *args, **kwargs)
def warning(self, msg, *args, **kwargs):
self.logger.warning(msg, *args, **kwargs)
def exception(self, msg, *args, exc_info=True, **kwargs):
self.logger.exception(msg, *args, exc_info, **kwargs)
PS:虽然上面写了不同等级输出文件不同,但是info文件里的日志最全,包含更高等级的日志内容
二、loguru:log模块使用起来要做很多操作,而loguru就使日志更加的简单优美
from loguru import logger
# 使用装饰器,方便在配置不完善的情况下记录traceback
@logger.catch()
def test(x, y, z):
"""
rotation:{time}.log可以生成标准时间,可以设置大小rotation = 500 MB
每天0点生成一个log文件:rotation = ”00:00“
一周生成一个文件:rotation = ”1 week“
retention:代表日志文件最长保留多少天:10 days,1 week,2 months
:return:
"""
# trace = logger.add('runtime_{time}.log', rotation="500 MB")
# {time}.log可以根据格式化的时间命名日志文件
# logger.add('runtime_{time}.log', rotation="500 MB", retention="10 days")
logger.add('loguru.log', rotation="500 MB", retention="10 days")
logger.info('I love u very much')
# logger.remove(xx),可以删除日志不写入日志文件
# logger.remove(trace)
logger.debug('this is another debug message')
# 字符串格式化输出
logger.error('If you are using Python {}, prefer {feature} of course!', 3.7, feature='f-string')
return 1 / (x + y + z)
test(0, 0, 0)
输出示意图:
终端日志打印
※注意:虽然loguru简洁优美,但是小二我还没找到loguru设置日志保存时间等更多的方法介绍,大家可自行百度或官网学习
网友评论