summaryrefslogtreecommitdiff
path: root/sys/src/cmd/ip/httpd/log.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/ip/httpd/log.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/ip/httpd/log.c')
-rwxr-xr-xsys/src/cmd/ip/httpd/log.c104
1 files changed, 104 insertions, 0 deletions
diff --git a/sys/src/cmd/ip/httpd/log.c b/sys/src/cmd/ip/httpd/log.c
new file mode 100755
index 000000000..ad97238e9
--- /dev/null
+++ b/sys/src/cmd/ip/httpd/log.c
@@ -0,0 +1,104 @@
+#include <u.h>
+#include <libc.h>
+#include "httpd.h"
+#include "httpsrv.h"
+
+int logall[3]; /* logall[2] is in "Common Log Format" */
+
+static char *
+monname[12] =
+{
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+};
+
+void
+logit(HConnect *c, char *fmt, ...)
+{
+ char buf[4096];
+ va_list arg;
+ HSPriv *p;
+
+ va_start(arg, fmt);
+ vseprint(buf, buf+sizeof(buf), fmt, arg);
+ va_end(arg);
+ p = nil;
+ if(c != nil)
+ p = c->private;
+ if(p != nil && p->remotesys != nil)
+ syslog(0, HTTPLOG, "%s %s", p->remotesys, buf);
+ else
+ syslog(0, HTTPLOG, "%s", buf);
+}
+
+void
+writelog(HConnect *c, char *fmt, ...)
+{
+ HSPriv *p;
+ char buf[HBufSize+500], *bufp, *bufe;
+ char statuscode[4];
+ vlong objectsize;
+ ulong now, today;
+ int logfd;
+ va_list arg;
+ Tm *tm;
+
+ if(c == nil)
+ return;
+ p = c->private;
+ bufe = buf + sizeof(buf);
+ now = time(nil);
+ tm = gmtime(now);
+ today = now / (24*60*60);
+
+ /* verbose logfile, for research on web traffic */
+ logfd = logall[today & 1];
+ if(logfd > 0){
+ if(c->hstop == c->header || c->hstop[-1] != '\n')
+ *c->hstop = '\n';
+ *c->hstop = '\0';
+ bufp = seprint(buf, bufe, "==========\n");
+ bufp = seprint(bufp, bufe, "LogTime: %D\n", now);
+ bufp = seprint(bufp, bufe, "ConnTime: %D\n", c->reqtime);
+ bufp = seprint(bufp, bufe, "RemoteIP: %s\n", p->remotesys);
+ bufp = seprint(bufp, bufe, "Port: %s\n", p->remoteserv);
+ va_start(arg, fmt);
+ bufp = vseprint(bufp, bufe, fmt, arg);
+ va_end(arg);
+ if(c->req.uri != nil && c->req.uri[0] != 0)
+ bufp = seprint(bufp, bufe, "FinalURI: %s\n", c->req.uri);
+ bufp = seprint(bufp, bufe, "----------\n%s\n", (char*)c->header);
+ write(logfd, buf, bufp-buf); /* append-only file */
+ }
+
+ /* another log, with less information but formatted for common analysis tools */
+ if(logall[2] > 0 && strncmp(fmt, "Reply: ", 7) == 0){
+ objectsize = 0;
+ strecpy(statuscode, statuscode+4, fmt+7);
+ if( fmt[7] == '%'){
+ va_start(arg, fmt);
+ vseprint(statuscode, statuscode+4, fmt+7, arg);
+ va_end(arg);
+ }else if(
+ strcmp(fmt+7, "200 file %lld %lld\n") == 0 ||
+ strcmp(fmt+7, "206 partial content %lld %lld\n") == 0 ||
+ strcmp(fmt+7, "206 partial content, early termination %lld %lld\n") == 0){
+ va_start(arg, fmt);
+ objectsize = va_arg(arg, vlong); /* length in sendfd.c */
+ USED(objectsize);
+ objectsize = va_arg(arg, vlong); /* wrote in sendfd.c */
+ va_end(arg);
+ }
+ bufp = seprint(buf, bufe, "%s - -", p->remotesys);
+ bufp = seprint(bufp, bufe, " [%.2d/%s/%d:%.2d:%.2d:%.2d +0000]", tm->mday, monname[tm->mon], tm->year+1900, tm->hour, tm->min, tm->sec);
+ if(c->req.uri == nil || c->req.uri[0] == 0){
+ bufp = seprint(bufp, bufe, " \"%.*s\"",
+ (int)utfnlen((char*)c->header, strcspn((char*)c->header, "\r\n")),
+ (char*)c->header);
+ }else{
+ /* use more canonical form of URI, if available */
+ bufp = seprint(bufp, bufe, " \"%s %s HTTP/%d.%d\"", c->req.meth, c->req.uri, c->req.vermaj, c->req.vermin);
+ }
+ bufp = seprint(bufp, bufe, " %s %lld\n", statuscode, objectsize);
+ write(logall[2], buf, bufp-buf); /* append-only file */
+ }
+}