apache 模块 ap_log_perror 与 ap_log_error 处于不同级别

apache modules ap_log_perror is at a different level than ap_log_error

我有一个记录一些行的 apache 模块。如果我使用 ap_log_error 登录并设置 LogLevel 进行调试,我会看到消息。但是,如果我尝试使用 ap_log_perror,我可以看到错误级别的日志,但不会显示调试日志。似乎两者处于不同的级别,但我无法弄清楚如何设置池的级别(或为此获得它)。

我看到有一个电话 ap_get_server_module_loglevel 但我不确定正确的索引是什么。尝试 0 我看到我在 apache.conf 顶层设置的级别(在本例中为 trace1)。没有配置日志级别的虚拟主机。我可以访问的每个池似乎都以相同的方式运行。

static int foo_setup_handler(apr_pool_t *pconf, 
                             apr_pool_t *plog,
                             apr_pool_t *ptemp, 
                             server_rec *s) {
    int mod_log = ap_get_server_module_loglevel(s, 0);
    ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, 
                 "Post Config  server mod 0 loglevel %d", 
                  mod_log);
    ap_log_perror(APLOG_MARK, APLOG_ERR, APR_SUCCESS, pconf,
                  " P E++++++++++++++++");
    ap_log_perror(APLOG_MARK, APLOG_DEBUG, APR_SUCCESS, pconf, 
                  "P D conf ++++++++++++++++");
    ap_log_perror(APLOG_MARK, APLOG_DEBUG, APR_SUCCESS, plog, 
                  "P D log ++++++++++++++++");
    ap_log_perror(APLOG_MARK, APLOG_WARNING, APR_SUCCESS, plog, 
                  "P W log ++++++++++++++++");
    ap_log_perror(APLOG_MARK, APLOG_DEBUG, APR_SUCCESS, ptemp, 
                  "P D temp++++++++++++++++");

这是错误日志中的输出。 (我从下面的行中删除了日期和线程 ID)

... [:debug] [pid 2..:tid 1...] mod_foo.c(123): Post Config  server mod 0 loglevel 8
... [:error] [pid 2..:tid 1...]  P E++++++++++++++++
... [:warn] [pid 2..:tid 1...] P W log ++++++++++++++++

知道为什么 perror 日志消息没有显示在配置的级别,而是显示在 WARNING 或 ERROR 级别吗?

这是一个错误?在阿帕奇。参见 this bug report

基本上,ap_log_perror 调用 log_error_core 并将 const server_rec *s 设置为 NULL,这与逻辑 here:

相冲突
if (s == NULL) {
    /*
     * If we are doing stderr logging (startup), don't log messages that are
     * above the default server log level unless it is a startup/shutdown
     * notice
     */
#ifndef DEBUG
    if ((level_and_mask != APLOG_NOTICE)
        && (level_and_mask > ap_default_loglevel)) {
        return;
    }
#endif

因此 ap_log_perror 只会显示通知或高于默认级别(通常是警告)的消息