]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * Copyright (C) 1996-2017 The Squid Software Foundation and contributors | |
3 | * | |
4 | * Squid software is distributed under GPLv2+ license and includes | |
5 | * contributions from numerous individuals and organizations. | |
6 | * Please see the COPYING and CONTRIBUTORS files for details. | |
7 | */ | |
8 | ||
9 | /* DEBUG: section 20 Storage Manager Logging Functions */ | |
10 | ||
11 | #include "squid.h" | |
12 | #include "format/Token.h" | |
13 | #include "HttpReply.h" | |
14 | #include "log/File.h" | |
15 | #include "MemObject.h" | |
16 | #include "mgr/Registration.h" | |
17 | #include "SquidConfig.h" | |
18 | #include "SquidTime.h" | |
19 | #include "Store.h" | |
20 | #include "store_log.h" | |
21 | ||
22 | static const char *storeLogTags[] = { | |
23 | "CREATE", | |
24 | "SWAPIN", | |
25 | "SWAPOUT", | |
26 | "RELEASE", | |
27 | "SO_FAIL", | |
28 | }; | |
29 | ||
30 | static int storeLogTagsCounts[STORE_LOG_SWAPOUTFAIL+1]; | |
31 | static OBJH storeLogTagsHist; | |
32 | ||
33 | static Logfile *storelog = NULL; | |
34 | ||
35 | static String str_unknown; | |
36 | ||
37 | void | |
38 | storeLog(int tag, const StoreEntry * e) | |
39 | { | |
40 | MemObject *mem = e->mem_obj; | |
41 | HttpReply const *reply; | |
42 | ||
43 | if (str_unknown.size()==0) | |
44 | str_unknown="unknown"; //hack. Delay initialization as string doesn't support global variables.. | |
45 | ||
46 | if (NULL == storelog) | |
47 | return; | |
48 | ||
49 | ++storeLogTagsCounts[tag]; | |
50 | if (mem != NULL) { | |
51 | reply = e->getReply(); | |
52 | /* | |
53 | * XXX Ok, where should we print the dir number here? | |
54 | * Because if we print it before the swap file number, it'll break | |
55 | * the existing log format. | |
56 | */ | |
57 | ||
58 | String ctype=(reply->content_type.size() ? reply->content_type.termedBuf() : str_unknown); | |
59 | ||
60 | logfileLineStart(storelog); | |
61 | logfilePrintf(storelog, "%9d.%03d %-7s %02d %08X %s %4d %9d %9d %9d " SQUIDSTRINGPH " %" PRId64 "/%" PRId64 " " SQUIDSBUFPH " %s\n", | |
62 | (int) current_time.tv_sec, | |
63 | (int) current_time.tv_usec / 1000, | |
64 | storeLogTags[tag], | |
65 | e->swap_dirn, | |
66 | e->swap_filen, | |
67 | e->getMD5Text(), | |
68 | reply->sline.status(), | |
69 | (int) reply->date, | |
70 | (int) reply->last_modified, | |
71 | (int) reply->expires, | |
72 | SQUIDSTRINGPRINT(ctype), | |
73 | reply->content_length, | |
74 | e->contentLen(), | |
75 | SQUIDSBUFPRINT(mem->method.image()), | |
76 | mem->logUri()); | |
77 | logfileLineEnd(storelog); | |
78 | } else { | |
79 | /* no mem object. Most RELEASE cases */ | |
80 | logfileLineStart(storelog); | |
81 | logfilePrintf(storelog, "%9d.%03d %-7s %02d %08X %s ? ? ? ? ?/? ?/? ? ?\n", | |
82 | (int) current_time.tv_sec, | |
83 | (int) current_time.tv_usec / 1000, | |
84 | storeLogTags[tag], | |
85 | e->swap_dirn, | |
86 | e->swap_filen, | |
87 | e->getMD5Text()); | |
88 | logfileLineEnd(storelog); | |
89 | } | |
90 | } | |
91 | ||
92 | void | |
93 | storeLogRotate(void) | |
94 | { | |
95 | if (NULL == storelog) | |
96 | return; | |
97 | ||
98 | logfileRotate(storelog, Config.Log.rotateNumber); | |
99 | } | |
100 | ||
101 | void | |
102 | storeLogClose(void) | |
103 | { | |
104 | if (NULL == storelog) | |
105 | return; | |
106 | ||
107 | logfileClose(storelog); | |
108 | ||
109 | storelog = NULL; | |
110 | } | |
111 | ||
112 | static void | |
113 | storeLogRegisterWithCacheManager(void) | |
114 | { | |
115 | Mgr::RegisterAction("store_log_tags", "Histogram of store.log tags", | |
116 | storeLogTagsHist, 0, 1); | |
117 | } | |
118 | ||
119 | void | |
120 | storeLogOpen(void) | |
121 | { | |
122 | storeLogRegisterWithCacheManager(); | |
123 | ||
124 | if (Config.Log.store == NULL || strcmp(Config.Log.store, "none") == 0) { | |
125 | debugs(20, DBG_IMPORTANT, "Store logging disabled"); | |
126 | return; | |
127 | } | |
128 | ||
129 | storelog = logfileOpen(Config.Log.store, 0, 1); | |
130 | } | |
131 | ||
132 | void | |
133 | storeLogTagsHist(StoreEntry *e) | |
134 | { | |
135 | int tag; | |
136 | for (tag = 0; tag <= STORE_LOG_SWAPOUTFAIL; ++tag) { | |
137 | storeAppendPrintf(e, "%s %d\n", | |
138 | storeLogTags[tag], | |
139 | storeLogTagsCounts[tag]); | |
140 | } | |
141 | } | |
142 |