Backend - 日志记录

目录

一、基础使用

1. level级别(从高到低)

2. 基本设置

3. 遇到的问题

(1)partially initialized module 'logging' has no attribute 'basicConfig' (most likely due to a circular import) 

原因:文件名为 logging.py

解决:重命名 logging.py 文件名(如my_logging.py)

二、完整应用

包括日志文件的命名、多线程执行日志、删除指定日期前的日志

1. settings.py 文件设定

2. book_log.py 文件设定

3. view 视图文件调用


一、基础使用

1. level级别(从高到低)

critical、 error、 warning、 info、 debug

2. 基本设置

import logging

logging.basicConfig(
    filename='book_logging.log',  # 日志文件(生成位置在项目根目录下),如果没有设置filename,将会默认在控制台输出
    encoding='utf-8',  # 内容能正常显示中文
    level=logging.INFO,  # 显示"该等级及以上等级"所对应的内容(默认级别是WARNING)
    format='%(asctime)s - %(name)s - [%(levelname)s] : %(message)s',  # 内容的格式,其中 asctime (log产生时间)、name (记录器实例logger名称)、 levelname (严重性)、 message (事件描述)
    # formattler 包括:'%(asctime)s、%(processName)s、%(threadName)s、%(levelname)s、%(filename)s:%(lineno)d、%(funcName)s、%(message)s'。其中,%(funcName)s 執行函數名稱, %(filename)s 執行檔案名稱。

    datefmt='%Y-%m-%d %H:%M:%S',  # 控制日期/时间格式
)
if __name__ == "__main__":
    # 以下兩種方法,都实现了记录日志
    # 第一种
    logger = logging.getLogger("mainfunc")  # getLogger是模块级记录器(日志库采用模块化方法,提供的组件:记录器、处理器、过滤器和格式器),"mainfunc"是自定义该处的日志记录名字,在logging.basicConfig的format的%(name)s的对应位置显示。
    logger.debug('debug') 
    logger.info('info')
    logger.warning('warning 这是一个警告')
    logger.error('error')
    logger.critical('critical')
    # 由于basicConfig中设定level=logging.INFO,所以只会显示INFO、WARNING、ERROR、CRITICAL等级所对应的内容(DEBUG比INFO的等级低)

    # 第二种 若不自定义名称,则可以直接logging调用。
    logging.debug('debug') 
    logging.info('info')
    logging.warning('warning 这是一个警告')
    logging.error('error')
    logging.critical('critical')

3. 遇到的问题

(1)partially initialized module 'logging' has no attribute 'basicConfig' (most likely due to a circular import) 

原因:文件名为 logging.py
解决:重命名 logging.py 文件名(如my_logging.py)

二、完整应用

包括日志文件的命名、多线程执行日志、删除指定日期前的日志

1. settings.py 文件设定

文件位置:BookProject 目录下

LOG_PATH = os.path.join(os.getcwd(), 'logs')  # 设定日志文件位置:项目名下的logs文件夹中

2. book_log.py 文件设定

文件位置:BookApp.views.tools 中

理解下方代码的时间线:-----要删除文件的所在时间范围-----mark_day节点-----暂时保留文件的所在时间-----today节点---->

import os
from BookProject.settings import LOG_PATH
from threading import Thread
import logging
import logging.handlers
import datetime
# 生成 logs 文件夹
if not os.path.exists(LOG_PATH):
    os.mkdir(LOG_PATH)
# 生成 log 文件
log_file_name=os.path.join(LOG_PATH,'{}.log'.format(str(datetime.datetime.now().strftime('%Y-%m-%d'))))  # 项目名\logs\XXXX-XX-XX.log
# log日志的基础配置
logging.basicConfig(
    handlers=[logging.handlers.TimedRotatingFileHandler(filename=log_file_name, when='D', interval=60*60*24, backupCount=2)]
    ,level=logging.DEBUG
    ,format='%(asctime)s  %(message)s'  # 日志内容的展示格式
    ,datefmt='[%Y-%m-%d %H:%M:%S]' # 日志内容的记录时间格式
    )
# 操作成功的日志记录
def info_threadjob(msg):
    logging.info(msg)
def log_success(msg):
    t1 = Thread(target=info_threadjob, args=(msg,))
    t1.start()
# 操作失败的日志记录
def err_threadjob(msg):
    logging.exception(msg)
def log_error(msg):
    t1 = Thread(target=err_threadjob, args=(msg,))
    t1.start()
# 删除几天前操作的日志文件(设置是删除一天前的)
def del_logs():
    day_len = 1 # 天数
    today = datetime.datetime.now()  # 今天时间 2023-01-28 16:29:29.206065
    prev_day = datetime.timedelta(days=-day_len)  # 前 day_len 天
    mark_day = today + prev_day  # 前day_len天的具体日期时间节点,2023-01-27 16:29:29.206065
    res_list = os.listdir(LOG_PATH)  # 日志文件位置列表
    for r in res_list: # 循环每个日志文件
        log_file = os.path.join(LOG_PATH, r)
        file_time = os.path.getmtime(log_file)  # 文件的最后修改时间(注意是文件实实在在有修改的时间,而不是文件内容里的时间,也不是日志文件名上的时间)
        if datetime.datetime.fromtimestamp(file_time) <= mark_day: # 前者是文件最后修改时间 2021-01-28 16:12:02.148921
            os.remove(log_file)

3. view 视图文件调用

注意:写入日志的内容,不能有中文

from BookApp.views.tools.book_log import *
log_success("1. start getting data from from_db")  # 记录操作成功讯息
try:
    del_logs()  # 删除已有日志文件
except Exception as e:
    log_error("error: {}".format(str(e)))  # 记录操作失败讯息

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值