GENIE
Logger.cc
Go to the documentation of this file.
1 
4 #include <ctime>
5 #include <iostream>
6 #include <iomanip>
7 #include <iterator>
8 #include <sstream>
9 #include <stdarg.h>
10 #include <string.h>
11 #include <sys/stat.h>
12 #include <sys/time.h>
13 #include <sys/types.h>
14 
16 #include <genie/utility/Timing.h>
17 #include <genie/query/query.h>
18 #include <genie/table/inv_table.h>
20 
21 #include "Logger.h"
22 
23 using namespace std;
24 using namespace genie::utility;
25 
26 
27 const char * const Logger::LEVEL_NAMES[] =
28 { "NONE ", "ALERT ", "INFO ", "VERBOSE", "DEBUG " };
29 
30 Logger * Logger::logger = NULL;
31 
32 Logger::Logger(int level)
33 {
34  log_level = level;
35  std::string s = currentDateTime();
36  char fout_name[128];
37  sprintf(fout_name, "GPUGENIE_LOG-%s.log", s.c_str());
38  stringstream ss;
39  ss<<"log/"<<string(fout_name);
40  struct stat st;
41  if(stat("log", &st) == -1)
42  mkdir("log", 0700);
43  strcpy(logfile_name, ss.str().c_str());
44  logfile = fopen(logfile_name, "a");
45 }
46 
47 Logger::~Logger()
48 {
49  fclose(logfile);
50 }
51 
52 void Logger::exit(void)
53 {
54  if (logger != NULL)
55  {
56  log(VERBOSE, "---------Exiting Logger----------");
57  delete logger;
58  }
59 
60 }
61 
62 Logger* Logger::_logger(void)
63 {
64  if (logger == NULL)
65  {
66  logger = new Logger(INFO);
67  log(VERBOSE, "---------Starting Logger %s----------",
68  logger->logfile_name);
69 
70  }
71  return logger;
72 }
73 
74 void Logger::set_level(int level)
75 {
76  _logger()->log_level = level;
77 }
78 int Logger::get_level()
79 {
80  return _logger()->log_level;
81 }
82 
83 void Logger::set_logfile_name(const char * name)
84 {
85  if (strcmp(name, _logger()->logfile_name) != 0)
86  {
87  fclose(_logger()->logfile); // close previously opened logger file
88  strcpy(_logger()->logfile_name, name);
89  _logger()->logfile = fopen(_logger()->logfile_name, "a"); // open a new file for logging
90  }
91 
92 }
93 
94 const char * Logger::get_logfile_name()
95 {
96  return _logger()->logfile_name;
97 }
98 
99 int Logger::log(int level, const char *fmt, ...)
100 {
101  va_list args;
102  va_start(args, fmt);
103 
104  timeval curTime;
105  gettimeofday(&curTime, NULL);
106  int milli = curTime.tv_usec / 1000;
107 
108  char buffer[80];
109  strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", localtime(&curTime.tv_sec));
110 
111  char currentTime[84];
112  sprintf(currentTime, "[%s:%03d %s] ", buffer, milli, LEVEL_NAMES[level]);
113  fprintf(_logger()->logger->logfile, "%s", currentTime);
114 
115  char message[1024];
116  vsprintf(message, fmt, args);
117  va_end(args);
118 
119  fprintf(_logger()->logger->logfile, "%s", message);
120  fprintf(_logger()->logger->logfile, "\n");
121 
122  if (_logger()->logger->log_level >= level)
123  {
124  printf("%s", message);
125  printf("\n");
126  return 1;
127  }
128  else
129  {
130  return 0;
131  }
132 }
133 
134 
135 void Logger::logQueries(int level, std::vector<genie::query::Query> &queries, size_t max_print_len)
136 {
137  for (genie::query::Query &q : queries)
138  {
139  Logger::log(level, "Query idx: %d, topk: %d, count_ranges: %d, selectivity: %f",
140  q.index(), q.topk(), q.count_ranges(), q.selectivity());
141  q.print(max_print_len);
142 
143  std::vector<genie::query::Query::dim> dims;
144  q.dump(dims);
145 
146  for (genie::query::Query::dim &d : dims){
147  Logger::log(level, " Dim -- query: %d, order: %d, start_pos: %d, end_pos: %d",
148  d.query, d.order, d.start_pos, d.end_pos);
149  }
150  }
151 }
152 
153 void Logger::logResults(int level, std::vector<genie::query::Query> &queries, std::vector<int> &result,
154  std::vector<int> &result_count, size_t max_print_len)
155 {
156  size_t resultsBeginIdx = 0;
157  for (genie::query::Query &q : queries)
158  {
159  Logger::log(level, "Query idx: %d, topk: %d, count_ranges: %d, selectivity: %f",
160  q.index(), q.topk(), q.count_ranges(), q.selectivity());
161 
162  std::stringstream ss;
163  size_t noResultsToPrint = std::min(q.topk(),static_cast<int>(max_print_len));
164  for (size_t i = 0; i < noResultsToPrint; ++i)
165  ss << result[resultsBeginIdx+i] << "(" << result_count[resultsBeginIdx+i] << ") ";
166  Logger::log(level, " Results: %s", ss.str().c_str());
167  resultsBeginIdx += q.topk();
168  }
169 }
170 
171 void Logger::logTable(int level, genie::table::inv_table *table, size_t max_print_len)
172 {
174  {
175  Logger::log(level, "Inv table not built.");
176  return;
177  }
178  #ifdef GENIE_COMPR
179  genie::table::inv_compr_table* comprTable = dynamic_cast<genie::table::inv_compr_table*>(table);
180  if (comprTable)
181  Logger::log(level,"Compressed table: %s",
183  else
184  Logger::log(level,"Plain table: ");
185  #endif
186 
187  std::stringstream ss;
188  std::vector<int> *ck = table->ck();
189  if (ck)
190  {
191  auto end = (ck->size() <= max_print_len) ? ck->end() : (ck->begin() + max_print_len);
192  std::copy(ck->begin(), end, std::ostream_iterator<int>(ss, " "));
193  Logger::log(level, " CK:\n %s", ss.str().c_str());
194  ss.str(std::string());
195  ss.clear();
196  }
197  std::vector<int> *inv_pos =
198  #ifdef GENIE_COMPR
199  comprTable ? comprTable->uncompressedInvPos() :
200  #endif
201  table->inv_pos();
202  if (inv_pos)
203  {
204  auto end = (inv_pos->size() <= max_print_len) ? inv_pos->end() : (inv_pos->begin() + max_print_len);
205  std::copy(inv_pos->begin(), end, std::ostream_iterator<int>(ss, " "));
206  Logger::log(level, " INV_POS:\n %s", ss.str().c_str());
207  ss.str(std::string());
208  ss.clear();
209  }
210  std::vector<int> *inv =
211  #ifdef GENIE_COMPR
212  comprTable ? comprTable->uncompressedInv() :
213  #endif
214  table->inv();
215  if (inv)
216  {
217  auto end = (inv->size() <= max_print_len) ? inv->end() : (inv->begin() + max_print_len);
218  std::copy(inv->begin(), end, std::ostream_iterator<int>(ss, " "));
219  Logger::log(level, " INV:\n %s", ss.str().c_str());
220  ss.str(std::string());
221  ss.clear();
222  }
223  #ifdef GENIE_COMPR
224  if (comprTable)
225  {
226  std::vector<int> *compr_inv_pos = comprTable->inv_pos();
227  if (compr_inv_pos)
228  {
229  auto end = (compr_inv_pos->size() <= max_print_len) ?
230  compr_inv_pos->end() : (compr_inv_pos->begin() + max_print_len);
231  std::copy(compr_inv_pos->begin(), end, std::ostream_iterator<int>(ss, " "));
232  Logger::log(level, " COMPR_INV_POS:\n %s", ss.str().c_str());
233  ss.str(std::string());
234  ss.clear();
235  }
236  std::vector<uint32_t> *compr_inv = comprTable->compressedInv();
237  if (compr_inv)
238  {
239  auto end = (compr_inv->size() <= max_print_len) ? compr_inv->end() : (compr_inv->begin() + max_print_len);
240  int cnt = 0;
241  for (auto it = compr_inv->begin(); it != end; it++){
242  ss << std::hex << std::setfill('0') << std::setw(8) << *it << " ";
243  if (cnt % 6 == 5)
244  ss << std::endl;
245  cnt++;
246  }
247  Logger::log(level, " COMPR_INV:\n%s", ss.str().c_str());
248  ss.str(std::string());
249  ss.clear();
250  }
251  }
252  #endif
253 }
254 
255 void Logger::logInvLists(int level, const std::vector<std::vector<uint32_t> > &rawInvertedLists,
256  size_t max_print_len)
257 {
258  std::stringstream ss;
259  auto inv_it_end = (rawInvertedLists.size() <= max_print_len)
260  ? rawInvertedLists.end() : (rawInvertedLists.begin() + max_print_len);
261  Logger::log(level, "rawInvertedLists.size(): %d", rawInvertedLists.size());
262  for (auto inv_it = rawInvertedLists.begin(); inv_it != inv_it_end; inv_it++)
263  {
264  const std::vector<uint32_t> &invList = *inv_it;
265  auto end = (invList.size() <= max_print_len) ? invList.end() : (invList.begin() + max_print_len);
266  std::copy(invList.begin(), end, std::ostream_iterator<uint32_t>(ss, " "));
267  Logger::log(level, "*** [%s]", ss.str().c_str());
268  ss.str(std::string());
269  ss.clear();
270  }
271 }
virtual std::vector< int > * inv_pos()
Definition: inv_table.cu:261
The declaration for class inv_table.
Definition: inv_table.h:41
std::vector< uint32_t > * compressedInv()
genie::compression::COMPRESSION_TYPE getCompression() const
Declaration of query class.
virtual std::vector< int > * inv_pos()
virtual std::vector< int > * ck()
Definition: inv_table.cu:242
std::vector< int > * uncompressedInvPos()
define class inv_table
std::string currentDateTime()
Get current data time.
Definition: Timing.cc:10
A utility class to record logs into disk files.
Definition: Logger.h:41
virtual std::vector< int > * inv()
Definition: inv_table.cu:248
Record run-time information.
The second-step struct for processing queries.
Definition: query.h:59
Functions about getting system time.
std::vector< int > * uncompressedInv()
define class inv_compre_table
static std::string getCompressionName(COMPRESSION_TYPE type)