Django 如何在自己的文件路径中隔离信息和错误日志
我有Django应用程序的Django 如何在自己的文件路径中隔离信息和错误日志,django,logging,Django,Logging,我有Django应用程序的日志记录设置。我所期望的是,当我的视图文件中有三个不同的记录器时,视图日志将进入它们自己的单独文件夹 我的设置文件中的记录器: LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'views_error_file': { 'class': 'logging.FileHandler',
日志记录设置。我所期望的是,当我的视图
文件中有三个不同的记录器时,视图日志
将进入它们自己的单独文件夹
我的设置
文件中的记录器:
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',
}
}
}
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")
views.py
文件:
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',
}
}
}
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")
但它只进入logs/debugs/views.debug.log
记录/debugs/views.debug.log文件
:
param_3
param does not exist
如您所见,logger.debug
和logger.error
都记录到了logs/debugs/views.debug.log
。我尝试将logs/info/views.debug.log
文件更改为logs/infos/views.info.log
,并将logs/error/views.error.log
更改为logs/error/views.error.log
,但没有更改
我不知道为什么会这样。我是Django的新手。请帮忙。嗯,我想出了一个办法
在应用程序内部(在本例中是教程中的轮询
应用程序),创建一个目录日志
,并在其中创建一个名为handlers.py的文件,其中包含以下内容:
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)
然后将日志记录更改为:
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'
},
}
}
这将在项目的根目录上创建3个日志文件(不是应用程序,您可以自定义文件名
目录)
这是可行的,但也许这不是最好的方法,可能是在这里重新发明轮子。另外,level:'DEBUG'
设置不再表示错误级别日志记录,这应该在设置注释中强调。似乎需要定义三个不同的键。由于所有3个视图当前都是py_folder.views
,因此最后一个是实际有效的。尝试将键更改为唯一值。你所说的键是什么意思?它是logger关键字吗?类似于debug\u logger、info\u logger和error\u logger?下面的键是loggers
。它们都是py_文件夹。视图
这不是文件路径吗?这很有效!!!只是把文件放在根目录,而不是我创建的logs文件夹。是因为BASE_DIR吗?我应该在这里再加些什么吗?没关系。我添加了这个PY\u ROOT='PY\u folder'
LOGGING\u ROOT=os.path.join(PY\u ROOT,'logs')
,并使用它代替BASE\u DIR
。非常感谢,您可以将类似于os.path.join(BASE_DIR,'/polls/logs/views.error.log')
的内容放入handlers.py
的目录中。