Logging to syslog via Embedded C and http-range support
Wido den Hollander
wido at widodh.nl
Wed Nov 3 14:51:14 CET 2010
Hi all,
In our current setup (without Varnish) we have a cluster of Apache
webservers which all log to syslog.
Via a remote-syslog machine we collect all the logs and parse them and
do with them what we want.
We use a specific logformat, so using varnishncsa is not possible (yet).
Right now I've written the following code:
sub vcl_deliver {
C{
time_t rawtime;
struct tm * timeinfo;
char timebuffer[80];
time(&rawtime);
timeinfo = localtime(&rawtime);
strftime(timebuffer, 80, "[%d/%b/%Y:%T %z]", timeinfo);
char *referer = VRT_GetHdr(sp, HDR_REQ, "\010Referer:");
if (referer == NULL) {
referer = "-";
}
char *useragent = VRT_GetHdr(sp, HDR_REQ, "\013User-Agent:");
if (useragent == NULL) {
useragent = "-";
}
syslog(LOG_INFO,
"%s %s %s - - \"%s %s %s\" %d %s \"%s\" \"%s\"",
VRT_GetHdr(sp, HDR_REQ, "\005Host:"),
VRT_IP_string(sp, VRT_r_client_ip(sp)),
timebuffer,
VRT_r_req_request(sp),
VRT_r_req_url(sp),
VRT_r_req_proto(sp),
VRT_r_obj_status(sp),
VRT_GetHdr(sp, HDR_RESP, "\017Content-Length:"),
referer,
useragent);
}C
}
This works fine, I get the logs in the format I want it to be, but when
enabling http_range_support I get strange behaviour.
$ curl -i -r 0-500 <url>
When doing that, I get a 206 response from Varnish with a Content-Length
of 501 bytes, but my logfile shows a obj_status of 200 and a
Content-Length of almost 10kb (the actual size of the object).
It seems to me that the actual headers to the client are somewhere
overwritten when using http_range_support.
Is this because of the experimental http_range_support? Or is it
possible to collect the correct data somewhere so I can log it?
Thank you,
Wido
More information about the varnish-misc
mailing list