BUG report: error log separation per virtual host does not work

I reported this bug already at
http://thread.gmane.org/gmane.comp.web.nginx.english/1604/focus=1628
but was using the stable version of nginx. I just upgraded to the
latest development version, 0.7.30, and the bug is still there:

I want to have separate error logs for each virtual host. Here is my
config file, with only one host so far:

error_log logs/main_error.log;

events {
worker_connections 1024;
}

http {
error_log logs/http_error.log;
server {
server_name myname.org;
access_log logs/the_org.access;
error_log logs/the_org.error;
}
}

Here is the problem: when the server receives a request for
http://myname.org/nonexistent.file, the request shows up in the access
log (the_org.access), but all 3 error logs remain blank. The error
only shows up in the main_error.log if I comment the
“error_log logs/http_error.log;”
and
“error_log logs/the_org.error;”
lines.

Can this bug please be fixed? Lighttpd’s author refused to implement
error log separation (see
http://www.wikivs.com/wiki/Lighttpd_vs_nginx#Separated_error_logging_per_virtual_server)
and I really hoped that nginx could do better…

Best regards,
Dan Dascalescu

Conditional error logging is one thing I’d like to see, I’ve asked in
the past.

For things like

if ($remote_addr ~ 10.22.33.44) {
error_log off;
}

or location / server block based, etc?

On Wed, Jan 7, 2009 at 9:09 PM, Dan Dascalescu

Maxim D. <mdounin@…> writes:

The problem is that nginx sets reasonable logging level
automatically only for global error_log (it’s defaults to error if
not defined). For others it’s defaults to stderr, i.e. nothing is
logged. Solution is simple - explicitly specify logging level:

[…]

Since there is no official documentation for error_log directive
at all - this probably can’t be considered as a bug. It’s up to
Igor either fix it or document as is.

Thanks for the help. I documented this on the wiki at
http://wiki.codemongers.com/NginxHttpMainModule#error_log. Feel free to
correct
as necessary (in particular, I’m not sure about the default error log
levels).

Dan

Hello!

On Wed, Jan 07, 2009 at 09:09:02PM -0800, Dan Dascalescu wrote:

events {
}

Here is the problem: when the server receives a request for
myname.org, the request shows up in the access
log (the_org.access), but all 3 error logs remain blank. The error
only shows up in the main_error.log if I comment the
“error_log logs/http_error.log;”
and
“error_log logs/the_org.error;”
lines.

The problem is that nginx sets reasonable logging level
automatically only for global error_log (it’s defaults to error if
not defined). For others it’s defaults to stderr, i.e. nothing is
logged. Solution is simple - explicitly specify logging level:

error_log logs/main_error.log error;

events {
worker_connections 1024;
}

http {
error_log logs/http_error.log error;
server {
server_name myname.org;
access_log logs/the_org.access;
error_log logs/the_org.error error;
}
}

Since there is no official documentation for error_log directive
at all - this probably can’t be considered as a bug. It’s up to
Igor either fix it or document as is.

Maxim D.

On Thu, Jan 08, 2009 at 01:36:31PM +0300, Maxim D. wrote:

error_log logs/main_error.log;
error_log logs/the_org.error;
lines.
}
Since there is no official documentation for error_log directive
at all - this probably can’t be considered as a bug. It’s up to
Igor either fix it or document as is.

The attached patch should fix the bug.