Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
S
spdlog
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
spdlog
Commits
c1386853
Commit
c1386853
authored
Jul 14, 2019
by
gabime
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix issue #1147
parent
3a94a605
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
94 additions
and
53 deletions
+94
-53
wincolor_sink-inl.h
include/spdlog/sinks/wincolor_sink-inl.h
+89
-53
wincolor_sink.h
include/spdlog/sinks/wincolor_sink.h
+5
-0
No files found.
include/spdlog/sinks/wincolor_sink-inl.h
View file @
c1386853
...
...
@@ -11,14 +11,18 @@
#include "spdlog/details/pattern_formatter.h"
namespace
spdlog
{
namespace
sinks
{
namespace
sinks
{
template
<
typename
ConsoleMutex
>
SPDLOG_INLINE
wincolor_sink
<
ConsoleMutex
>::
wincolor_sink
(
HANDLE
out_handle
,
color_mode
mode
)
template
<
typename
ConsoleMutex
>
SPDLOG_INLINE
wincolor_sink
<
ConsoleMutex
>::
wincolor_sink
(
HANDLE
out_handle
,
color_mode
mode
)
:
out_handle_
(
out_handle
)
,
mutex_
(
ConsoleMutex
::
mutex
())
,
formatter_
(
details
::
make_unique
<
spdlog
::
pattern_formatter
>
())
{
{
// check if out_handle is points to the actual console.
// ::GetConsoleMode() should return 0 if it is redirected or not valid console handle.
DWORD
console_mode
;
in_console_
=
::
GetConsoleMode
(
out_handle
,
&
console_mode
)
!=
0
;
set_color_mode
(
mode
);
colors_
[
level
::
trace
]
=
WHITE
;
colors_
[
level
::
debug
]
=
CYAN
;
...
...
@@ -27,28 +31,34 @@ SPDLOG_INLINE wincolor_sink<ConsoleMutex>::wincolor_sink(HANDLE out_handle, colo
colors_
[
level
::
err
]
=
RED
|
BOLD
;
// red bold
colors_
[
level
::
critical
]
=
BACKGROUND_RED
|
WHITE
|
BOLD
;
// white bold on red background
colors_
[
level
::
off
]
=
0
;
}
}
template
<
typename
ConsoleMutex
>
SPDLOG_INLINE
wincolor_sink
<
ConsoleMutex
>::~
wincolor_sink
()
{
template
<
typename
ConsoleMutex
>
SPDLOG_INLINE
wincolor_sink
<
ConsoleMutex
>::~
wincolor_sink
()
{
this
->
flush
();
}
}
// change the color for the given level
template
<
typename
ConsoleMutex
>
void
SPDLOG_INLINE
wincolor_sink
<
ConsoleMutex
>::
set_color
(
level
::
level_enum
level
,
WORD
color
)
{
// change the color for the given level
template
<
typename
ConsoleMutex
>
void
SPDLOG_INLINE
wincolor_sink
<
ConsoleMutex
>::
set_color
(
level
::
level_enum
level
,
WORD
color
)
{
std
::
lock_guard
<
mutex_t
>
lock
(
mutex_
);
colors_
[
level
]
=
color
;
}
}
template
<
typename
ConsoleMutex
>
void
SPDLOG_INLINE
wincolor_sink
<
ConsoleMutex
>::
log
(
const
details
::
log_msg
&
msg
)
{
template
<
typename
ConsoleMutex
>
void
SPDLOG_INLINE
wincolor_sink
<
ConsoleMutex
>::
log
(
const
details
::
log_msg
&
msg
)
{
std
::
lock_guard
<
mutex_t
>
lock
(
mutex_
);
fmt
::
memory_buffer
formatted
;
formatter_
->
format
(
msg
,
formatted
);
if
(
!
in_console_
)
{
write_to_file_
(
formatted
);
return
;
}
if
(
should_do_colors_
&&
msg
.
color_range_end
>
msg
.
color_range_start
)
{
// before color range
...
...
@@ -66,31 +76,32 @@ void SPDLOG_INLINE wincolor_sink<ConsoleMutex>::log(const details::log_msg &msg)
{
print_range_
(
formatted
,
0
,
formatted
.
size
());
}
}
}
template
<
typename
ConsoleMutex
>
void
SPDLOG_INLINE
wincolor_sink
<
ConsoleMutex
>::
flush
()
{
template
<
typename
ConsoleMutex
>
void
SPDLOG_INLINE
wincolor_sink
<
ConsoleMutex
>::
flush
()
{
// windows console always flushed?
}
}
template
<
typename
ConsoleMutex
>
void
SPDLOG_INLINE
wincolor_sink
<
ConsoleMutex
>::
set_pattern
(
const
std
::
string
&
pattern
)
{
template
<
typename
ConsoleMutex
>
void
SPDLOG_INLINE
wincolor_sink
<
ConsoleMutex
>::
set_pattern
(
const
std
::
string
&
pattern
)
{
std
::
lock_guard
<
mutex_t
>
lock
(
mutex_
);
formatter_
=
std
::
unique_ptr
<
spdlog
::
formatter
>
(
new
pattern_formatter
(
pattern
));
}
}
template
<
typename
ConsoleMutex
>
void
SPDLOG_INLINE
wincolor_sink
<
ConsoleMutex
>::
set_formatter
(
std
::
unique_ptr
<
spdlog
::
formatter
>
sink_formatter
)
{
template
<
typename
ConsoleMutex
>
void
SPDLOG_INLINE
wincolor_sink
<
ConsoleMutex
>::
set_formatter
(
std
::
unique_ptr
<
spdlog
::
formatter
>
sink_formatter
)
{
std
::
lock_guard
<
mutex_t
>
lock
(
mutex_
);
formatter_
=
std
::
move
(
sink_formatter
);
}
}
template
<
typename
ConsoleMutex
>
void
SPDLOG_INLINE
wincolor_sink
<
ConsoleMutex
>::
set_color_mode
(
color_mode
mode
)
{
template
<
typename
ConsoleMutex
>
void
SPDLOG_INLINE
wincolor_sink
<
ConsoleMutex
>::
set_color_mode
(
color_mode
mode
)
{
switch
(
mode
)
{
case
color_mode
:
:
always
:
...
...
@@ -103,12 +114,13 @@ void SPDLOG_INLINE wincolor_sink<ConsoleMutex>::set_color_mode(color_mode mode)
default
:
should_do_colors_
=
true
;
}
}
}
// set color and return the orig console attributes (for resetting later)
template
<
typename
ConsoleMutex
>
WORD
SPDLOG_INLINE
wincolor_sink
<
ConsoleMutex
>::
set_console_attribs
(
WORD
attribs
)
{
// set color and return the orig console attributes (for resetting later)
template
<
typename
ConsoleMutex
>
WORD
SPDLOG_INLINE
wincolor_sink
<
ConsoleMutex
>::
set_console_attribs
(
WORD
attribs
)
{
in_console_
CONSOLE_SCREEN_BUFFER_INFO
orig_buffer_info
;
::
GetConsoleScreenBufferInfo
(
out_handle_
,
&
orig_buffer_info
);
WORD
back_color
=
orig_buffer_info
.
wAttributes
;
...
...
@@ -117,27 +129,50 @@ WORD SPDLOG_INLINE wincolor_sink<ConsoleMutex>::set_console_attribs(WORD attribs
// keep the background color unchanged
::
SetConsoleTextAttribute
(
out_handle_
,
attribs
|
back_color
);
return
orig_buffer_info
.
wAttributes
;
// return orig attribs
}
}
// print a range of formatted message to console
template
<
typename
ConsoleMutex
>
void
SPDLOG_INLINE
wincolor_sink
<
ConsoleMutex
>::
print_range_
(
const
fmt
::
memory_buffer
&
formatted
,
size_t
start
,
size_t
end
)
{
// print a range of formatted message to console
template
<
typename
ConsoleMutex
>
void
SPDLOG_INLINE
wincolor_sink
<
ConsoleMutex
>::
print_range_
(
const
fmt
::
memory_buffer
&
formatted
,
size_t
start
,
size_t
end
)
{
auto
size
=
static_cast
<
DWORD
>
(
end
-
start
);
::
WriteConsoleA
(
out_handle_
,
formatted
.
data
()
+
start
,
size
,
nullptr
,
nullptr
);
}
}
template
<
typename
ConsoleMutex
>
void
SPDLOG_INLINE
wincolor_sink
<
ConsoleMutex
>::
write_to_file_
(
const
fmt
::
memory_buffer
&
formatted
)
{
auto
size
=
static_cast
<
DWORD
>
(
formatted
.
size
());
if
(
size
==
0
)
{
return
;
}
DWORD
total_written
=
0
;
do
{
DWORD
bytes_written
=
0
;
bool
ok
=
WriteFile
(
out_handle_
,
formatted
.
data
(),
size
,
&
bytes_written
,
nullptr
)
!=
0
;
if
(
!
ok
||
bytes_written
==
0
)
{
throw
spdlog_ex
(
"wincolor_sink: write_to_file_ failed. GetLastError(): "
+
std
::
to_string
(
::
GetLastError
()));
}
total_written
+=
bytes_written
;
}
while
(
total_written
<
size
);
}
// wincolor_stdout_sink
template
<
typename
ConsoleMutex
>
SPDLOG_INLINE
wincolor_stdout_sink
<
ConsoleMutex
>::
wincolor_stdout_sink
(
color_mode
mode
)
// wincolor_stdout_sink
template
<
typename
ConsoleMutex
>
SPDLOG_INLINE
wincolor_stdout_sink
<
ConsoleMutex
>::
wincolor_stdout_sink
(
color_mode
mode
)
:
wincolor_sink
<
ConsoleMutex
>
(
::
GetStdHandle
(
STD_OUTPUT_HANDLE
),
mode
)
{}
{}
// wincolor_stderr_sink
template
<
typename
ConsoleMutex
>
SPDLOG_INLINE
wincolor_stderr_sink
<
ConsoleMutex
>::
wincolor_stderr_sink
(
color_mode
mode
)
// wincolor_stderr_sink
template
<
typename
ConsoleMutex
>
SPDLOG_INLINE
wincolor_stderr_sink
<
ConsoleMutex
>::
wincolor_stderr_sink
(
color_mode
mode
)
:
wincolor_sink
<
ConsoleMutex
>
(
::
GetStdHandle
(
STD_ERROR_HANDLE
),
mode
)
{}
{}
}
// namespace sinks
}
// namespace sinks
}
// namespace spdlog
\ No newline at end of file
include/spdlog/sinks/wincolor_sink.h
View file @
c1386853
...
...
@@ -50,6 +50,7 @@ protected:
HANDLE
out_handle_
;
mutex_t
&
mutex_
;
bool
should_do_colors_
;
bool
in_console_
;
std
::
unique_ptr
<
spdlog
::
formatter
>
formatter_
;
std
::
unordered_map
<
level
::
level_enum
,
WORD
,
level
::
level_hasher
>
colors_
;
...
...
@@ -57,6 +58,10 @@ protected:
WORD
set_console_attribs
(
WORD
attribs
);
// print a range of formatted message to console
void
print_range_
(
const
fmt
::
memory_buffer
&
formatted
,
size_t
start
,
size_t
end
);
//in case we are redirected to file (not in console mode)
void
write_to_file_
(
const
fmt
::
memory_buffer
&
formatted
);
};
template
<
typename
ConsoleMutex
>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment