]>
Commit | Line | Data |
---|---|---|
e3ef2b09 | 1 | #include "squid.h" |
2 | ||
3 | static char *storeLogTags[] = | |
4 | { | |
5 | "CREATE", | |
6 | "SWAPIN", | |
7 | "SWAPOUT", | |
8 | "RELEASE" | |
9 | }; | |
10 | ||
11 | static int storelog_fd = -1; | |
12 | ||
13 | void | |
14 | storeLog(int tag, const StoreEntry * e) | |
15 | { | |
16 | LOCAL_ARRAY(char, logmsg, MAX_URL << 1); | |
17 | MemObject *mem = e->mem_obj; | |
18 | struct _http_reply *reply; | |
19 | if (storelog_fd < 0) | |
20 | return; | |
21 | if (mem == NULL) | |
22 | return; | |
23 | if (mem->log_url == NULL) { | |
24 | debug(20, 1) ("storeLog: NULL log_url for %s\n", mem->url); | |
25 | storeMemObjectDump(mem); | |
26 | mem->log_url = xstrdup(mem->url); | |
27 | } | |
28 | reply = mem->reply; | |
29 | snprintf(logmsg, MAX_URL << 1, "%9d.%03d %-7s %08X %4d %9d %9d %9d %s %d/%d %s %s\n", | |
30 | (int) current_time.tv_sec, | |
31 | (int) current_time.tv_usec / 1000, | |
32 | storeLogTags[tag], | |
33 | e->swap_file_number, | |
34 | reply->code, | |
35 | (int) reply->date, | |
36 | (int) reply->last_modified, | |
37 | (int) reply->expires, | |
38 | reply->content_type[0] ? reply->content_type : "unknown", | |
39 | reply->content_length, | |
40 | (int) (mem->inmem_hi - mem->reply->hdr_sz), | |
41 | RequestMethodStr[mem->method], | |
42 | mem->log_url); | |
43 | file_write(storelog_fd, | |
44 | -1, | |
45 | xstrdup(logmsg), | |
46 | strlen(logmsg), | |
47 | NULL, | |
48 | NULL, | |
49 | xfree); | |
50 | } | |
51 | ||
52 | void | |
53 | storeLogRotate(void) | |
54 | { | |
55 | char *fname = NULL; | |
56 | int i; | |
57 | LOCAL_ARRAY(char, from, MAXPATHLEN); | |
58 | LOCAL_ARRAY(char, to, MAXPATHLEN); | |
59 | #ifdef S_ISREG | |
60 | struct stat sb; | |
61 | #endif | |
62 | ||
63 | if (storelog_fd > -1) { | |
64 | file_close(storelog_fd); | |
65 | storelog_fd = -1; | |
66 | } | |
67 | if ((fname = Config.Log.store) == NULL) | |
68 | return; | |
69 | if (strcmp(fname, "none") == 0) | |
70 | return; | |
71 | #ifdef S_ISREG | |
72 | if (stat(fname, &sb) == 0) | |
73 | if (S_ISREG(sb.st_mode) == 0) | |
74 | return; | |
75 | #endif | |
76 | ||
77 | debug(20, 1) ("storeLogRotate: Rotating.\n"); | |
78 | ||
79 | /* Rotate numbers 0 through N up one */ | |
80 | for (i = Config.Log.rotateNumber; i > 1;) { | |
81 | i--; | |
82 | snprintf(from, MAXPATHLEN, "%s.%d", fname, i - 1); | |
83 | snprintf(to, MAXPATHLEN, "%s.%d", fname, i); | |
84 | rename(from, to); | |
85 | } | |
86 | /* Rotate the current log to .0 */ | |
87 | if (Config.Log.rotateNumber > 0) { | |
88 | snprintf(to, MAXPATHLEN, "%s.%d", fname, 0); | |
89 | rename(fname, to); | |
90 | } | |
91 | storelog_fd = file_open(fname, O_WRONLY | O_CREAT, NULL, NULL, NULL); | |
92 | if (storelog_fd < 0) { | |
93 | debug(50, 0) ("storeLogRotate: %s: %s\n", fname, xstrerror()); | |
94 | debug(20, 1) ("Store logging disabled\n"); | |
95 | } | |
96 | } | |
97 | ||
98 | void | |
99 | storeLogClose(void) | |
100 | { | |
101 | if (storelog_fd >= 0) | |
102 | file_close(storelog_fd); | |
103 | } | |
104 | ||
105 | void | |
106 | storeLogOpen(void) | |
107 | { | |
108 | if (strcmp(Config.Log.store, "none") == 0) | |
109 | storelog_fd = -1; | |
110 | else | |
111 | storelog_fd = file_open(Config.Log.store, | |
112 | O_WRONLY | O_CREAT, | |
113 | NULL, | |
114 | NULL, | |
115 | NULL); | |
116 | if (storelog_fd < 0) | |
117 | debug(20, 1) ("Store logging disabled\n"); | |
118 | } |