|
|
|
@ -16,10 +16,11 @@ namespace log {
|
|
|
|
|
*/
|
|
|
|
|
static const char * g_LogLevelStr[eNumLogLevels] =
|
|
|
|
|
{
|
|
|
|
|
"none", // eLogNone
|
|
|
|
|
"error", // eLogError
|
|
|
|
|
"warn", // eLogWarn
|
|
|
|
|
"info", // eLogInfo
|
|
|
|
|
"debug" // eLogDebug
|
|
|
|
|
"debug" // eLogDebug
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -46,6 +47,7 @@ namespace log {
|
|
|
|
|
static inline int GetSyslogPrio (enum LogLevel l) {
|
|
|
|
|
int priority = LOG_DEBUG;
|
|
|
|
|
switch (l) {
|
|
|
|
|
case eLogNone : priority = LOG_CRIT; break;
|
|
|
|
|
case eLogError : priority = LOG_ERR; break;
|
|
|
|
|
case eLogWarning : priority = LOG_WARNING; break;
|
|
|
|
|
case eLogInfo : priority = LOG_INFO; break;
|
|
|
|
@ -71,15 +73,15 @@ namespace log {
|
|
|
|
|
void Log::Start ()
|
|
|
|
|
{
|
|
|
|
|
if (!m_IsRunning)
|
|
|
|
|
{
|
|
|
|
|
m_IsRunning = true;
|
|
|
|
|
{
|
|
|
|
|
m_IsRunning = true;
|
|
|
|
|
m_Thread = new std::thread (std::bind (&Log::Run, this));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Log::Stop ()
|
|
|
|
|
void Log::Stop ()
|
|
|
|
|
{
|
|
|
|
|
switch (m_Destination)
|
|
|
|
|
switch (m_Destination)
|
|
|
|
|
{
|
|
|
|
|
#ifndef _WIN32
|
|
|
|
|
case eLogSyslog :
|
|
|
|
@ -97,15 +99,16 @@ namespace log {
|
|
|
|
|
m_IsRunning = false;
|
|
|
|
|
m_Queue.WakeUp ();
|
|
|
|
|
if (m_Thread)
|
|
|
|
|
{
|
|
|
|
|
m_Thread->join ();
|
|
|
|
|
{
|
|
|
|
|
m_Thread->join ();
|
|
|
|
|
delete m_Thread;
|
|
|
|
|
m_Thread = nullptr;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Log::SetLogLevel (const std::string& level) {
|
|
|
|
|
if (level == "error") { m_MinLevel = eLogError; }
|
|
|
|
|
if (level == "none") { m_MinLevel = eLogNone; }
|
|
|
|
|
else if (level == "error") { m_MinLevel = eLogError; }
|
|
|
|
|
else if (level == "warn") { m_MinLevel = eLogWarning; }
|
|
|
|
|
else if (level == "info") { m_MinLevel = eLogInfo; }
|
|
|
|
|
else if (level == "debug") { m_MinLevel = eLogDebug; }
|
|
|
|
@ -115,7 +118,7 @@ namespace log {
|
|
|
|
|
}
|
|
|
|
|
LogPrint(eLogInfo, "Log: min messages level set to ", level);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const char * Log::TimeAsString(std::time_t t) {
|
|
|
|
|
if (t != m_LastTimestamp) {
|
|
|
|
|
strftime(m_LastDateTime, sizeof(m_LastDateTime), m_TimeFormat.c_str(), localtime(&t));
|
|
|
|
@ -129,7 +132,7 @@ namespace log {
|
|
|
|
|
* Unfortunately, with current startup process with late fork() this
|
|
|
|
|
* will give us nothing but pain. Maybe later. See in NetDb as example.
|
|
|
|
|
*/
|
|
|
|
|
void Log::Process(std::shared_ptr<LogMsg> msg)
|
|
|
|
|
void Log::Process(std::shared_ptr<LogMsg> msg)
|
|
|
|
|
{
|
|
|
|
|
if (!msg) return;
|
|
|
|
|
std::hash<std::thread::id> hasher;
|
|
|
|
@ -171,19 +174,20 @@ namespace log {
|
|
|
|
|
if (m_IsRunning)
|
|
|
|
|
m_Queue.Wait ();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Log::Append(std::shared_ptr<i2p::log::LogMsg> & msg)
|
|
|
|
|
void Log::Append(std::shared_ptr<i2p::log::LogMsg> & msg)
|
|
|
|
|
{
|
|
|
|
|
m_Queue.Put(msg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Log::SendTo (const std::string& path)
|
|
|
|
|
void Log::SendTo (const std::string& path)
|
|
|
|
|
{
|
|
|
|
|
if (m_LogStream) m_LogStream = nullptr; // close previous
|
|
|
|
|
if (m_LogStream) m_LogStream = nullptr; // close previous
|
|
|
|
|
if (m_MinLevel == eLogNone) return;
|
|
|
|
|
auto flags = std::ofstream::out | std::ofstream::app;
|
|
|
|
|
auto os = std::make_shared<std::ofstream> (path, flags);
|
|
|
|
|
if (os->is_open ())
|
|
|
|
|
if (os->is_open ())
|
|
|
|
|
{
|
|
|
|
|
m_HasColors = false;
|
|
|
|
|
m_Logfile = path;
|
|
|
|
@ -202,6 +206,7 @@ namespace log {
|
|
|
|
|
|
|
|
|
|
#ifndef _WIN32
|
|
|
|
|
void Log::SendTo(const char *name, int facility) {
|
|
|
|
|
if (m_MinLevel == eLogNone) return;
|
|
|
|
|
m_HasColors = false;
|
|
|
|
|
m_Destination = eLogSyslog;
|
|
|
|
|
m_LogStream = nullptr;
|
|
|
|
|