记录程序在我的 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 loggerlogger = 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_3param does not existAs 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, DEBUGclass 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.pyLOGGING = { '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日志的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云!
08-20 09:34
查看更多