1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
#ifndef LOGGER_H
#define LOGGER_H
#include "base/atomic.hpp"
#include "base/i2-base.hpp"
#include "base/logger-ti.hpp"
#include <set>
#include <sstream>
namespace icinga
{
/**
* Log severity.
*
* @ingroup base
*/
enum LogSeverity
{
LogDebug,
LogNotice,
LogInformation,
LogWarning,
LogCritical,
// Just for internal comparision
LogNothing,
};
/**
* A log entry.
*
* @ingroup base
*/
struct LogEntry {
double Timestamp; /**< The timestamp when this log entry was created. */
LogSeverity Severity; /**< The severity of this log entry. */
String Facility; /**< The facility this log entry belongs to. */
String Message; /**< The log entry's message. */
};
/**
* A log provider.
*
* @ingroup base
*/
class Logger : public ObjectImpl<Logger>
{
public:
DECLARE_OBJECT(Logger);
static String SeverityToString(LogSeverity severity);
static LogSeverity StringToSeverity(const String& severity);
LogSeverity GetMinSeverity() const;
/**
* Processes the log entry and writes it to the log that is
* represented by this ILogger object.
*
* @param entry The log entry that is to be processed.
*/
virtual void ProcessLogEntry(const LogEntry& entry) = 0;
virtual void Flush() = 0;
static std::set<Logger::Ptr> GetLoggers();
static void DisableConsoleLog();
static void EnableConsoleLog();
static bool IsConsoleLogEnabled();
static void DisableEarlyLogging();
static bool IsEarlyLoggingEnabled();
static void DisableTimestamp();
static void EnableTimestamp();
static bool IsTimestampEnabled();
static void SetConsoleLogSeverity(LogSeverity logSeverity);
static LogSeverity GetConsoleLogSeverity();
static inline
LogSeverity GetMinLogSeverity()
{
return m_MinLogSeverity.load();
}
void SetSeverity(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
void ValidateSeverity(const Lazy<String>& lvalue, const ValidationUtils& utils) final;
protected:
void Start(bool runtimeCreated) override;
void Stop(bool runtimeRemoved) override;
private:
static void UpdateMinLogSeverity();
static std::mutex m_Mutex;
static std::set<Logger::Ptr> m_Loggers;
static bool m_ConsoleLogEnabled;
static std::atomic<bool> m_EarlyLoggingEnabled;
static bool m_TimestampEnabled;
static LogSeverity m_ConsoleLogSeverity;
static std::mutex m_UpdateMinLogSeverityMutex;
static Atomic<LogSeverity> m_MinLogSeverity;
};
class Log
{
public:
Log() = delete;
Log(const Log& other) = delete;
Log& operator=(const Log& rhs) = delete;
Log(LogSeverity severity, String facility, const String& message);
Log(LogSeverity severity, String facility);
~Log();
template<typename T>
Log& operator<<(const T& val)
{
if (!m_IsNoOp) {
m_Buffer << val;
}
return *this;
}
Log& operator<<(const char *val);
private:
LogSeverity m_Severity;
String m_Facility;
std::ostringstream m_Buffer;
bool m_IsNoOp;
};
extern template Log& Log::operator<<(const Value&);
extern template Log& Log::operator<<(const String&);
extern template Log& Log::operator<<(const std::string&);
extern template Log& Log::operator<<(const bool&);
extern template Log& Log::operator<<(const unsigned int&);
extern template Log& Log::operator<<(const int&);
extern template Log& Log::operator<<(const unsigned long&);
extern template Log& Log::operator<<(const long&);
extern template Log& Log::operator<<(const double&);
}
#endif /* LOGGER_H */
|