Apache 2.4,自定义模块不遵守 ErrorLogFormat
Apache 2.4, custom module not respecting ErrorLogFormat
我有一个用于 Apache 2.4 的自定义 C module(在 Windows 上,但我希望这无关紧要)。在 mod 规则中,我们用 ap_log_perror 写出错误等。一切都很好,我们将错误消息记录到日志文件中。最近,我尝试使用 ErrorLogFormat 指令为错误日志文件创建自定义格式,例如:
# timestamp (pid:tid) [level] [module] {client} (errorcode) message
ErrorLogFormat "%{u}t (%P:%T) [%l] [%m] {%a} (%E) %M"
对于所有标准 Apache mod 规则,格式更改效果很好,例如:
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)
对于我的自定义 module,但是,格式是默认格式:
[Thu Jul 16 17:45:28.821350 2015] [my_mod:notice] [pid 1912:tid 1488] onMessage:begin
我已经通过 Apache 的源代码跟踪路径,发现如果我们能找到日志格式(并且它不是启动消息),主日志记录工具将会启动:
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(这样做有问题),但我确实在我的 module 中加入了一些逻辑以引入 s->module_cong->error_log_format 和验证它是令牌等的自定义列表
我查看了几个标准 mod 规则并尝试定义合并配置等(在我了解什么 they're really used for 之前)但没有骰子。
有什么想法吗?我意识到还有其他解决方法,例如将日志通过管道传输到程序等,但我应该能够让我的 module 在这方面表现得像标准的一样。
谢谢
p.s。如果这很有趣,从我的 mod 登录的典型调用如下所示:
request_rec *r = server->request(server);
...
ap_log_perror(APLOG_MARK,APLOG_NOTICE,0,r->pool,"onMessage:begin");
不要使用 ap_log_perror(),它几乎没有应用任何请求或服务器配置的上下文。当您的上下文中有 request_rec* 时使用 ap_log_rerror(无论如何您都在取消引用)。
一般来说,当你有 request_rec 时使用 ap_log_rerror,当你有 conn_rec 时使用 ap_log_cerror。然后 ap_log_error 与 server_rec 或 "ap_server_conf".
我有一个用于 Apache 2.4 的自定义 C module(在 Windows 上,但我希望这无关紧要)。在 mod 规则中,我们用 ap_log_perror 写出错误等。一切都很好,我们将错误消息记录到日志文件中。最近,我尝试使用 ErrorLogFormat 指令为错误日志文件创建自定义格式,例如:
# timestamp (pid:tid) [level] [module] {client} (errorcode) message
ErrorLogFormat "%{u}t (%P:%T) [%l] [%m] {%a} (%E) %M"
对于所有标准 Apache mod 规则,格式更改效果很好,例如:
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)
对于我的自定义 module,但是,格式是默认格式:
[Thu Jul 16 17:45:28.821350 2015] [my_mod:notice] [pid 1912:tid 1488] onMessage:begin
我已经通过 Apache 的源代码跟踪路径,发现如果我们能找到日志格式(并且它不是启动消息),主日志记录工具将会启动:
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(这样做有问题),但我确实在我的 module 中加入了一些逻辑以引入 s->module_cong->error_log_format 和验证它是令牌等的自定义列表
我查看了几个标准 mod 规则并尝试定义合并配置等(在我了解什么 they're really used for 之前)但没有骰子。
有什么想法吗?我意识到还有其他解决方法,例如将日志通过管道传输到程序等,但我应该能够让我的 module 在这方面表现得像标准的一样。
谢谢
p.s。如果这很有趣,从我的 mod 登录的典型调用如下所示:
request_rec *r = server->request(server);
...
ap_log_perror(APLOG_MARK,APLOG_NOTICE,0,r->pool,"onMessage:begin");
不要使用 ap_log_perror(),它几乎没有应用任何请求或服务器配置的上下文。当您的上下文中有 request_rec* 时使用 ap_log_rerror(无论如何您都在取消引用)。
一般来说,当你有 request_rec 时使用 ap_log_rerror,当你有 conn_rec 时使用 ap_log_cerror。然后 ap_log_error 与 server_rec 或 "ap_server_conf".