Annotation of libwww/Library/src/HTLog.c, revision 2.15
2.1 frystyk 1: /* HTLog.c
2: ** LOGGING MODULE
3: **
2.3 frystyk 4: ** (c) COPYRIGHT MIT 1995.
2.1 frystyk 5: ** Please first read the full copyright statement in the file COPYRIGH.
2.15 ! frystyk 6: ** @(#) $Id: Date Author State $
2.1 frystyk 7: **
8: ** This module contains a simple logging mechanism for requests.
9: ** The user must open and close the log file!!!
10: **
11: ** History:
12: ** 01 May 95 Henrik Frystyk, frystyk@w3.org
2.2 frystyk 13: ** Bugs:
14: ** ANSI file handling is not capable of handling simultanous writing
15: ** from several processes at the same time in a multi-process environment
2.1 frystyk 16: */
17:
18: /* Library include files */
2.5 frystyk 19: #include "WWWLib.h"
2.1 frystyk 20: #include "HTLog.h" /* Implemented here */
21:
2.10 frystyk 22: PRIVATE FILE *HTLogFile = NULL; /* Log of requests in common format */
2.1 frystyk 23: PRIVATE BOOL HTloglocal = YES; /* Use local or GMT for logfile */
24:
25: /* ------------------------------------------------------------------------- */
26:
27: /* Open a Logfile
28: ** --------------
29: ** You can use either GMT or local time. If no filename is given,
2.4 frystyk 30: ** no log is kept. New log entries can be either appended to an existing
31: ** file or overwriting an exsisting file.
2.1 frystyk 32: ** Returns YES if OK, NO on error
33: */
2.14 frystyk 34: PUBLIC BOOL HTLog_open (const char * filename, BOOL local, BOOL append)
2.1 frystyk 35: {
2.4 frystyk 36: if (!filename || !*filename) {
2.13 eric 37: if (WWWTRACE) HTTrace("Log......... No log file given\n");
2.4 frystyk 38: return NO;
39: }
2.6 frystyk 40: if (WWWTRACE)
2.13 eric 41: HTTrace("Log......... Open log file `%s\'\n", filename);
2.10 frystyk 42: if (HTLogFile) {
2.6 frystyk 43: if (WWWTRACE)
2.13 eric 44: HTTrace("Log......... Already open\n");
2.1 frystyk 45: return NO;
46: }
2.10 frystyk 47: HTLogFile = fopen(filename, append ? "a" : "w");
48: if (!HTLogFile) {
2.6 frystyk 49: if (WWWTRACE)
2.13 eric 50: HTTrace("Log......... Can't open log file `%s\'\n",
2.4 frystyk 51: filename);
2.1 frystyk 52: return NO;
53: }
54: HTloglocal = local; /* remember state */
55: return YES;
56: }
57:
58:
59: /* Close the log file
60: ** ------------------
61: ** Returns YES if OK, NO on error
62: */
2.10 frystyk 63: PUBLIC BOOL HTLog_close (void)
2.1 frystyk 64: {
2.6 frystyk 65: if (WWWTRACE)
2.13 eric 66: HTTrace("Log......... Closing log file\n");
2.10 frystyk 67: if (HTLogFile) {
68: int status = fclose(HTLogFile);
69: HTLogFile = NULL;
2.1 frystyk 70: return (status!=EOF);
71: }
72: return NO;
73: }
74:
2.10 frystyk 75: PUBLIC BOOL HTLog_isOpen (void)
76: {
77: return HTLogFile ? YES : NO;
78: }
2.1 frystyk 79:
2.10 frystyk 80: /* Add entry to the log file
81: ** -------------------------
2.1 frystyk 82: ** Format: <HOST> - - <DATE> <METHOD> <URI> <RESULT> <CONTENT_LENTGH>
2.2 frystyk 83: ** which is almost equivalent to Common Logformat. Permissions on UNIX
84: ** are modified by umask.
2.1 frystyk 85: **
86: ** Returns YES if OK, NO on error
87: **
88: ** BUG: No result code is produced :-( Should be taken from HTError.c
89: */
2.10 frystyk 90: PUBLIC BOOL HTLog_add (HTRequest * request, int status)
2.1 frystyk 91: {
2.10 frystyk 92: if (HTLogFile) {
2.1 frystyk 93: time_t now = time(NULL);
2.5 frystyk 94: HTParentAnchor *anchor = HTRequest_anchor(request);
95: char * uri = HTAnchor_address((HTAnchor *) anchor);
2.13 eric 96: if (WWWTRACE) HTTrace("Log......... Writing log\n");
2.10 frystyk 97: fprintf(HTLogFile, "localhost - - [%s] %s %s %d %ld\n",
2.1 frystyk 98: HTDateTimeStr(&now, HTloglocal),
2.5 frystyk 99: HTMethod_name(HTRequest_method(request)),
2.1 frystyk 100: uri,
2.4 frystyk 101: status,
2.11 frystyk 102: HTAnchor_length(anchor));
2.12 frystyk 103: HT_FREE(uri);
2.10 frystyk 104: return (fflush(HTLogFile)!=EOF); /* Actually update it on disk */
2.1 frystyk 105: }
106: return NO;
107: }
Webmaster