privacore-open-source-searc.../Log.h
2017-10-11 11:23:57 +02:00

176 lines
5.4 KiB
C++

// Matt Wells, copyright Feb 2001
// . a great way to record errors encountered during
// . we store the errorMsg, it's length, the type of message and time.
// . when our buf gets full we dump half the messages to the log file (if any)
// . netLogdb can send error msgs for you with it's sendError cmd
// . sendError ( UdpSlot *slot , char *errFormat , ...); (also logs it)
#ifndef GB_LOG_H
#define GB_LOG_H
#include <stdarg.h>
#include <stdint.h>
// THE TYPES OF LOG MESSAGES
// logs information pertaining to more complicated procedures, like
// the merging and dumping of data for the "db" component, or what urls are
// being spidered for the "build" component.
#define LOG_INFO 0x0001
// the default log message type. also logs slow performance.
#define LOG_WARN 0x0004
// the default log message type. also logs slow performance.
#define LOG_ERROR 0x0008
// programmer error. sanity check. always on.
#define LOG_LOGIC 0x0010
// Reminders to fix the code. generally disabled.
#define LOG_REMIND 0x0020
// for debugging. generally disabled.
#define LOG_DEBUG 0x0040
// for tracing. generally disabled. Enabled for specific code
// sections through config UI
#define LOG_TRACE 0x0080
// times various subroutines for debugging performance.
#define LOG_TIMING 0x0100
// initialization (and shutdown) information. also print routines. always on.
#define LOG_INIT 0x0400
// if a url or link gets truncated, uses this in the "build" context. (Url.cpp
// and Links.cpp)
// also used if a document not added due to quota breech. (Msg16.cpp)
// also used if too many nested tags to parse doc correctly (Xml.cpp)
// in the "query" context for serps too big to be cached. (Msg17.cpp)
#define LOG_LIMIT 0x2000
// It is convenient to divide everything into components and allow the admin
// to toggle logging for various aspects, such as performance or timing
// messages, of these components:
// addurls related to adding urls
// admin related to administrative things, sync file, collections
// build related to indexing (high level)
// conf configuration issues
// disk disk reads and writes
// dns dns networking
// http http networking
// loop
// net network later: multicast pingserver. sits atop udpserver.
// query related to querying (high level)
// rdb generic rdb things
// spcache related to determining what urls to spider next
// speller query spell checking
// thread calling threads
// udp udp networking
// example log:
//456456454 0 INIT Gigablast Version 1.234
//454544444 0 INIT thread Allocated 435333 bytes for thread stacks.
//123456789 0 WARN mem Failed to alloc 360000 bytes.
//123456789 0 WARN query Failed to intersect lists. Out of memory.
//123456789 0 WARN query Too many words. Query truncated.
//234234324 0 REQST http 1.2.3.4 GET /index.html User-Agent
//234234324 0 REPLY http 1.2.3.4 sent 34536 bytes
//345989494 0 REQST build GET http://hohum.com/foobar.html
//345989494 0 INFO build http://hohum.com/foobar.html ip=4.5.6.7 : Success
//324234324 0 DEBUG build Skipping xxx.com, would hammer IP.
#define MAX_LOG_MSGS 1024 // in memory
// may also syslog and fprintf the msg.
// ALWAYS returns FALSE (i.e. 0)!!!! so you can say return log.log(...)
void log ( int32_t type , const char *formatString , ... )
__attribute__ ((format(printf, 2, 3)));
// this defaults to type of LOG_WARN
void log ( const char *formatString , ... )
__attribute__ ((format(printf, 1, 2)));
// force it to be logged, even if off on log controls panel
void logf ( int32_t type , const char *formatString , ... )
__attribute__ ((format(printf, 2, 3)));
void loghex( int32_t type, void const *data, const unsigned int len, const char *formatString , ...)
__attribute__ ((format(printf, 4, 5)));
#define logError(msg, ...) \
logf(LOG_ERROR, "%s:%s:%d: " msg, __FILE__, __func__, __LINE__, ##__VA_ARGS__)
#define logDebug(condition, ...) \
do { \
if (condition) { \
logf(LOG_DEBUG, __VA_ARGS__); \
} \
} while (0)
#define logTrace(condition, msg, ...) \
do { \
if (condition) { \
logf(LOG_TRACE, "%s:%s:%d: " msg, __FILE__, __func__, __LINE__, ##__VA_ARGS__); \
} \
} while (0)
#define logHexTrace(condition, data, len, msg, ...) \
do { \
if (condition) { \
loghex(LOG_TRACE, data, len, "%s:%s:%d: " msg, __FILE__, __func__, __LINE__, ##__VA_ARGS__); \
} \
} while (0)
class Log {
public:
// just initialize with no file
Log();
~Log();
// returns true if opened log file successfully, otherwise false
bool init(const char *filename);
bool registerLogRotation();
// . log this msg
// . "msg" must be NULL terminated
// . now is the time of day in milliseconds since the epoch
// . if "now" is 0 we insert the timestamp for you
// . if "asterisk" is true we print an asterisk to indicate that
// the msg was actually logged earlier but only printed now because
// we were in a signal handler at the time
bool logR(int64_t now, int32_t type, const char *msg, bool forced = false);
// returns false if msg should not be logged, true if it should
bool shouldLog(int32_t type, const char *msg);
void reset();
// save before exiting
void close() {}
bool m_disabled;
bool m_logTimestamps;
bool m_logReadableTimestamps;
bool m_logPrefix;
private:
bool makeNewLogFile();
static void rotateLog(int fd, void *state);
const char *m_filename;
int m_fd;
};
extern class Log g_log;
#endif // GB_LOG_H