Django视图及视图集内日志不生效问题求助
Django视图方法内日志无法打印的排查与解决
问题描述
视图模块外部调用logger.debug()能正常输出日志,但视图类的get_queryset和download方法内的debug日志完全没显示,相关代码和配置如下:
views.py
import logging logger = logging.getLogger(__name__) logger.debug('THIS LOGGING MESSSAGE SHOWS UP IN LOGS') class RequestGetResultViewSet(viewsets.GenericViewSet, mixins.RetrieveModelMixin): permission_classes = (IsAuthenticated,) serializer_class = serializers.RequestGetResultSerializer queryset = Request.objects.all() def get_queryset(self): logger.debug('THIS LOGGING MESSSAGE DOES NOT SHOW UP') return self.queryset.filter(user=self.request.user.id) @action(methods=['get'], detail=True, renderer_classes=(PassthroughRenderer,)) def download(self, *args, **kwargs): logger.debug('THIS LOGGING MESSSAGE DOES NOT SHOW UP') # working code here return response
settings.py
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'class': 'logging.StreamHandler', }, }, 'root': { 'handlers': ['console'], 'level': 'DEBUG' , }, }
排查与解决步骤
1. 先确认视图方法是否真的被执行
有时候日志没输出不是配置问题,而是方法根本没被调用。在目标方法里加一行print语句测试:
def get_queryset(self): print("get_queryset方法已执行") logger.debug('THIS LOGGING MESSSAGE DOES NOT SHOW UP') return self.queryset.filter(user=self.request.user.id)
如果控制台能看到print的输出,说明方法确实被执行,问题出在日志配置;如果看不到,先排查路由、权限等是否导致方法没触发。
2. 显式配置模块级别的日志级别
虽然你把root日志设为DEBUG,但Django运行时可能会对某些模块的日志级别做默认调整。直接在LOGGING配置里指定视图所在模块的日志级别,确保debug日志能被捕获:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'class': 'logging.StreamHandler', }, }, 'root': { 'handlers': ['console'], 'level': 'DEBUG' , }, 'loggers': { # 替换成你的视图所在模块名,比如views.py在myapp下就写'myapp.views' 'your_app_name.views': { 'handlers': ['console'], 'level': 'DEBUG', 'propagate': True, }, }, }
3. 检查logger的实际配置(可选)
如果还是不行,可以在视图方法里打印logger的当前配置,确认级别和handler是否正确:
def get_queryset(self): print(f"当前logger级别: {logging.getLevelName(logger.level)}") print(f"logger绑定的handler: {[h.__class__.__name__ for h in logger.handlers]}") logger.debug('THIS LOGGING MESSSAGE DOES NOT SHOW UP') return self.queryset.filter(user=self.request.user.id)
如果输出的级别是INFO或更高,说明有代码或配置修改了logger级别,针对性调整即可。
内容的提问来源于stack exchange,提问作者Hello
相关产品推荐
相关产品推荐

