mod_python/apache中的日志记录

1 投票
2 回答
3215 浏览
提问于 2025-04-15 11:24

如何让Python的日志模块和Apache/mod_python一起工作是个标准做法?

我想调用mylog.warn('whatever'),然后这个操作能让req.log_error()被调用,其中req是mod_python的请求对象。

有没有简单的方法来设置这个?

2 个回答

0

我们使用以下方法。这些内容在这里有详细的说明。

  1. 我们使用logging.fileConfig,并配合一个 logging.ini 文件。

  2. 每个模块都会使用 logger= logging.getLogger(__name__) 这行代码。

  3. 然后我们可以在应用程序的任何地方使用 logger.error("blah blah blah") 来记录错误信息。

这个方法运行得非常好。logging.ini 文件定义了日志文件的存放位置,这样我们就可以把它和其他的日志文件放在一起,方便管理我们的网页应用。

2

我以前没做过,但看起来写一个 logging.Handler 的子类应该不难。像这样做应该就可以了。我不能说我真的试过这个,因为我现在没有安装 mod_python,但你应该可以在某个地方调用 logging.root.addHandler(ApacheLogHandler()),然后让它正常工作。你的情况可能会有所不同。

import logging
import apache

class ApacheLogHandler(logging.Handler):
    LEVEL_MAP = {
        logging.DEBUG: apache.APLOG_DEBUG,
        logging.INFO: apache.APLOG_INFO,
        logging.WARNING: apache.APLOG_WARNING,
        logging.ERROR: apache.APLOG_ERR,
        logging.CRITICAL: apache.APLOG_CRIT,
        }
    def __init__(self, request=None):
        self.log_error = apache.log_error
        if request is not None:
            self.log_error = request.log_error
    def emit(self,record):
        apacheLevel = apache.APLOG_DEBUG
        if record.levelno in ApacheLogHandler.LEVEL_MAP:
            apacheLevel = ApacheLogHandler.LEVEL_MAP[record.levelno]
        self.log_error(record.getMessage(), apacheLevel)

撰写回答