本文将介绍一个十分优雅、简洁的日志记录第三方库—— loguru
环境依赖
pip install loguru
基本使用,有debug/info/waring/error,有不同的颜色,有意思
from loguru import logger
logger.debug('This is debug information')
logger.info('This is info information')
logger.warning('This is warn information')
logger.error('This is error information')
基础语法
add(sink, *, level='DEBUG', format='<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>', filter=None, colorize=None, serialize=False, backtrace=True, diagnose=True, enqueue=False, catch=True, **kwargs)
参数说明:
serialize:在发送到 sink 之前,是否应首先将记录的消息转换为 JSON 字符串。
rotation:一种条件,指示何时应关闭当前记录的文件并开始新的文件。
**retention **:过滤旧文件的指令,在循环或程序结束期间会删除旧文件。
**retention **:过滤旧文件的指令,在循环或程序结束期间会删除旧文件。
mode:内置 open() 函数的打开模式,默认为 a(以追加模式打开文件)。
loguru 配置日志文件,loguru直接通过 add() 方法,日志的最低的日志级别是ERROR
from loguru import logger
logger.add("E:/PythonCode/MOC/log_2021-3-28.log", level='ERROR',rotation="500MB", encoding="utf-8", enqueue=True, retention="10 days",compression='zip')
logger.info('This is info information')
基本的创建日志,就会自动累加时间戳
loguru日志常用参数配置解析
1. rotation:分隔日志文件,何时关闭当前日志文件并启动一个新文件的条件,;例如,“500 MB”、“0.5 GB”、“1 month 2 weeks”、“10h”、“monthly”、“18:00”、“sunday”、“monday at 18:00”、“06:15”
2. retention (str, int, datetime.timedelta or callable, optional) ,可配置旧日志的最长保留时间,例如,“1 week, 3 days”、“2 months”
3. compression (str or callable, optional) :日志文件在关闭时应转换为的压缩或归档格式,例如,“gz”、“bz2”、“xz”、“lzma”、“tar”、“tar.gz”、“tar.bz2”、“tar.xz”、“zip”
retention 配置日志保留机制
1.设置日志文件最长保留 7 天,如下:
from loguru import logger
trace = logger.add('2021-3-28.log', retention='7 days')
2.rotation 配置日志滚动记录的机制
每 200MB 创建一个日志文件,避免每个 log 文件过大
from loguru import logger
trace = logger.add('2021-3-28.log', rotation="200 MB")
#每天6点 创建一个日志文件
from loguru import logger
trace = logger.add('2021-3-28.log', rotation='06:00')
#每隔1周创建一个 日志文件
from loguru import logger
trace = logger.add('2021-3-28.log', rotation='1 week')
3.compression 配置日志压缩格式,其格式支持:gz、bz2、xz、lzma、tar、tar.gz、tar.bz2、tar.xz
from loguru import logger
trace = logger.add('2021-3-28.log', compression='zip')
设置日志文件最多保留 10 个:
logger.add('runtime_{time}.log', retention=10)
设置日志文件最多保留 5 个小时:
import datetime
from loguru import logger
logger.add('runtime_{time}.log', retention=datetime.timedelta(hours=5))
异常追溯#
from loguru import logger
@logger.catch
def my_function(x, y, z):
# An error? It's caught anyway!
return 1 / (x + y + z)
my_function(0, 0, 0)
举例说明:
#!/usr/bin/python3
# -*- coding:utf-8 -*-
"""
@author: fly
@file: goings.py
@time: 2021/11/26 16:52
@contact: 280135197@qq.com
@desc:
"""
import time
import requests
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_JOB_ERROR
import datetime
# import logging
#
# logging.basicConfig(level=logging.INFO,
# format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
# datefmt='%Y-%m-%d %H:%M:%S',
# filename='going.log',
# filemode='a')
from loguru import logger
logger.add("goings.log", level='INFO',rotation="1MB", encoding="utf-8", enqueue=True, retention="2 days")
logger.info("开始了哦")
def url_push(urls):
print(f"当前进行中的赛事有{len(urls)}场")
print(urls[-1])
logger.info(f"当前进行中的赛事有{len(urls)}场")
logger.info(f'{time.strftime("%Y-%m-%d %H:%M:%S")}, {urls}')
url = 'http://127.0.0.1:5001/pturls'
data = {"urls": urls}
response = requests.post(url, json=data)
print(response.text)
logger.info(response.text)
def Up_ongoing():
urls = []
sport_ids = [1, 2, 3]
for i in sport_ids:
url = "http://47.115.7.4:9902/business/all_game/ongoing_data_py"
result = requests.post(url, json={"sportId": i}).json()
matchId = result.get('data')
for mid in matchId:
upurl = f"https://api-c3.aiscore.com/v1/app/match/summary?match_id={mid}&lang=1"
urls.append(upurl)
url_push(urls)
def my_listener(event):
if event.exception:
print('任务出错了!!!!!!')
else:
print('任务照常运行...')
scheduler = BlockingScheduler(timezone='Asia/Shanghai')
scheduler.add_job(func=Up_ongoing, trigger='interval', minutes=5, id='interval_task')
scheduler.add_listener(my_listener, EVENT_JOB_EXECUTED | EVENT_JOB_ERROR)
scheduler._logger = logger
scheduler.start()