]> git.ipfire.org Git - thirdparty/squid.git/blob - src/store_log.cc
Docs: Copyright updates for 2018 (#114)
[thirdparty/squid.git] / src / store_log.cc
1 /*
2 * Copyright (C) 1996-2018 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