]> git.ipfire.org Git - thirdparty/squid.git/blame_incremental - src/store_log.cc
SourceFormat Enforcement
[thirdparty/squid.git] / src / store_log.cc
... / ...
CommitLineData
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
22static const char *storeLogTags[] = {
23 "CREATE",
24 "SWAPIN",
25 "SWAPOUT",
26 "RELEASE",
27 "SO_FAIL",
28};
29
30static int storeLogTagsCounts[STORE_LOG_SWAPOUTFAIL+1];
31static OBJH storeLogTagsHist;
32
33static Logfile *storelog = NULL;
34
35static String str_unknown;
36
37void
38storeLog(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
92void
93storeLogRotate(void)
94{
95 if (NULL == storelog)
96 return;
97
98 logfileRotate(storelog, Config.Log.rotateNumber);
99}
100
101void
102storeLogClose(void)
103{
104 if (NULL == storelog)
105 return;
106
107 logfileClose(storelog);
108
109 storelog = NULL;
110}
111
112static void
113storeLogRegisterWithCacheManager(void)
114{
115 Mgr::RegisterAction("store_log_tags", "Histogram of store.log tags",
116 storeLogTagsHist, 0, 1);
117}
118
119void
120storeLogOpen(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
132void
133storeLogTagsHist(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