【问题标题】:Is it possible to specify custom error log format on Nginx?是否可以在 Nginx 上指定自定义错误日志格式?
【发布时间】:2011-05-13 21:41:03
【问题描述】:

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

有没有办法做到这一点?

【问题讨论】:

    标签: logging format nginx error-logging


    【解决方案1】:

    你不能指定你自己的格式,但是在 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。

    【讨论】:

    【解决方案2】:

    有一个技巧。

    我们知道我们可以自定义访问日志格式,但不能自定义错误日志格式。所以 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:[emerg] 无效值“50x”
    • @MarissaLevy 使用 50x,我的意思是 502、503 等错误代码,无论您想自定义哪个。
    • 但是我们只有错误事件的access_log记录对吧?不完全是错误日志本身,例如,我们会错过错误消息?
    • 我不确定 tuan,你可能是对的,但我认为响应代码和消息也会被记录。
    • 这样,如何把nginx产生的错误信息变成custom_combined格式
    【解决方案3】:

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

    【讨论】:

    • @SW:我知道,这不是我最自豪的时刻之一 :-) 它只是用于我想消除日志噪音的临时调试会话。我建议为长期解决方案使用替代品
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-01-17
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      • 1970-01-01
      相关资源
      最近更新 更多