46

I have the following in config file

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;

But it is still keep logging for example.com virtual host. What am I doing wrong?

user965363
  • 723
  • 2
  • 6
  • 11
  • What do you intend "main" to do here? – Evan Carroll Dec 14 '15 at 20:40
  • I've flagged this question for removal, because the most upvoted answer has to do with your syntax-error. It has nothing to do with turning off error logging. It has no searchable error messages, and I'm not sure what you're asking or why the provided answers don't solve your problem. – Evan Carroll Dec 14 '15 at 20:42
  • I have added an answer for general problems with turning off logging in nginx, @Evan. I think that with it this question is helpful and should not be deleted. – Greg Dubicki Jan 08 '20 at 17:28

5 Answers5

41

You are missing ; after server_name directive. access_log and off are being treated as additional server_names.

rvs
  • 4,027
  • 1
  • 25
  • 30
  • 13
    In addition, error_log off; doesn't turn off error logging. It just logs errors to a file named 'off'. There's no way to completely disable error logging, the closest you can get is error_log /dev/null crit; which is almost the same thing, since no error log will appear. – kolbyjack Oct 05 '11 at 12:16
  • 8
    Actually, doing `access_log off;` causes nginx to write the log into file called `off`. So this is not right answer. – user965363 Oct 17 '11 at 08:40
  • 5
    Actually, this is right answer. "Using "off" as the only parameter clears all access_log directives for the current level": http://wiki.nginx.org/HttpLogModule#access_log. It is not true for error_log (as added by @kolbyjack), but I believe question was about access, not error log. It is possible that some very old versions of nginx don't support this. – rvs Oct 17 '11 at 16:29
  • Is there an advantage to using `off` instead of `/dev/null`? If `off` causes some versions of Nginx write to a file named `off`, then `/dev/null` seems like a more universal solution. – Joe Mornin Jan 22 '16 at 23:53
28

Of course you can completely disable logging. Just point the logfiles to /dev/null and be done. ;)

access_log  /dev/null;
error_log /dev/null;
Franz Bettag
  • 897
  • 8
  • 7
  • 3
    I use this one too; `/dev/null` is a real destination; while "off" is a file in some directory – edoceo Dec 13 '15 at 19:30
  • 7
    This is not the official recommend way to do it. Using 'off' is the correct way. – user1751825 Jul 30 '17 at 21:31
  • I made it /var/null and now it start saving logs in file named "null" in var directory. Should it be "/dev/null" only? – Gaurav Oct 17 '17 at 12:48
19

you can disable access_log by using

access_log off;

but if you want to disable error_log, just don't use error_log option in your conf.

Mustafa Özgür
  • 198
  • 1
  • 7
10

OP's problem was a syntax error, which is explained in this answer.


As of January 2020, with nginx 1.14.0+ the general problem of disabling access and error logging in nginx is solved as follows:


Access logs

To disable logs on some configuration level, assuming that it has been explicitly enabled on a higher one or are enabled by default (as they are), use this directive*:

access_log off;

(Answers saying that you should redirect this kind of logs to /dev/null are outdated.)

Note that the access_log directive may be set multiple times on a single level but the above entry disables all access log logging on the current level.

Source: nginx docs for access_log


Error logs

Disabling error logs is more tricky as there is NO explicit option to turn it off on a lower configuration level, if it has been enabled on a higher one or it is enabled by default (as it is)!

So in this case you should use what this answer proposed:

error_log /dev/null;

Source: nginx docs for error_log


Caveats

Imagine that you have a single http with access log enabled on this level, and inside multiple server entries and one of these servers is an entry point to all others. Let's say you have one server with SSL configured that listens for connections from outside with HTTPS and it redirects them to other servers which are various API gateways.

Then it's not enough to disable access logs in some of the API gateway servers (or their locations) as the request will be still logged in the access log of the external HTTPS server.

Bad example:

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
    (...)
  }
  (...)
}

You would have to disable access logs on the whole paths of given requests to make it work in this case. But of course a better solution would be to consider simplifying your config as you may run into many more surprises even after you solve the problem with access logs...

Simpler config example:

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

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

}


Greg Dubicki
  • 1,191
  • 1
  • 14
  • 30
0

It should be pretty simple, you could comment the log lines out

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;

and if you do get a crit errors you should do it like this : ´error_log /dev/null crit;´ so it will be :

server {
    listen       80;
    server_name  _;
    access_log  /dev/null crit;
  ...

server {
    listen       80;
    server_name  example.com
    access_log  /dev/null crit;
    error_log /dev/null crit;