From 5efccfa5e20dce35130d92f227ce39c9781b8542 Mon Sep 17 00:00:00 2001 From: Gabi Melman Date: Sat, 13 Feb 2021 16:11:07 +0200 Subject: [PATCH] Fix #1828 --- include/spdlog/sinks/stdout_sinks-inl.h | 14 ++++++++++++-- include/spdlog/sinks/wincolor_sink-inl.h | 3 +-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/include/spdlog/sinks/stdout_sinks-inl.h b/include/spdlog/sinks/stdout_sinks-inl.h index ab1e7235..230720f4 100644 --- a/include/spdlog/sinks/stdout_sinks-inl.h +++ b/include/spdlog/sinks/stdout_sinks-inl.h @@ -32,8 +32,13 @@ SPDLOG_INLINE stdout_sink_base::stdout_sink_base(FILE *file) { #ifdef _WIN32 // get windows handle from the FILE* object - handle_ = (HANDLE)::_get_osfhandle(::_fileno(file_)); - if (handle_ == INVALID_HANDLE_VALUE) + + handle_ = (HANDLE)::_get_osfhandle(::_fileno(file_)); + + // don't throw to support cases where no console is attached, + // and let the log method to do nothing if (handle_ == INVALID_HANDLE_VALUE). + // throw only if non stdout/stderr target is requested (probably regular file and not console). + if (handle_ == INVALID_HANDLE_VALUE && file != stdout && file != stderr) { throw_spdlog_ex("spdlog::stdout_sink_base: _get_osfhandle() failed", errno); } @@ -43,6 +48,11 @@ SPDLOG_INLINE stdout_sink_base::stdout_sink_base(FILE *file) template SPDLOG_INLINE void stdout_sink_base::log(const details::log_msg &msg) { + if (handle_ == INVALID_HANDLE_VALUE) + { + return; + } + std::lock_guard lock(mutex_); memory_buf_t formatted; formatter_->format(msg, formatted); diff --git a/include/spdlog/sinks/wincolor_sink-inl.h b/include/spdlog/sinks/wincolor_sink-inl.h index 88838f9e..859c4eea 100644 --- a/include/spdlog/sinks/wincolor_sink-inl.h +++ b/include/spdlog/sinks/wincolor_sink-inl.h @@ -59,8 +59,7 @@ template void SPDLOG_INLINE wincolor_sink::log(const details::log_msg &msg) { if (out_handle_ == INVALID_HANDLE_VALUE) - { - // nothing better to do if we don't have valid handle + { return; }