Skip to content

Commit

Permalink
Fix #1675
Browse files Browse the repository at this point in the history
  • Loading branch information
gabime committed Sep 27, 2020
1 parent 3bed783 commit 48d4ed9
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 3 deletions.
30 changes: 27 additions & 3 deletions include/spdlog/sinks/stdout_sinks-inl.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,15 @@
#include <spdlog/pattern_formatter.h>
#include <memory>

#ifdef _WIN32
// under windows using fwrite to non-binary stream results in \r\r\n (see issue #1675)
// so instead we use ::FileWrite
#include <spdlog/details/windows_include.h>
#include <fileapi.h> // WriteFile (..)
#include <io.h> // _get_osfhandle(..)
#include <stdio.h> // _fileno(..)
#endif // WIN32

namespace spdlog {

namespace sinks {
Expand All @@ -20,16 +29,31 @@ SPDLOG_INLINE stdout_sink_base<ConsoleMutex>::stdout_sink_base(FILE *file)
: mutex_(ConsoleMutex::mutex())
, file_(file)
, formatter_(details::make_unique<spdlog::pattern_formatter>())
{}
{
#ifdef _WIN32
// get windows handle from the FILE* object
handle_ = (HANDLE)::_get_osfhandle(::_fileno(file_));
if (handle_ == INVALID_HANDLE_VALUE)
{
throw_spdlog_ex("spdlog::stdout_sink_base: _get_osfhandle() failed", errno);
}
#endif // WIN32
}

template<typename ConsoleMutex>
SPDLOG_INLINE void stdout_sink_base<ConsoleMutex>::log(const details::log_msg &msg)
{
std::lock_guard<mutex_t> lock(mutex_);
memory_buf_t formatted;
formatter_->format(msg, formatted);
fwrite(formatted.data(), sizeof(char), formatted.size(), file_);
fflush(file_); // flush every line to terminal
#ifdef _WIN32
auto size = static_cast<DWORD>(formatted.size());
DWORD bytes_written = 0;
::WriteFile(handle_, formatted.data(), size, &bytes_written, nullptr);
#else
::fwrite(formatted.data(), sizeof(char), formatted.size(), file_);
::fflush(file_); // flush every line to terminal
#endif // WIN32
}

template<typename ConsoleMutex>
Expand Down
4 changes: 4 additions & 0 deletions include/spdlog/sinks/stdout_sinks.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <spdlog/details/synchronous_factory.h>
#include <spdlog/sinks/sink.h>
#include <cstdio>
#include <spdlog/details/windows_include.h>

namespace spdlog {

Expand Down Expand Up @@ -36,6 +37,9 @@ class stdout_sink_base : public sink
mutex_t &mutex_;
FILE *file_;
std::unique_ptr<spdlog::formatter> formatter_;
#ifdef _WIN32
HANDLE handle_;
#endif // WIN32
};

template<typename ConsoleMutex>
Expand Down

0 comments on commit 48d4ed9

Please sign in to comment.