c - apache 模块 ap_log_perror 与 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 级别?
解决方案
这是一个错误?在阿帕奇。请参阅此错误报告。
基本上,ap_log_perror
调用log_error_core
设置const server_rec *s
为 NULL,这与这里的逻辑相冲突:
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 只会显示通知或高于默认级别的消息(通常是警告)
推荐阅读
- javascript - 如何创建 JWT?
- python - add_format 与 xlsxwriter 无法按预期工作
- java - Java 如果我有一个 javax.servlet.http.Part 数组,那么一个部分是否总是代表一个文件
- 3d - 如何修复 3D 平台游戏的跳转代码?
- reporting-services - 在 SSRS 文本段落中添加超链接
- powershell - 获取无法将“System.Object []”转换为 Add-PowerBIRow 的参数“DatasetId”所需的类型“System.Guid”
- winapi - postmessage return 传递给系统调用的数据区域太小
- excel - excel - 如果公式条件
- regex - 删除文件中两个字符串匹配项之间的所有内容
- ruby-on-rails - Sidekiq 过去曾将工作排入队列