38

我可以在 Nginx 上指定自定义日志格式access_log,但它不适用于error_log.

有没有办法做到这一点?

4

4 回答 4

24

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

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

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

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

错误级别的默认值:

  1. 在主要部分 - 错误
  2. 在 HTTP 部分 - 暴击
  3. 在服务器部分 - 暴击

在我的 error_log 中,时间总是显示日志中每个错误字符串的 int begin。

于 2010-11-26T05:01:40.877 回答
7

有一个技巧。

我们知道我们可以自定义访问日志格式,但不能自定义错误日志格式。所以 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;
    }
  }
}
于 2015-11-17T10:08:00.770 回答
5

当我想更改 nginx 错误日志的格式时(在这种情况下,当ngx.log从 Lua 使用 openresty 的方法发送我自己的日志时)我使用的一个肮脏的技巧是在我自己的日志消息前加上足够的\b(退格)字符来删除所有信息运行tail -f error.log.

于 2012-08-10T00:44:11.657 回答
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不同的 HTML 页面 ( );这部分与开箱即用的 default 相同。这允许您根据不同的状态代码呈现不同的用户友好消息。error_page 500 502 503 504/50x.htmlnginx.conf

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

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

于 2021-08-06T01:43:21.317 回答