68 static std::shared_ptr<crash_safe_logger>
create(
69 std::shared_ptr<logger> underlying_logger =
nullptr
71 if (!underlying_logger) {
72 underlying_logger = std::make_shared<logger>(
true, 16384);
75 auto safe_logger = std::shared_ptr<crash_safe_logger>(
99 sigemptyset(&sa.sa_mask);
100 sa.sa_flags = SA_RESTART;
136 auto deadline = std::chrono::steady_clock::now() + timeout;
142 while (std::chrono::steady_clock::now() < deadline) {
152 std::this_thread::sleep_for(std::chrono::milliseconds(10));
180 min_level_.store(level, std::memory_order_release);
188 return min_level_.load(std::memory_order_acquire);
208 void log(log_level level,
const std::string& message) {
210 if (level <
min_level_.load(std::memory_order_acquire)) {
221 const std::string& message,
222 const std::string& file,
224 const std::string& function) {
225 if (level <
min_level_.load(std::memory_order_acquire)) {
229 logger_->log(level, message, file, line, function);
282 instance->emergency_flush();
287 if (instance->old_sigsegv_.sa_handler != SIG_DFL &&
288 instance->old_sigsegv_.sa_handler != SIG_IGN) {
289 instance->old_sigsegv_.sa_handler(signal);
293 if (instance->old_sigabrt_.sa_handler != SIG_DFL &&
294 instance->old_sigabrt_.sa_handler != SIG_IGN) {
295 instance->old_sigabrt_.sa_handler(signal);
Logger with crash recovery and emergency flush capabilities.
std::shared_ptr< logger > get_underlying_logger()
Get the underlying logger.
void log(log_level level, const std::string &message, const std::string &file, int line, const std::string &function)
Log message with source location.
std::mutex handler_mutex_
bool flush_with_timeout(std::chrono::milliseconds timeout)
Flush with timeout to prevent deadlocks.
common::VoidResult start()
Start the underlying logger.
std::chrono::milliseconds auto_flush_interval_
void set_min_level(log_level level)
Set minimum log level (thread-safe)
std::atomic< bool > emergency_flush_active_
std::atomic< bool > stop_auto_flush_
static void signal_handler(int signal)
Signal handler (async-signal-safe)
static std::weak_ptr< crash_safe_logger > global_instance_
struct sigaction old_sigsegv_
void set_auto_flush_interval(std::chrono::milliseconds interval)
Enable auto-flush at regular intervals.
void stop_auto_flush_thread()
Stop auto-flush background thread.
void log(log_level level, const std::string &message)
Log message (delegates to underlying logger)
common::VoidResult stop()
Stop the underlying logger.
void uninstall_crash_handlers()
Remove signal handlers.
struct sigaction old_sigterm_
void start_auto_flush_thread()
Start auto-flush background thread.
void emergency_flush()
Emergency flush (async-signal-safe)
bool install_crash_handlers()
Install signal handlers for crash detection.
log_level get_min_level() const
Get minimum log level (thread-safe)
std::atomic< bool > flush_requested_
struct sigaction old_sigint_
std::atomic< log_level > min_level_
crash_safe_logger(std::shared_ptr< logger > logger)
std::shared_ptr< logger > logger_
static std::shared_ptr< crash_safe_logger > create(std::shared_ptr< logger > underlying_logger=nullptr)
Create crash-safe logger.
struct sigaction old_sigabrt_
std::thread auto_flush_thread_
High-performance, thread-safe logging system with asynchronous capabilities.