如何在Apache上用日志调试Django?

6 投票
3 回答
14974 浏览
提问于 2025-04-17 22:46

我把我的Django网站部署在Apache上了,但遇到了一个在我开发机器上没有出现的问题,所以我想打印一些变量出来看看发生了什么。

我尝试使用Python的日志模块,代码是这样的:

import os, logging
FILE = os.getcwd()
logging.basicConfig(filename=os.path.join(FILE,'log.txt'),level=logging.DEBUG)  
logging.debug('Write')

在我的开发机器上,可能会在Django项目的根目录下生成一个log.txt文件。但是当我在服务器上做同样的事情时,那个对应的目录里却没有log.txt文件出现。

有没有人知道该怎么调试这个问题?谢谢!

3 个回答

-3

要调试一个不明的错误,你需要查看完整的错误堆栈信息。这可以帮助你找到问题的根源。通常,你还想检查每个堆栈的上下文变量,以便更好地理解发生了什么。虽然日志可以帮助你记录异常,但在生产服务器上调试时,这种方法效率很低。

Sentry 是一个非常好用的工具,可以帮助你跟踪和调试 Python 错误。它是开源的。在去年 Pycon 大会上,Django 的共同创始人 Jacobian 也提到过,这是 Django 开发中必备的工具之一。强烈推荐使用它。

sentry

sentry st

0

好吧,这里有一个我用来记录日志的小配置。你还应该检查一下你的文件权限——www-user是否被允许写入这个目录呢?!

settins.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'standard': {
            'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
            'datefmt': "%d/%b/%Y %H:%M:%S"
        },
    },
    'handlers': {
        'null': {
            'level': 'DEBUG',
            'class': 'django.utils.log.NullHandler',
        },
        'logfile': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': BASE_DIR + "/logfile",
            'maxBytes': 50000,
            'backupCount': 2,
            'formatter': 'standard',
        },
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'standard'
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'propagate': True,
            'level': 'WARN',
        },
        'django.db.backends': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
        '': {
            'handlers': ['console', 'logfile'],
            'level': 'DEBUG',
        },
    }
}

something.py

import logging
try:  # Python 2.7+
    from logging import NullHandler
except ImportError:
    class NullHandler(logging.Handler):
        def emit(self, record):
            pass

log = logging.getLogger(__name__)
log.addHandler(NullHandler())

def demo(foo):
    if foo not bar:
        log.debug('doh!')
    return
1

你假设当前的工作目录是Django项目,但这不太可能,除非你在wsgi文件中专门进行了更改。

不过,你不应该把日志记录到一个单独的文件里。默认的日志设置会把日志记录到Apache自己的日志文件,通常是在/var/log目录下,或者在这个目录的某个子目录里。把你额外的配置去掉,让Django自己在那儿记录日志就可以了。

撰写回答