]> err.no Git - varnish/commitdiff
varnishncsa is now able to produce backend logs. A couple of problems still remain...
authorcecilihf <cecilihf@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Wed, 30 May 2007 09:53:49 +0000 (09:53 +0000)
committercecilihf <cecilihf@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Wed, 30 May 2007 09:53:49 +0000 (09:53 +0000)
git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@1479 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/bin/varnishncsa/varnishncsa.c
varnish-cache/lib/libvarnishapi/shmlog.c

index 6bab50be4c37b622901fd4b7126c2eb0e56ad00d..41e5d0fef903f58b7634a0a7e3f8f1f1418cc7ff 100644 (file)
@@ -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, "- ");
index 3b92e13da24c7a40f52bed5b3e9fefcd2a2e8183..e6cd0ce243fb469fa1084f3eee2451b712a62e23 100644 (file)
@@ -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;