如何禁用 Nginx 日志记录?

use*_*363 41 nginx

我在配置文件中有以下内容

server {
    listen       80;
    server_name  _;
    access_log  /var/log/nginx/access.log  main;
  ...

server {
    listen       80;
    server_name  example.com
    access_log  off;
    error_log off;
Run Code Online (Sandbox Code Playgroud)

但它仍然保持记录example.com虚拟主机。我究竟做错了什么?

rvs*_*rvs 38

;在 server_name 指令后丢失。access_logoff正在接受治疗的附加server_names配置。

  • 另外,error_log off;不会关闭错误记录。它只是将错误记录到名为“off”的文件中。没有办法完全禁用错误日志记录,最接近的是 error_log /dev/null crit; 这几乎是同一件事,因为不会出现错误日志。 (13认同)
  • 实际上,执行 `access_log off;` 会导致 nginx 将日志写入名为 `off` 的文件中。所以这不是正确的答案。 (8认同)
  • 实际上,这是正确的答案。“使用“off”作为唯一参数会清除当前级别的所有 access_log 指令”:http://wiki.nginx.org/HttpLogModule#access_log。error_log 不是这样(由@kolbyjack 添加),但我相信问题是关于访问,而不是错误日志。一些非常旧的 nginx 版本可能不支持这一点。 (5认同)

小智 26

当然,您可以完全禁用日志记录。只需将日志文件指向 /dev/null 即可。;)

access_log  /dev/null;
error_log /dev/null;
Run Code Online (Sandbox Code Playgroud)

  • 这不是官方推荐的方法。使用“关闭”是正确的方法。 (7认同)
  • 我也用这个;`/dev/null` 是一个真正的目的地;而“off”是某个目录中的文件 (3认同)

小智 18

您可以access_log使用禁用

access_log off;
Run Code Online (Sandbox Code Playgroud)

但是如果你想禁用 error_log,就不要在你的 conf 中使用 error_log 选项。

  • 这如何添加到早期的答案中? (2认同)
  • 如果配置不包含 error_log 选项,nginx 默认为“error_log logs/error.log error”:http://nginx.org/en/docs/ngx_core_module.html#error_log (2认同)

Gre*_*cki 9

OP 的问题是语法错误,此答案对此进行了解释


截至2020年1月,针对nginx 1.14.0+nginx禁用访问和错误日​​志的普遍问题解决如下:


访问日志

要在某些配置级别禁用日志,假设它已在更高级别上显式启用或默认启用(按原样启用),请使用以下指令*:

access_log off;
Run Code Online (Sandbox Code Playgroud)

(回答说您应该将此类日志重定向到/dev/null已过时。)

请注意,该access_log指令可以设置多个在单个水平次,但上面的记录禁止在当前级别的所有访问日志记录。

来源:access_log 的 nginx 文档


错误日志

禁用错误日志更加棘手,因为没有明确的选项可以在较低的配置级别将其关闭,如果它已在更高的配置级别启用或默认启用(按原样)!

因此,在这种情况下,您应该使用此答案建议的内容:

error_log /dev/null;
Run Code Online (Sandbox Code Playgroud)

来源:error_log 的 nginx 文档


注意事项

想象一下,您有一个http在此级别启用访问日志的单个server条目,并且在多个条目中,其中一个server是所有其他条目的入口点。假设您有一个server配置了 SSL 的设备,它使用 HTTPS 侦听来自外部的连接,并将它们重定向到其他servers,即各种 API 网关。

那么在某些 API 网关server(或它们location的)中禁用访问日志是不够的,因为请求仍将记录在外部 HTTPS 的访问日志中server

不好的例子:

http {
  access_log  /var/log/nginx/access.log  main;

  server {
    listen 80;
    location /app1 {
      proxy_pass http://localhost:81;
    }
    (...)
  }

  server {
    listen 81;
    access_log off; # <----- this WON'T effectively work - requests will be logged in the access log by the server above
    (...)
  }
  (...)
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您必须禁用给定请求的整个路径上的访问日志才能使其工作。但是当然更好的解决方案是考虑简化您的配置,因为即使您解决了访问日志的问题,您也可能会遇到更多惊喜......

更简单的配置示例:

http {
  access_log  /var/log/nginx/access.log  main;

  server {
    listen 80;
    location /app1 {
      access_log off; # <----- this WILL work
      proxy_pass http://app1server;
    }
    (...)
  }

}
Run Code Online (Sandbox Code Playgroud)