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