使用Django日志模块时日志输出重复

9udxz4iz  于 2022-12-14  发布在  Go
关注(0)|答案(3)|浏览(442)

我在我的Django www.example.com文件中使用了以下日志片段settings.py。如下图所示,所有日志都被捕获了两次。
我之所以保留root对象,是因为我想logger.info在控制台和日志文件中捕获www.example.com()

设置.py

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
    'simple': {
        'format': '[%(asctime)s] %(levelname)s|%(name)s|%(message)s',
        'datefmt': '%Y-%m-%d %H:%M:%S',
    },
},
'handlers': {
    'applogfile': {
        'level': 'DEBUG',
        'class': 'logging.handlers.RotatingFileHandler',
        'filename': os.path.join(BASE_DIR, 'django_blend.log'),
        'backupCount': 10,
        'formatter': 'simple',
    },
    'console': {
        'level': 'DEBUG',
        'class': 'logging.StreamHandler',
        'formatter': 'simple'
    }
},
'root': { # this tells to capture logger.info() to console as well as in log file
        'handlers': ['console', 'applogfile'],
        'level': 'INFO',
    },
'loggers': {
        'django': {
            'handlers': ['applogfile', 'console'],
            'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
                }
        }
}

django.log文件

n9vozmp4

n9vozmp41#

我在Django 3.2.7中测试了你的代码,如果移除根对象,它可以正常工作,并且你也没有重复的行。

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
    'simple': {
        'format': '[%(asctime)s] %(levelname)s|%(name)s|%(message)s',
        'datefmt': '%Y-%m-%d %H:%M:%S',
    },
},
'handlers': {
    'applogfile': {
        'level': 'DEBUG',
        'class': 'logging.handlers.RotatingFileHandler',
        'filename': os.path.join(BASE_DIR, 'django_blend.log'),
        'backupCount': 10,
        'formatter': 'simple',
    },
    'console': {
        'level': 'DEBUG',
        'class': 'logging.StreamHandler',
        'formatter': 'simple'
    }
},

'loggers': {
        'django': {
            'handlers': ['applogfile', 'console'],
            'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
                },

        },
       
}
eqqqjvef

eqqqjvef2#

添加“传播”:假伐木工。

'loggers': {
    'django': {
        'handlers': ['applogfile', 'console'],
        'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),

        # prevent duplicate log in console
        'propagate': False,
       }
    }
e1xvtsh3

e1xvtsh33#

值得仔细阅读logging.Logger.propagate文档。它对传播机制提供了非常清晰的解释。其中还有一个注解:
注:如果您将处理程序附加到记录器及其一个或多个祖先,它可能会多次发出同一条记录。通常,您不需要将处理程序附加到多个记录器-如果您仅将其附加到记录器层次结构中最高的相应记录器,则它将看到所有后代记录器记录的所有事件。一种常见的情况是只将处理程序附加到根记录器,而让传播处理其余的事务。
(my着重号)
OP的示例中有rootdjango记录器的重复处理程序,因此从django记录器中删除重复的处理程序应该是可行的。
如果您需要特定模块的特定处理程序,您可以显式添加它们并在其中设置propagate=False,如here所述。

相关问题