From: cecilihf Date: Wed, 30 May 2007 09:53:49 +0000 (+0000) Subject: varnishncsa is now able to produce backend logs. A couple of problems still remain... X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2a5a86a9f72749834dc3e2d896d562c43ed58506;p=varnish varnishncsa is now able to produce backend logs. A couple of problems still remain: missing hostname and timestamp for backend communication. This could be solved with some extra tags serving the same purpose as ReqStart and ReqEnd does for client communication, providing this information. git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@1479 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- diff --git a/varnish-cache/bin/varnishncsa/varnishncsa.c b/varnish-cache/bin/varnishncsa/varnishncsa.c index 6bab50be..41e5d0fe 100644 --- a/varnish-cache/bin/varnishncsa/varnishncsa.c +++ b/varnish-cache/bin/varnishncsa/varnishncsa.c @@ -89,6 +89,8 @@ static struct logline { static size_t nll; +static time_t t; + static int isprefix(const char *str, const char *prefix, const char *end, const char **next) { @@ -170,15 +172,14 @@ h_ncsa(void *priv, enum shmlogtag tag, unsigned fd, const char *end, *next; char *q; FILE *fo; - time_t t; long l; struct tm tm; char tbuf[40]; struct logline *lp; end = ptr + len; - - if (!(spec &VSL_S_CLIENT)) + + if (!(spec & VSL_S_CLIENT || spec & VSL_S_BACKEND)) return (0); if (fd >= nll) { @@ -200,6 +201,18 @@ h_ncsa(void *priv, enum shmlogtag tag, unsigned fd, lp = ll[fd]; switch (tag) { + case SLT_BackendOpen: + if (!(spec & VSL_S_BACKEND)) + break; + if (lp->df_h != NULL) + lp->bogus = 1; + else { + if (isprefix(ptr, "default", end, &next)) + lp->df_h = trimfield(next, end); + else + lp->df_h = trimfield(ptr, end); + } + break; case SLT_ReqStart: if (lp->df_h != NULL) lp->bogus = 1; @@ -207,35 +220,71 @@ h_ncsa(void *priv, enum shmlogtag tag, unsigned fd, lp->df_h = trimfield(ptr, end); break; + case SLT_TxRequest: + if (!(spec & VSL_S_BACKEND)) + break; case SLT_RxRequest: + if (tag == SLT_RxRequest && (spec & VSL_S_BACKEND)) + break; + if (lp->df_m != NULL) lp->bogus = 1; else lp->df_m = trimline(ptr, end); break; + case SLT_TxURL: + if (!(spec & VSL_S_BACKEND)) + break; case SLT_RxURL: + if (tag == SLT_RxURL && (spec & VSL_S_BACKEND)) + break; + if (lp->df_Uq != NULL) lp->bogus = 1; else lp->df_Uq = trimline(ptr, end); break; + case SLT_TxProtocol: + if (!(spec & VSL_S_BACKEND)) + break; case SLT_RxProtocol: + if (tag == SLT_RxProtocol && (spec & VSL_S_BACKEND)) + break; + if (lp->df_H != NULL) lp->bogus = 1; else lp->df_H = trimline(ptr, end); break; + case SLT_RxStatus: + if (!(spec & VSL_S_BACKEND)) + break; case SLT_TxStatus: + if (tag == SLT_TxStatus && (spec & VSL_S_BACKEND)) + break; + if (lp->df_s != NULL) lp->bogus = 1; else lp->df_s = trimline(ptr, end); break; + case SLT_TxHeader: + if (!(spec & VSL_S_BACKEND)) + break; case SLT_RxHeader: + if (tag == SLT_RxHeader && (spec & VSL_S_BACKEND)) { + if (isprefix(ptr, "content-length:", end, &next)) { + lp->df_b = trimline(next, end); + } else if (isprefix(ptr, "date:", end, &next)) { + if (strptime(trimline(next, end), "%a, %d %b %Y %T", &tm)) + t = mktime(&tm); + } + break; + } if (isprefix(ptr, "user-agent:", end, &next)) lp->df_User_agent = trimline(next, end); else if (isprefix(ptr, "referer:", end, &next)) @@ -258,19 +307,28 @@ h_ncsa(void *priv, enum shmlogtag tag, unsigned fd, break; } - if (tag != SLT_ReqEnd) + if ((spec & VSL_S_CLIENT) && tag != SLT_ReqEnd) return (0); - - if (sscanf(ptr, "%*u %*u.%*u %ld.", &l) != 1) - lp->bogus = 1; - else - t = l; - + + if ((spec & VSL_S_BACKEND) && tag != SLT_BackendReuse && + (tag != SLT_BackendClose || lp->df_Uq)) + return (0); + + if (tag == SLT_ReqEnd) { + if (sscanf(ptr, "%*u %*u.%*u %ld.", &l) != 1) + lp->bogus = 1; + else + t = l; + } + if (!lp->bogus) { + fo = priv; - /* %h */ - fprintf(fo, "%s ", lp->df_h ? lp->df_h : "-"); + if (!lp->df_h && spec & VSL_S_BACKEND) + fprintf(fo, "127.0.0.1 "); + else + fprintf(fo, "%s ", lp->df_h ? lp->df_h : "-"); /* %l */ fprintf(fo, "- "); diff --git a/varnish-cache/lib/libvarnishapi/shmlog.c b/varnish-cache/lib/libvarnishapi/shmlog.c index 3b92e13d..e6cd0ce2 100644 --- a/varnish-cache/lib/libvarnishapi/shmlog.c +++ b/varnish-cache/lib/libvarnishapi/shmlog.c @@ -265,6 +265,7 @@ VSL_NextLog(struct VSL_data *vd, unsigned char **pp) vd->map[u] &= ~M_BACKEND; break; case SLT_BackendOpen: + case SLT_BackendXID: vd->map[u] |= M_BACKEND; vd->map[u] &= ~M_CLIENT; break;