【发布时间】:2011-05-13 21:41:03
【问题描述】:
我可以在 Nginx 上为 access_log 指定自定义日志格式,但它不适用于 error_log。
有没有办法做到这一点?
【问题讨论】:
标签: logging format nginx error-logging
我可以在 Nginx 上为 access_log 指定自定义日志格式,但它不适用于 error_log。
有没有办法做到这一点?
【问题讨论】:
标签: logging format nginx error-logging
你不能指定你自己的格式,但是在 nginx 中内置了几个级别的 error_log-ing。
语法:error_log file [ debug | info | notice | warn | error | crit ]
默认:${prefix}/logs/error.log
指定记录服务器(和 fastcgi)错误的文件。
错误级别的默认值:
在我的 error_log 中,时间总是显示在日志中每个错误字符串的 int begin。
【讨论】:
有一个技巧。
我们知道我们可以自定义访问日志格式,但不能自定义错误日志格式。所以 hack 是,对于自定义的错误日志,我们只在发生错误时生成访问日志。
这可以使用 error_page 指令来完成。
http {
...
log_format custom_combined "...";
server {
...
error_page 50x @create_custom_error50x;
...
location @create_custom_error50x {
access_log path custom_combined;
return 50x;
}
}
}
【讨论】:
当我想更改 nginx 错误日志的格式时(在这种情况下,当使用 Lua 的 openresty 的 ngx.log 方法发送我自己的日志时)我使用的一个肮脏的技巧是在我自己的日志消息前面加上足够的 \b (退格)字符来删除我在运行 tail -f error.log 时不想查看的所有信息。
【讨论】:
@Satys 上面的回答很有启发性。但是,他的示例可能会让您相信您必须提前选择一个特定的返回代码(例如,502),然后在该段的末尾选择return 502。这进一步意味着,如果您想处理第二个返回码(例如,404),您需要在nginx.conf 中创建第二个类似的段。
使用 nginx v1.20.0,我可以像这样组合它们:
log_format my_format ...
server {
error_page 404 /404.html;
location = /404.html {
access_log /var/log/nginx/access_4xx_5xx.log my_format;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
access_log /var/log/nginx/access_4xx_5xx.log my_format;
}
...
}
上面的例子完成了以下工作:
error_page 404 映射到一个不同于 error_page 500 502 503 504 映射到 (/50x.html) 的 HTML 页面 (/404.html);这部分与开箱即用的默认nginx.conf 相同。这允许您根据不同的状态代码呈现不同的用户友好消息。
上面的两个段都记录到同一个自定义文件access_4xx_5xx.log(并且都在my_format)。这使您可以将这些自定义日志整合到一个文件中,而不是让日志文件激增。
每个段的末尾没有return 50x。 Nginx 只会返回原始状态码。
【讨论】: