Apache 2.4,自定义模块不尊重ErrorLogFormat

时间:2015-07-16 22:18:53

标签: apache logging plugins apache2.4 apache-modules

我有一个用于Apache 2.4的自定义C模块(在Windows上,但我希望这不相关)。在模块中我们用ap_log_perror写出错误等。一切都很好,我们将错误消息发送到日志文件。最近,我尝试使用ErrorLogFormat指令为错误日志文件创建自定义格式,例如:

# timestamp (pid:tid) [level] [module] {client} (errorcode) message
ErrorLogFormat "%{u}t (%P:%T) [%l] [%m] {%a} (%E) %M"

对于所有标准Apache模块,格式更改效果很好,例如:

Thu Jul 16 17:45:28.521107 2015 (1912:1504) [info] [ssl] {127.0.0.1:52505} ((OS 10060)A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.  ) AH01991: SSL input filter read failed.
Thu Jul 16 17:45:28.521107 2015 (1912:1504) [debug] [ssl] {127.0.0.1:52505} AH02001: Connection closed to child 98 with standard shutdown (server myhost.meditech.com:443)
但是,对于我的自定义模块,格式是默认格式:

[Thu Jul 16 17:45:28.821350 2015] [my_mod:notice] [pid 1912:tid 1488] onMessage:begin

我已经按照Apache的来源路径发现,如果我们能够找到日志格式(并且它不是启动消息),主要的日志工具将会启动:< / p>

    if (log_format && !info.startup) {
        len += do_errorlog_format(log_format, &info, errstr + len,
                                  MAX_STRING_LEN - len,
                                  &errstr_start, &errstr_end, fmt, args);
    }

此外,log_format设置如下:

        if (s->module_config) {
            sconf = ap_get_core_module_config(s->module_config);
...
            log_format = sconf ? sconf->error_log_format : NULL;
...

我无法编译Apache(这样做有困难),但我确实在我的模块中输入了一些逻辑来引入s-&gt; module_cong-&gt; error_log_format并验证它是自定义令牌列表,等

我看了几个标准模块并玩弄了定义合并配置等(在我学习they're really used for之前)但没有骰子。

任何想法?我意识到还有其他的解决方法,例如将日志传递给程序等等,但我应该能够让我的模块在这方面表现得像标准模块。

感谢

P.S。如果它很有趣,从我的mod中记录的典型调用如下:

    request_rec *r = server->request(server);
...
    ap_log_perror(APLOG_MARK,APLOG_NOTICE,0,r->pool,"onMessage:begin");

1 个答案:

答案 0 :(得分:2)

不要使用ap_log_perror(),它几乎没有上下文来应用每个请求或服务器配置。在上下文中有request_rec *时使用ap_log_rerror(无论如何都要取消引用)。

通常,在有request_rec时使用ap_log_rerror,在有conn_rec时使用ap_log_cerror。然后是带有server_rec或“ap_server_conf”的ap_log_error。