Skip to content

Commit

Permalink
OrcLib: Log: add to sink custom backtrace trigger level support
Browse files Browse the repository at this point in the history
  • Loading branch information
fabienfl-orc committed Feb 11, 2021
1 parent a87bd4d commit 15705cf
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 4 deletions.
8 changes: 7 additions & 1 deletion src/OrcLib/Log/Logger.h
Expand Up @@ -102,6 +102,12 @@ class Logger
void Error(Args&&... args)
{
Error(Facility::kDefault, std::forward<Args>(args)...);

auto defaultLogger = Get(Facility::kDefault);
if (defaultLogger)
{
defaultLogger->DumpBacktrace(SpdlogLogger::BacktraceDumpReason::Error);
}
}

template <typename... Args>
Expand All @@ -113,7 +119,7 @@ class Logger
auto defaultLogger = Get(Facility::kDefault);
if (defaultLogger)
{
defaultLogger->DumpBacktrace();
defaultLogger->DumpBacktrace(SpdlogLogger::BacktraceDumpReason::CriticalError);
}
}

Expand Down
22 changes: 20 additions & 2 deletions src/OrcLib/Log/SpdlogLogger.cpp
Expand Up @@ -46,8 +46,18 @@ void SpdlogLogger::DisableBacktrace()
m_logger->disable_backtrace();
}

void SpdlogLogger::DumpBacktrace()
void SpdlogLogger::DumpBacktrace(BacktraceDumpReason reason)
{
Log::Level trigger;
if (reason == BacktraceDumpReason::Manual)
{
trigger = Log::Level::Trace;
}
else
{
trigger = static_cast<Log::Level>(reason);
}

// Backup log settings
const auto loggerLevel = static_cast<Log::Level>(m_logger->level());
m_logger->set_level(spdlog::level::trace);
Expand All @@ -63,7 +73,15 @@ void SpdlogLogger::DumpBacktrace()
{
sinksSettings[i] = {m_sinks[i]->Level(), m_sinks[i]->CloneFormatter()};

m_sinks[i]->SetLevel(Log::Level::Trace);
if (m_sinks[i]->BacktraceTrigger() != Log::Level::Off && trigger >= m_sinks[i]->BacktraceTrigger())
{
m_sinks[i]->SetLevel(Log::Level::Trace);
}
else
{
m_sinks[i]->SetLevel(Log::Level::Off);
}

m_sinks[i]->SetFormatter(m_backtraceFormatter->clone());
}

Expand Down
9 changes: 8 additions & 1 deletion src/OrcLib/Log/SpdlogLogger.h
Expand Up @@ -27,6 +27,13 @@ class SpdlogLogger
public:
using Ptr = std::shared_ptr<SpdlogLogger>;

enum class BacktraceDumpReason
{
Manual = 0,
Error = static_cast<int>(Log::Level::Error),
CriticalError = static_cast<int>(Log::Level::Critical)
};

SpdlogLogger(const std::string& name);

void Add(SpdlogSink::Ptr sink);
Expand All @@ -39,7 +46,7 @@ class SpdlogLogger

void EnableBacktrace(size_t messageCount);
void DisableBacktrace();
void DumpBacktrace();
void DumpBacktrace(BacktraceDumpReason reason);

void SetErrorHandler(std::function<void(const std::string&)> handler);

Expand Down
5 changes: 5 additions & 0 deletions src/OrcLib/Log/SpdlogSink.h
Expand Up @@ -34,6 +34,9 @@ class SpdlogSink
Log::Level Level() const { return static_cast<Log::Level>(m_sink->level()); }
void SetLevel(Log::Level level) { m_sink->set_level(static_cast<spdlog::level::level_enum>(level)); }

Log::Level BacktraceTrigger() const { return m_backtraceTrigger; }
void SetBacktraceTrigger(Log::Level level) { m_backtraceTrigger = level; }

std::unique_ptr<spdlog::formatter> CloneFormatter() const
{
if (m_formatter == nullptr)
Expand Down Expand Up @@ -65,12 +68,14 @@ class SpdlogSink
protected:
SpdlogSink(std::unique_ptr<spdlog::sinks::sink> sink)
: m_sink(std::move(sink))
, m_backtraceTrigger(Level::Off)
{
}

protected:
std::shared_ptr<spdlog::sinks::sink> m_sink;
std::unique_ptr<spdlog::formatter> m_formatter;
Log::Level m_backtraceTrigger;
};

} // namespace Log
Expand Down

0 comments on commit 15705cf

Please sign in to comment.