如何在其自己的文件路径中隔离INFO和ERROR日志 [英] How to Isolate INFO and ERROR logs in its own file path

查看:63
本文介绍了如何在其自己的文件路径中隔离INFO和ERROR日志的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆