Can I log HTTP 400s to a different log file instead of my default access logs

Hello

I’d like to know if its possible for me to log HTTP 400 errors to a
different log file. Right now they go in the access log.

To give some background, we’ve got this problem where if a single
resource is requested from chrome, after the resource request is served,
a http 400 error is logged in the access logs. This I’ve understood to
be is due to the nature of connections opened by Chrome (2 for every
request) and one of the connections not been used before its closed. And
nginx reports a 400 in this instance. I’ve gathered this based on a
different forum entry. And when this 400 is logged, the
$request_filename is /etc/nginx//html

So I’m looking at any possibility where the 400s can be logged else
where. I tried the following with no luck as well;

server {
location / {
if ($request_filename ~* /etc/nginx) {
access_log /someotherlog.log myformat
}
}
}

Any help/advice is much appreciated. Thanks!!

Cheers
– Imran

Posted at Nginx Forum:

Also to add on a bit more about the chrome connection issue which is
causing the 400, I turned on info logging for error logs and when I get
the 400, it logs a ‘client closed prematurely connection while reading
client request…’ in the error logs.

Cheers
– Imran

Posted at Nginx Forum:

On 7 Nov 2011 11h21 WET, [email protected] wrote:

used before its closed. And nginx reports a 400 in this
instance. I’ve gathered this based on a different forum entry. And
when this 400 is logged, the $request_filename is /etc/nginx//html

Try (untested):

at the http level:

map $request_filename $is_400 {
default 0;
/etc/nginx/html 1;
}

on the vhost config:

error_page 400 @log-400;

location @log-400 {

access_log /path/to/400.log;

}

Caveat emptor: I’ve never played with the access_log directive that
much.

— appa

On 7 Nov 2011 11h38 WET, [email protected] wrote:

understood to be is due to the nature of connections opened by
default 0;
/etc/nginx/html 1;
}

Oops. Solly I haven’t my coffe yet :slight_smile:

Try (untested):

at the http level:

map $request_filename $is_400 {
default 0;
/etc/nginx/html 1;
}

On the vhost:

if ($is_400) {
return 302 @log-400;
}

location @log-400 {
access_log /path/to/400.log;
}

— appa

Hi

Thanks for your reply. I tried this but didn’t have any luck with it.
Based on the error reported on the error log (client closed permaturely
connection while reading client request line), I’m wondering if i can
instead ignore logging those errors in the access logs. Would you if
that’s possible? Thanks!!

Cheers
– Imran

Posted at Nginx Forum:

On 7 Nov 2011 13h03 WET, [email protected] wrote:

Well you can try this:

location @is-400 {
access_log off;
}

If you want to re-purpose the 400 code you have to use the error_page
directive.

— appa