Flask框架-配置日志(1):flask使用日志

一、项目结构

study_flask

        --| apps/

                --| __init__.py

        --| base/

                --| logger.py

                --| __init__.py

        --| app.py

二、配置日志功能

1、base/logger.py

import os
import logging
from datetime import datetime,date,timedelta
from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler
#项目根目录
BASE_DIR = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
#日志文件存放的目录
LOGS_DIR = os.path.join(BASE_DIR,'logs')
#使用RotatingFileHandler日志处理器,生成的日志文件存放的位置
FILE_LOGS_DIR = os.path.join(LOGS_DIR,'file_handler')
#使用TimedRotatingFileHandler日志处理器,生成的日志文件存放的位置
TIME_LOGS_DIR = os.path.join(LOGS_DIR,'time_handler')#创建logs目录
if not os.path.exists(LOGS_DIR):os.makedirs(LOGS_DIR)
#创建logs/file_handler目录
if not os.path.exists(FILE_LOGS_DIR):os.makedirs(FILE_LOGS_DIR)
#创建logs/time_handler目录
if not os.path.exists(TIME_LOGS_DIR):os.makedirs(TIME_LOGS_DIR)#1、基于文件大小切割的日志处理器
def getLogHandlerFile():# 文件名,以日期作为文件名log_file_name = date.today().strftime('%Y-%m-%d.log')# 构建日志文件的路径log_file_str = os.path.join(FILE_LOGS_DIR,log_file_name)'1、日志记录格式'# 默认日志等级的设置# logging.basicConfig(level=logging.INFO)# 设置日志的格式:发生时间,日志等级,日志信息文件名,      函数名,行数,日志信息formatter = logging.Formatter('[%(asctime)s][%(levelname)s][%(pathname)s: %(funcName)s function: %(lineno)s line]: %(message)s')'2、基于文件的日志处理器配置'# 创建日志记录器,指明日志保存路径,每个日志的大小,保存日志的上限file_log_handler = RotatingFileHandler(filename=log_file_str,   #日志文件名maxBytes=1024 * 1024 * 10,  #文件大小超过10MB后,就会生成一个新的日志文件,日志就写到新的文件中backupCount=10,  #最大支持总的日志文件数encoding='UTF-8')file_log_handler.setFormatter(formatter)  # 设置日志的格式file_log_handler.setLevel(logging.INFO)  # 设置日志等级return file_log_handler  # 基于文件大小分割日志的方案#2、基于时间切割的日志处理器
def getLogHanderTime():# 文件名,以日期作为文件名log_file_name = datetime.today().strftime('%Y-%m-%d-%H-%M.log')# 构建日志文件的路径log_file_str = os.path.join(TIME_LOGS_DIR, log_file_name)'1、日志记录的格式'# 默认日志等级的设置# logging.basicConfig(level=logging.DEBUG)# 设置日志的格式:发生时间,日志等级,日志信息文件名,      函数名,行数,日志信息formatter = logging.Formatter('[%(asctime)s][%(levelname)s][%(pathname)s: %(funcName)s function: %(lineno)s line]: %(message)s')'2、基于时间的日志处理器''''# 往文件里写入指定间隔时间自动生成文件的Handler# 实例化TimedRotatingFileHandler# interval是时间间隔,backupCount是备份文件的个数,如果超过这个个数,就会自动删除,when是间隔的时间单位,单位有以下几种:# S 秒# M 分# H 小时# D 天# 'W0'-'W6' 每星期(interval=0时代表星期一:W0)# midnight 每天凌晨'''file_log_time_handler = TimedRotatingFileHandler(filename=log_file_str, #日志文件的路径when='midnight', #凌晨零点进行文件分割backupCount=0, #保留旧文件数0interval=1, #分割一次encoding='utf-8')  # 日志处理器file_log_time_handler.setFormatter(formatter)  # 日志格式file_log_time_handler.setLevel(logging.DEBUG)  # 日志等级return file_log_time_handler  # 基于文件大小分割日志的方案if __name__ == '__main__':from flask import current_appcurrent_app.logger.error('手动写日志时')

2、apps/__init__.py

from base.loggers import getLogHanderTime,getLogHandlerFile
import logging
from flask import Flaskdef create_app():#创建一个flask实例,传递__name__ ,是把当前文路径作为flask实例的根路径#static和templates都是创建在该路径下的app = Flask(__name__,static_folder='../static',template_folder='../templates') #static目录位置是上层的static'基本配置''日志使用'app.logger.addHandler(getLogHanderTime())app.logger.addHandler(getLogHandlerFile())app.logger.setLevel(logging.DEBUG)return app

三、测试使用

1、在视图中使用

from flask import current_app
current_app.logger.error('手动写日志时')

2、在视图中抛出一个异常

四、日志文件

基于文件大小分割的日志文件路径: logs/file_handler/年-月-日.log

基于时间间隔分割的日志文件路径:logs/time_handler/年-月-日.log

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/40258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 开启5个进程处理list数据

要在 Python 中开启多个进程来处理列表数据,你可以使用 multiprocessing 模块。下面是一个开启5个进程处理列表数据的示例代码: python import multiprocessingdef process_item(item):# 在这里处理每个列表项的逻辑print(f"Processing item: {ite…

LeetCode[56]合并区间

难度:Medium 题目: 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1&…

Android Studio Giraffe控制台乱码

这几天在使用Android Studio Giraffe进行一个App的开发,在项目构建的时候,控制台输出中文都是乱码,看着很不爽,进行了两项配置,中文就可以正常输出了,看起来就爽多了。 第一个配置:点击Help菜单…

Redis对象和五种常用数据类型

Redisobject 对象 对象分为键对象和值对象 键对象一般是string类型 值对象可以是string,list,set,zset,hash q:redisobj的结构 typedef struct redisObject { //类型 unsigned type:4; //编码 unsigned encoding:4; //指向底层实现…

webrtc Thread 和 TaskQueue 的 应用和思考

webrtc Thread 和 TaskQueue 的 应用和思考 Thread #include "rtc_base/thread.h"void FunctionToRunOnThread() {// Your threaded logic here.printf("Function running on the thread!\n"); }int main() {rtc::Thread* thread rtc::Thread::Create()…

WebService—XFire配置笔记

在学习之前,一直以为WebService就是一个工具,在两个服务器之间建立一个通信,帮我们把需要传输的数据组织成规范的XML数据并发送到目的地,实际情况也确实是这样的,不过更高级一点的是,XFire不但可以帮我们生成XML发送,而且可以在接收了xml之后还可以直接返回对象给我们用…

iptabels路由转发

要配置iptables进行路由转发,需要执行以下步骤: 确保系统已经开启了IP转发功能。可以通过执行以下命令来检查: sysctl net.ipv4.ip_forward如果返回的值为1,表示已经开启了IP转发功能。如果返回的值为0,可以通过执行…

神经网络基础-神经网络补充概念-29-为什么使用深层表示

概念 深层表示(Deep Representation)是指在深度神经网络的多个隐藏层中逐层提取和学习数据的特征表示。 使用深层表示的原因 高维特征提取:深层神经网络可以从原始数据中自动学习高维抽象特征。每个隐藏层都对数据进行一些变换&#xff0c…

“深入探索JVM内部机制:解密Java虚拟机的奥秘“

标题:深入探索JVM内部机制:解密Java虚拟机的奥秘 摘要:本文将深入探索Java虚拟机(JVM)的内部机制,介绍JVM的基本原理、运行时数据区域以及垃圾回收机制,并通过示例代码解释这些概念。 正文&am…

PG-DBA培训14:PostgreSQL数据库升级与迁移

一、风哥PG-DBA培训14:PostgreSQL数据库升级与迁移 课程目标: 本课程由风哥发布的基于PostgreSQL数据库的系列课程,本课程属于PostgreSQL备份恢复与迁移升级阶段之PostgreSQL数据库升级与迁移,学完本课程可以PostgreSQL数据库升…

炒股票怎么加杠杆_融资融券账户怎么开通

炒股票作为一种投资方式,可以带来不错的回报。然而,对于那些希望以较小的资金获得更高收益的投资者来说,加杠杆炒股票是一个值得考虑的选择。本文将为您介绍加杠杆炒股票的意义,以及如何开通融资融券账户。 加杠杆炒股票的意义&a…

Centos8安装docker并配置Kali Linux图形化界面

鉴于目前网上没有完整的好用的docker安装kali桌面连接的教程,所以我想做一个。 准备工作 麻了,这服务器供应商提供的镜像是真的纯净,纯净到啥都没有。 问题一:Centos8源有问题 Error: Failed to download metadata for repo ap…

vue入门(增查改!)

<template><div><!-- 搜索栏 --><el-card id"search"><el-row><el-col :span"20"><el-input v-model"searchModel.name" placeholder"根据名字查询"></el-input><el-input v-mode…

STM32 FLASH 读写数据

1. 《STM32 中文参考手册》&#xff0c;需要查看芯片数据手册&#xff0c;代码起始地址一般都是0x8000 0000&#xff0c;这是存放整个项目代码的起始地址 2. 编译信息查看代码大小&#xff0c;修改代码后第一次编译后会有这个提示信息 2.1 修改代码后编译&#xff0c;会有提示…

python3.73安装教程,python3.10安装教程

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python3.73安装教程&#xff0c;python3.10安装教程&#xff0c;现在让我们一起来看看吧&#xff01; Python目前已支持所有主流操作系统&#xff0c;在Linux,Unix,Mac系统上自带Python环境&#xff0c;一般默认装的是P…

你敢信?代码小白30min就能搭建一套酷炫级的驾驶舱!

大量研究结果表明&#xff0c;人类通过图像获取信息的速度比通过阅读文字获取信息的速度要快很多。 近几年&#xff0c;数据可视化在企业中越发“流行”&#xff0c;将数字以可视化的形式展示&#xff0c;不仅清晰明了地展现企业真正的实力&#xff0c;也能让管理者快速了解细节…

PG-DBA培训12:PostgreSQL物理备份与恢复实战

一、风哥PG-DBA培训12&#xff1a;PostgreSQL物理备份与恢复实战 课程目标&#xff1a; 本课程由风哥发布的基于PostgreSQL数据库的系列课程&#xff0c;本课程属于PostgreSQL备份恢复与迁移升级阶段之PostgreSQL物理备份与恢复实战&#xff0c;学完本课程可以掌握&#xff1…

Linux6.39 Kubernetes Pod控制器

文章目录 计算机系统5G云计算第三章 LINUX Kubernetes Pod控制器一、Pod控制器及其功用二.pod控制器有多种类型1.ReplicaSet2.Deployment3.DaemonSet4.StatefulSet5.Cronjob 三、Pod与控制器之间的关系1.Deployment2.SatefulSet1&#xff09;为什么要有headless2&#xff09;为…

gulimall-缓存-缓存使用

文章目录 前言一、本地缓存与分布式缓存1.1 使用缓存1.2 本地缓存1.3 本地模式在分布式下的问题1.4 分布式缓存 二、整合redis测试2.1 引入依赖2.2 配置信息2.3 测试 三、改造三级分类业务3.1 代码改造 四、高并发下缓存失效问题4.1 缓存穿透4.2 缓存雪崩4.3 缓存击穿 五、分布…

C++学习第十二天----指针

1.自动存储&#xff0c;静态存储和动态存储 c有3种管理数据内存的方式&#xff1a;自动存储&#xff0c;静态存储和动态存储&#xff08;有时也叫自由存储空间或堆&#xff09;&#xff1b;C其实还有第4种类型----线程存储&#xff1b; 第一&#xff0c;自动存储&#xff0c;在…