是否可以在nginx中指定自定义错误日志格式?

时间:2010-11-22 15:01:15

标签: logging format nginx error-logging

我可以在nginx中为访问日志指定自定义日志格式,但它不适用于错误日志。我希望我总能看到发生错误的时间。有可能吗?

4 个答案:

答案 0 :(得分:19)

您无法指定自己的格式,但在nginx内置了几个级别的error_log-ing。

语法:error_log file [ debug | info | notice | warn | error | crit ]

默认值:${prefix}/logs/error.log

指定记录服务器(和fastcgi)错误的文件。

错误级别的默认值:

    主要部分中的
  1. - 错误
  2. HTTP部分中的
  3. - 暴力
  4. 在服务器部分 - 暴力
  5. 在我的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;
        }
        ...
    }

上面的例子完成了以下操作:

  1. error_page 404 映射到与 /404.html 映射到 (error_page 500 502 503 504) 不同的 HTML 页面 (/50x.html);这部分与开箱即用的默认 nginx.conf 相同。这允许您根据不同的状态代码呈现不同的用户友好消息。

  2. 上面的两个段都记录到同一个自定义文件 access_4xx_5xx.log(并且都在 my_format 中)。这使您可以将这些自定义日志合并到一个文件中,而不是让日志文件激增。

  3. 每个段的末尾没有 return 50x。 Nginx 只会返回原始状态码。