logging日志文件配置
Django配置如下
简洁版:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': { # 这里是打印console里面的sql语句的日志配置,
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
完整版:(我们的程序运行的时候,需要有日志记录运行的过程,每一次的点击交互事件都是程序在运行的过程,每一次都需要记录下来,我们不可能在程序里面加上成千上万的print然后都打印到屏幕里面,那样不便于整理,也不现实,这个时候我们的日志就应运而生了,我们在setting里面把日志配置好,然后根据我们配置的参数,我们的每一次程序运行都打印到一个文件里面,然后这个文件会根据我们设置的大小进行分割,就类似于换行,然后文件不会无限大,达到一定的上限之后就会自动开启另一个文件去保存数据,我们的程序上线之后,需要查bug都是通过日志去检验,看哪里有问题,需要进一步去调整,这就是我们的日志的关键所在)
Django项目常用LOGGING配置
BASE_LOG_DIR = os.path.join(BASE_DIR, "log")
if not os.path.isdir(BASE_LOG_DIR):
os.mkdir(BASE_LOG_DIR)
LOGGING = {
'version': 1,
'disable_existing_loggers': False, # 是否禁用已经存在的loggers示例,不禁用
'formatters': {
'standard': {
'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'
'[%(levelname)s][%(message)s]'
},
'simple': {
'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
},
'collect': {
'format': '%(message)s'
}
},
'filters': {
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'handlers': {
'console': {
'level': 'DEBUG',
'filters': ['require_debug_true'], # 只有在Django debug为True时才在屏幕打印日志
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
'filename': os.path.join(BASE_DIR, "genius20F_info.log"), # 日志文件路径,这里我们不要写绝对路径,就用系统内置的BASE_DIR,然后后面直接写文件名即可
'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
'backupCount': 3,
'formatter': 'standard',
'encoding': 'utf-8',
},
'SF': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,根据文件大小自动切
'filename': os.path.join(BASE_LOG_DIR, "xxx_info.log"), # 日志文件
'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
'backupCount': 3, # 备份数为3 xx.log --> xx.log.1 --> xx.log.2 --> xx.log.3
'formatter': 'standard',
'encoding': 'utf-8',
},
'TF': {
'level': 'INFO',
'class': 'logging.handlers.TimedRotatingFileHandler', # 保存到文件,根据时间自动切
'filename': os.path.join(BASE_LOG_DIR, "xxx_info.log"), # 日志文件
'backupCount': 3, # 备份数为3 xx.log --> xx.log.2018-08-23_00-00-00 --> xx.log.2018-08-24_00-00-00 --> ...
'when': 'D', # 每天一切, 可选值有S/秒 M/分 H/小时 D/天 W0-W6/周(0=周一) midnight/如果没指定时间就默认在午夜
'formatter': 'standard',
'encoding': 'utf-8',
},
'error': {
'level': 'ERROR',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
'filename': os.path.join(BASE_DIR, "genius20F_err.log"), # 日志文件
'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
'backupCount': 5,
'formatter': 'standard',
'encoding': 'utf-8',
},
'collect': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
'filename': os.path.join(BASE_DIR, "genius20F_collect.log"),
'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
'backupCount': 5,
'formatter': 'collect',
'encoding': "utf-8"
}
},
'loggers': {
# 默认的logger应用如下配置
'django': { # *****这里是五星级提示:一定要写Django,这样系统console控制台输出的信息才会自动写入到文件中去,有的博客说这里写成“”,或者“django.service“都试过,有坑。
'handlers': ['default', 'TF', 'error', 'console'], # 上线之后可以把'console'移除
'level': 'DEBUG',
'propagate': True, # 是否继承父类的log信息
},
'django.service': {
'handlers': ['default', ],
'propagate': True,
'level': 'DEBUG', },
# 名为 'collect'的logger还单独处理
'collect': {
'handlers': ['collect', ],
'level': 'INFO',
},
# 自定义logger处理方式,专门为文件genius20F.utils.commons.py单独做处理
# 'genius20F.utils.commons': {
# 'handlers': ['error', ],
# 'level': 'INFO',
# 'propagate': True,
# }
},
}
配置好之后,程序运行的时候就会自动生成日志文件在项目目录下面。
在程序中使用log:
import logging
def index(arg):
try:
if arg>10:
print("hello")
except Exception as e:
logger = logging.getLogger(__name__)
logger.error(e)
return arg
程序走到这里的时候,就会在error的文件夹里面把信息记录下来。
flask配置如下
直接在项目根目录下创建logging文件,写入如下代码
import os
import logging
from logging.handlers import RotatingFileHandler BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) class LoggingSet():
def __init__(self):
self.path = os.path.join(BASE_DIR, "flask_check_list/flask_logs")
self.maxBytes = 1024 * 1024 * 100
self.default_formatter = logging.Formatter(
'%(levelname)s %(filename)s:%(lineno)d %(message)s')
self.error_formatter = logging.Formatter(
'[%(asctime)s] [%(filename)s:%(lineno)d\t] [%(levelname)s] %(message)s '
) def debug_log(self, log_level):
logging.basicConfig(level=log_level)
file_log_handler = RotatingFileHandler(
os.path.join(self.path, "flask.log"),
# maxBytes=1024 * 1024 * 100,
maxBytes=self.maxBytes,
backupCount=10
)
file_log_handler.setFormatter(self.default_formatter)
logging.getLogger().addHandler(file_log_handler) def error_log(self, log_level):
logging.basicConfig(level=log_level)
file_error_handler = RotatingFileHandler(
os.path.join(self.path, 'error.log'),
maxBytes=self.maxBytes,
backupCount=5
)
file_error_handler.setFormatter(self.error_formatter)
logging.getLogger().addHandler(file_error_handler)
在项目根目录的__init__文件中创建app,如下使用logging配置:
from .loggins import LoggingSet
logger = LoggingSet() def create_app():
app = Flask(__name__)
connect('test', host='127.0.0.1', port=27017)
app.config.from_object("settings.DevelopmentConfig")
app.config['MONGODB_SETTINGS'] = {
'db': 'test',
'host': 'localhost',
'port': 27017
}
logger.debug_log(logging.DEBUG)
logger.error_log(logging.ERROR)
db.init_app(app)
app.debug = True
return app app = create_app()
这样就可以了,这是自己写的比较简单的类方法,与Django的配置比较起来确实寒酸些。。。。。。
logging日志文件配置的更多相关文章
- Django 的 logging日志文件配置
在Django的settings配置文件里配置以下信息: import os BASE_LOG_DIR = os.path.join(BASE_DIR , "log") # log ...
- slf4j/logback: logging日志的配置
slf4j/logback: logging日志的配置 import依赖: import org.slf4j.Logger;import org.slf4j.LoggerFactory;private ...
- logging日志模块配置
logging日志模块 日志级别 日志一共分成5个等级,从低到高分别是: 1)DEBUG 2)INFO 3)WARNING 4)ERROR 5)CRITICAL 说明: DEBUG:详细的信息,通常只 ...
- Django(八)模型:Mysql8.0日志文件配置开启/关闭、查询
Mysql日志文件开启.配置.查看 mysql.log是mysql的日志文件,里面记录的对MySQL数据库的操作记录.默认情况下mysql的日志文件没有产生,需要修改mysql的配置文件,步骤如下: ...
- log4j2 自动删除过期日志文件配置及实现原理解析
日志文件自动删除功能必不可少,当然你可以让运维去做这事,只是这不地道.而日志组件是一个必备组件,让其多做一件删除的工作,无可厚非.本文就来探讨下 log4j 的日志文件自动删除实现吧. 0. 自动删除 ...
- log4j自动生成日志文件配置
生成文件到默认位置: #生成日志文件 #log4j.appender.systemFile=org.apache.log4j.RollingFileAppender #按天生成 log4j.appen ...
- Nginx日志文件配置与切割
Nginx日志的指令主要有两条: log_format,设置日志的格式 access_log,指定日志文件的存放路径.格式和缓存大小 两条指令在Nginx配置文件中的位置可以在http{……..}之间 ...
- logback.xml日志文件配置
放在resources目录下面就可以自动读取<?xml version="1.0" encoding="UTF-8"?> <configura ...
- spring boot 日志文件配置(logback-spring.xml)亲测可用!
问题描述:如何配置springboot项目,通过日志配置,使之输出自定义日志. 详细文章:https://blog.csdn.net/gebitan505/article/details/701421 ...
随机推荐
- Solidity函数view,pure,constant的用法
函数访问权限:public,external,private,internal //子类可以得到父类下面的方法,父类用了public,external的话 pragma solidity ^; con ...
- 洛谷P5162 WD与积木 [DP,NTT]
传送门 思路 真是非常套路的一道题-- 考虑\(DP\):设\(f_n\)为\(n\)个积木能搭出的方案数,\(g_n\)为所有方案的高度之和. 容易得到转移方程: \[ \begin{align*} ...
- 任意N位二进制的补码实现——队列存放
正在学习计算机组织与结构,为了写一些底层的算术操作模拟,比如一个二进制补码数的加减乘除,发现这很麻烦,因为不管是什么语言,都只提供了8位.32.64位等部分位数的补码形式,那么怎么实现任意任意位的补码 ...
- Confluence 6 连接到 Jira 用户管理的限制
当你在使用 JIRA 目录为用户目录的时候,请考虑下面的一些限制和建议. 不知道跨平台的多应用单点登录 当你使用 JIRA 为你的目录管理器的时候,系统将不能支持跨平台的单点登录.当 JIRA 用作目 ...
- python面试1-30题
1.一行代码实现1--100之和 利用sum()函数求和 2.如何在一个函数内部修改全局变量 利用global 修改全局变量 3.列出5个python标准库 os:提供了不少与操作系统相关联的函数 s ...
- Django Rest Framework(2)
目录 一.认证 二.权限 三.限制访问频率 四.总结 一.认证(补充的一个点) 认证请求头 #!/usr/bin/env python # -*- coding:utf-8 -*- from rest ...
- java web----MINA框架使用
前期准备 1.下载 http://mina.apache.org/ 2.将依赖包添加到工程目录下(在工程目录下创建libs(directory目录)) 3.将 slf4j-api-1.7.26.jar ...
- shell 判断文件夹或文件是否存在
文件夹不存在则创建 if [ ! -d "/data/" ];then mkdir /data else echo "文件夹已经存在" fi 文件存在则删除 i ...
- JumpServer里的sftp功能报错说明
JumpServer里sftp默认的家目录是/tmp下 修改默认家目录: vim /usr/local/coco/coco/sftp.py class SFTPServer(paramiko.SFTP ...
- javaScript中的querySelector()与querySelectorAll()的区别
之前,在JavaScript获取文档元素一文中,我曾介绍了获取文档元素的几种方法,最后一种方法是通过选择器获取文档元素.它的核心思想便是利用querySelector()或querySelectorA ...