如何在其自己的文件路径中隔离INFO和ERROR日志 [英] How to Isolate INFO and ERROR logs in its own file path
问题描述
我的Django应用具有此 LOGGING
设置.我期望的是,当我的 views
文件中有三个不同的 loggers
时, views日志
会进入各自的单独文件夹中.>
记录程序在我的 settings
文件中:
LOGGING = {'版本':1,'disable_existing_loggers':否,处理程序":{'views_error_file':{'class':'logging.FileHandler','文件名':'logs/errors/views.debug.log',},'views_info_file':{'class':'logging.FileHandler','文件名':'logs/infos/views.debug.log',},'views_debug_file':{'class':'logging.FileHandler','文件名':'logs/debugs/views.debug.log',}},记录器":{'py_folder.views':{'handlers':['views_error_file'],'level':'ERROR',},'py_folder.views':{'handlers':['views_info_file'],'level':'INFO',},'py_folder.views':{'handlers':['views_debug_file'],'level':'DEBUG',}}}
views.py
文件:
导入日志记录#获取记录器的实例logger = logging.getLogger(__ name__)def sample_function(request):params_choices = ['param_1','param_2']sample_param = request.POST.get('sample_param')#logger.debug应该记录在logs/debugs/views.debug.log中logger.debug(sample_param)如果sample_param在params_choices中:如果sample_param =='param_1':#logger.info应该记录在logs/infos/views.debug.log中logger.info("param_1 okay")返回重定向("/param_1-req")别的:#logger.error应该记录在logs/error/views.debug.log中logger.error(param_2 没问题")返回重定向("/param_2-req")别的:logger.error(参数不存在")返回重定向("/param-invalid")
但是它只进入了logs/debugs/views.debug.log.
logs/debugs/views.debug.log文件
:
param_3参数不存在
如您所见, logger.debug
和 logger.error
均记录到 logs/debugs/views.debug.log
.我尝试将 logs/info/views.debug.log
文件更改为 logs/infos/views.info.log
和 logs/error/views.error.登录
到 logs/error/views.error.log
,但没有任何更改.
我不知道为什么会这样.我是Django的新手.请帮忙.
好吧,我想出了一些办法.
在您的应用程序内部(在本例中为教程中的 polls
应用程序),创建目录 logs
,并在其中创建名为 handlers.py
,内容如下:
从日志记录导入FileHandler,INFO,ERROR,DEBUGAppFileHandler(FileHandler)类:def __init __(自身,文件名,日志级别,模式,编码,延迟):super().__ init __(文件名,模式,编码,延迟)self.loglevel =日志级别def发射(自己,记录):如果不是record.levelno == self.loglevel:返回super().emit(记录)AppDebugFileHandler(AppFileHandler)类:def __init __(self,filename,mode ='a',encoding = None,delay = False):super().__ init __(文件名,调试,模式,编码,延迟)类AppErrorFileHandler(AppFileHandler):def __init __(self,filename,mode ='a',encoding = None,delay = False):super().__ init __(文件名,错误,模式,编码,延迟)类AppInfoFileHandler(AppFileHandler):def __init __(self,filename,mode ='a',encoding = None,delay = False):super().__ init __(文件名,INFO,模式,编码,延迟)
然后将 LOGGING
更改为:
import os#您可以将此导入移动到settings.py的开头记录= {'版本':1,'disable_existing_loggers':否,处理程序":{'views_info_file':{'class':'polls.logs.handlers.AppInfoFileHandler','文件名':os.path.join(BASE_DIR,'views.info.log'),},'views_error_file':{'class':'polls.logs.handlers.AppErrorFileHandler','文件名':os.path.join(BASE_DIR,'views.error.log'),},'views_debug_file':{'class':'polls.logs.handlers.AppDebugFileHandler','文件名':os.path.join(BASE_DIR,'views.debug.log'),},},记录器":{'polls.views':{'处理程序':['views_info_file','views_error_file','views_debug_file'],'level':'DEBUG'},}}
这将在项目的根目录(不是应用程序,您可以自定义 filename
目录)上创建3个日志文件.
这行得通,但也许不是最好的方法,可能是在这里重新发明了轮子.同样, level:'DEBUG'
设置不再指示错误级别记录,应该在设置注释中强调这一点.
I have this LOGGING
settings for my Django app. What I was expecting is that the views logs
would go into their own separate folder when I have three different loggers
in my views
file.
Logger in my settings
file:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'views_error_file': {
'class': 'logging.FileHandler',
'filename': 'logs/errors/views.debug.log',
},
'views_info_file': {
'class': 'logging.FileHandler',
'filename': 'logs/infos/views.debug.log',
},
'views_debug_file': {
'class': 'logging.FileHandler',
'filename': 'logs/debugs/views.debug.log',
}
},
'loggers': {
'py_folder.views': {
'handlers': ['views_error_file'],
'level': 'ERROR',
},
'py_folder.views': {
'handlers': ['views_info_file'],
'level': 'INFO',
},
'py_folder.views': {
'handlers': ['views_debug_file'],
'level': 'DEBUG',
}
}
}
The views.py
file:
import logging
# Get an instance of a logger
logger = logging.getLogger(__name__)
def sample_function(request):
params_choices = ['param_1', 'param_2']
sample_param = request.POST.get('sample_param')
# logger.debug should be logged at logs/debugs/views.debug.log
logger.debug(sample_param)
if sample_param in params_choices:
if sample_param == 'param_1':
# logger.info should be logged at logs/infos/views.debug.log
logger.info("param_1 okay")
return redirect("/param_1-req")
else:
# logger.error should be logged at logs/error/views.debug.log
logger.error("param_2 okay")
return redirect("/param_2-req")
else:
logger.error("param does not exist")
return redirect("/param-invalid")
But its only going in to the logs/debugs/views.debug.log.
The logs/debugs/views.debug.log file
:
param_3
param does not exist
As you can see, both logger.debug
and logger.error
logged to the logs/debugs/views.debug.log
. I tried changing the logs/info/views.debug.log
file to logs/infos/views.info.log
and logs/error/views.error.log
to logs/error/views.error.log
but nothing changed.
I don't know why this is the behavior. I am new to Django. Please help.
Well, I've come up with something.
Inside your app (in this example it's the polls
app from tutorial), create a directory logs
, and inside it a file named handlers.py
, with this content:
from logging import FileHandler, INFO, ERROR, DEBUG
class AppFileHandler(FileHandler):
def __init__(self, filename, loglevel, mode, encoding, delay):
super().__init__(filename, mode, encoding, delay)
self.loglevel = loglevel
def emit(self, record):
if not record.levelno == self.loglevel:
return
super().emit(record)
class AppDebugFileHandler(AppFileHandler):
def __init__(self, filename, mode='a', encoding=None, delay=False):
super().__init__(filename, DEBUG, mode, encoding, delay)
class AppErrorFileHandler(AppFileHandler):
def __init__(self, filename, mode='a', encoding=None, delay=False):
super().__init__(filename, ERROR, mode, encoding, delay)
class AppInfoFileHandler(AppFileHandler):
def __init__(self, filename, mode='a', encoding=None, delay=False):
super().__init__(filename, INFO, mode, encoding, delay)
Then change LOGGING
as this:
import os # you can move this import to beginning of settings.py
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'views_info_file': {
'class': 'polls.logs.handlers.AppInfoFileHandler',
'filename': os.path.join(BASE_DIR, 'views.info.log'),
},
'views_error_file': {
'class': 'polls.logs.handlers.AppErrorFileHandler',
'filename': os.path.join(BASE_DIR, 'views.error.log'),
},
'views_debug_file': {
'class': 'polls.logs.handlers.AppDebugFileHandler',
'filename': os.path.join(BASE_DIR, 'views.debug.log'),
},
},
'loggers': {
'polls.views': {
'handlers': ['views_info_file', 'views_error_file', 'views_debug_file'],
'level': 'DEBUG'
},
}
}
This will create 3 log files on root of your project (not app, you can customize the filename
directory).
This works, but perhaps it's not the best way, may be reinventing the wheel here. Also the level: 'DEBUG'
setting no longer indicates the error level logging, this should be stressed in a comment on settings.
这篇关于如何在其自己的文件路径中隔离INFO和ERROR日志的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!