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