Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何在自己的文件路径中隔离信息和错误日志_Django_Logging - Fatal编程技术网

Django 如何在自己的文件路径中隔离信息和错误日志

Django 如何在自己的文件路径中隔离信息和错误日志,django,logging,Django,Logging,我有Django应用程序的日志记录设置。我所期望的是,当我的视图文件中有三个不同的记录器时,视图日志将进入它们自己的单独文件夹 我的设置文件中的记录器: LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'views_error_file': { 'class': 'logging.FileHandler',

我有Django应用程序的
日志记录设置。我所期望的是,当我的
视图
文件中有三个不同的
记录器时,
视图日志
将进入它们自己的单独文件夹

我的
设置
文件中的记录器:

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
的目录中。