我可以在nginx中为访问日志指定自定义日志格式,但它不适用于错误日志。我希望我总能看到发生错误的时间。有可能吗?
答案 0 :(得分:19)
您无法指定自己的格式,但在nginx内置了几个级别的error_log-ing。
语法:error_log file [ debug | info | notice | warn | error | crit ]
默认值:${prefix}/logs/error.log
指定记录服务器(和fastcgi)错误的文件。
错误级别的默认值:
在我的error_log中,时间始终显示为log中每个错误字符串的int begin。
答案 1 :(得分:4)
当我想要更改nginx错误日志的格式时使用的脏技巧(在这种情况下,当使用Lua的openresty的ngx.log
方法发送我自己的日志时)是为我自己的日志消息添加足够的{ {1}}(退格)字符,用于删除运行\b
时我不想查看的所有信息。
答案 2 :(得分:4)
有一个黑客。
我们知道我们可以自定义访问日志格式,但不能自定义错误日志格式。因此,对于自定义错误日志,我们只在发生错误时生成访问日志。
这可以使用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;
}
}
}
答案 3 :(得分:0)
@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
映射到与 /404.html
映射到 (error_page 500 502 503 504
) 不同的 HTML 页面 (/50x.html
);这部分与开箱即用的默认 nginx.conf
相同。这允许您根据不同的状态代码呈现不同的用户友好消息。
上面的两个段都记录到同一个自定义文件 access_4xx_5xx.log
(并且都在 my_format
中)。这使您可以将这些自定义日志合并到一个文件中,而不是让日志文件激增。
每个段的末尾没有 return 50x
。 Nginx 只会返回原始状态码。