Django + Loggly:应用日志未保存

0 投票
2 回答
1157 浏览
提问于 2025-04-17 22:27

我正在使用Loggly,目的是为了集中管理我在AWS(弹性云环境)上运行的应用程序的日志。不过,我无法通过Python的日志库和Django的日志配置来保存我的应用日志。在我的Loggly控制面板上,我能看到很多来自我的EC2实例底层操作系统和软件堆栈的日志,但我应用程序的特定日志却没有显示出来,我不明白为什么。

我通过在我的EC2实例上配置RSYSLOG(使用Loggly提供的自动化Python脚本)来设置Loggly,然后在我的Django设置中定义了以下内容:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'standard': {
            'format': '[%(asctime)s] [%(levelname)s] [%(name)s:%(lineno)s] %(message)s',
            'datefmt': '%d/%b/%Y %H:%M:%S'
        },
        'loggly': {
            'format': 'loggly: %(message)s',
        },
    },
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'mail': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler',
            'formatter': 'standard',
        },
        'syslog': {
            'level': 'INFO',
            'class': 'logging.handlers.SysLogHandler',
            'facility': 'local5',
            'formatter': 'loggly',
        },
        'cygora': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': '/tmp/cygora.log',
            'maxBytes': 1024 * 1024 * 5, # 5 mb
            'backupCount': 10,
            'formatter': 'standard',
        },
        'django': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': '/tmp/django.log',
            'maxBytes': 1024 * 1024 * 5, # 5 mb
            'backupCount': 10,
            'formatter': 'standard',
        },
        'celery': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': '/tmp/celery.log',
            'maxBytes': 1024 * 1024 * 5, # 5 mb
            'backupCount': 10,
            'formatter': 'standard',
        },
    },
    'loggers': {
        'loggly': {
            'handlers': ['syslog'],
            'propagate': True,
            'format': 'loggly: %(message)s',
            'level': 'DEBUG',
        },
        'django': {
            'handlers': ['syslog', 'django'],
            'level': 'WARNING',
            'propagate': True,
        },
        'django.db.backends': {
            'handlers': ['syslog', 'django'],
            'level': 'INFO',
            'propagate': True,
        },
        'django.request': {
            'handlers': ['syslog', 'mail', 'django'],
            'level': 'INFO',
            'propagate': True,
        },
        'celery': {
            'handlers': ['syslog', 'mail', 'celery'],
            'level': 'DEBUG',
            'propagate': True,
        },
        'com.cygora': {
            'handlers': ['syslog', 'cygora'],
            'level': 'INFO',
            'propagate': True,
        },
    }
}

在我的类中,我使用“标准”的方式来创建一个模块级的日志记录器:

import logging
logger = logging.getLogger(__name__)
logger.info('This message is not displayed on Loggly!! :(')

但这并没有奏效,也没有使用:

import logging
logger = logging.getLogger('loggly')
logger.info('This message is not displayed on Loggly!! :(')

有没有人有主意?(有没有人使用Django + Loggly和RSYSLOG)

2 个回答

1

我在网上查了一下,看到你在loggly支持论坛上的帖子。你看到他们的回复了吗?那个回复对你有帮助吗?

http://community.loggly.com/customer/portal/questions/5898190-django-loggly-app-logs-not-saved

2

问题可能出在本地的 rsyslog 服务上,要么是它在 接收 日志时出错,要么是在 发送 日志时出错。你的 LOGGING 设置是没问题的,但因为你要掌控所有的东西(比如 Django 的日志记录器),所以你应该把 'disable_existing_loggers': True 设置上。(小建议:你可以去掉 loggly 日志记录器中的 'format',因为 syslog 处理器会用它自己的 'formatter' 来处理这个。)

根据 Loggly Django 的 示例,还有两个步骤需要完成。

  1. 按照这些 说明 设置 Syslog。你已经完成了这一步,听起来是正常工作的。

  2. 确保服务在监听,通过取消注释 rsyslog.conf 中的这些行:

# 提供 UDP syslog 接收 $ModLoad imudp $UDPServerRun 514

rsyslog -N1 验证 rsyslog 的配置,然后重启服务。rsyslog 的 故障排除 提到要查看 rsyslog 日志并交互式运行服务;希望你不需要走到那一步。先看看 Loggly 的 注意事项 部分。

启动一个 Django shell 来测试一下(你已经在做这件事了,干得不错!)。

> manage.py shell
import logging
logger = logging.getLogger('loggly')
logger.info('This message is not displayed on Loggly!! :(')

另外,你没有根日志记录器。所以很可能 logging.getLogger(__name__) 不会被捕获和处理。这是一个一般性的提示;你的努力是全面的,不会受到这个限制。

撰写回答