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
01f5efa1
Commit
01f5efa1
authored
May 12, 2019
by
gabime
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added wincolor sink to static build
parent
130bc26b
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
128 additions
and
85 deletions
+128
-85
wincolor_sink-inl.h
include/spdlog/sinks/wincolor_sink-inl.h
+103
-0
wincolor_sink.h
include/spdlog/sinks/wincolor_sink.h
+15
-85
spdlog.cpp
src/spdlog.cpp
+10
-0
No files found.
include/spdlog/sinks/wincolor_sink-inl.h
0 → 100644
View file @
01f5efa1
#pragma once
namespace
spdlog
{
namespace
sinks
{
template
<
typename
TargetStream
,
typename
ConsoleMutex
>
SPDLOG_INLINE
wincolor_sink
<
TargetStream
,
ConsoleMutex
>::
wincolor_sink
()
:
out_handle_
(
TargetStream
::
handle
())
,
mutex_
(
ConsoleMutex
::
mutex
())
{
colors_
[
level
::
trace
]
=
WHITE
;
colors_
[
level
::
debug
]
=
CYAN
;
colors_
[
level
::
info
]
=
GREEN
;
colors_
[
level
::
warn
]
=
YELLOW
|
BOLD
;
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
TargetStream
,
typename
ConsoleMutex
>
SPDLOG_INLINE
SPDLOG_INLINE
wincolor_sink
<
TargetStream
,
ConsoleMutex
>::~
wincolor_sink
()
{
this
->
flush
();
}
// change the color for the given level
template
<
typename
TargetStream
,
typename
ConsoleMutex
>
void
SPDLOG_INLINE
wincolor_sink
<
TargetStream
,
ConsoleMutex
>::
set_color
(
level
::
level_enum
level
,
WORD
color
)
{
std
::
lock_guard
<
mutex_t
>
lock
(
mutex_
);
colors_
[
level
]
=
color
;
}
template
<
typename
TargetStream
,
typename
ConsoleMutex
>
void
SPDLOG_INLINE
wincolor_sink
<
TargetStream
,
ConsoleMutex
>::
log
(
const
details
::
log_msg
&
msg
)
{
std
::
lock_guard
<
mutex_t
>
lock
(
mutex_
);
fmt
::
memory_buffer
formatted
;
formatter_
->
format
(
msg
,
formatted
);
if
(
msg
.
color_range_end
>
msg
.
color_range_start
)
{
// before color range
print_range_
(
formatted
,
0
,
msg
.
color_range_start
);
// in color range
auto
orig_attribs
=
set_console_attribs
(
colors_
[
msg
.
level
]);
print_range_
(
formatted
,
msg
.
color_range_start
,
msg
.
color_range_end
);
::
SetConsoleTextAttribute
(
out_handle_
,
orig_attribs
);
// reset to orig colors
// after color range
print_range_
(
formatted
,
msg
.
color_range_end
,
formatted
.
size
());
}
else
// print without colors if color range is invalid
{
print_range_
(
formatted
,
0
,
formatted
.
size
());
}
}
template
<
typename
TargetStream
,
typename
ConsoleMutex
>
void
SPDLOG_INLINE
wincolor_sink
<
TargetStream
,
ConsoleMutex
>::
flush
()
{
// windows console always flushed?
}
template
<
typename
TargetStream
,
typename
ConsoleMutex
>
void
SPDLOG_INLINE
wincolor_sink
<
TargetStream
,
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
TargetStream
,
typename
ConsoleMutex
>
void
SPDLOG_INLINE
wincolor_sink
<
TargetStream
,
ConsoleMutex
>::
set_formatter
(
std
::
unique_ptr
<
spdlog
::
formatter
>
sink_formatter
)
{
std
::
lock_guard
<
mutex_t
>
lock
(
mutex_
);
formatter_
=
std
::
move
(
sink_formatter
);
}
// set color and return the orig console attributes (for resetting later)
template
<
typename
TargetStream
,
typename
ConsoleMutex
>
WORD
SPDLOG_INLINE
wincolor_sink
<
TargetStream
,
ConsoleMutex
>::
set_console_attribs
(
WORD
attribs
)
{
CONSOLE_SCREEN_BUFFER_INFO
orig_buffer_info
;
::
GetConsoleScreenBufferInfo
(
out_handle_
,
&
orig_buffer_info
);
WORD
back_color
=
orig_buffer_info
.
wAttributes
;
// retrieve the current background color
back_color
&=
static_cast
<
WORD
>
(
~
(
FOREGROUND_RED
|
FOREGROUND_GREEN
|
FOREGROUND_BLUE
|
FOREGROUND_INTENSITY
));
// 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
TargetStream
,
typename
ConsoleMutex
>
void
SPDLOG_INLINE
wincolor_sink
<
TargetStream
,
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
);
}
}
}
// namespace spdlog
\ No newline at end of file
include/spdlog/sinks/wincolor_sink.h
View file @
01f5efa1
...
@@ -24,7 +24,7 @@ namespace sinks {
...
@@ -24,7 +24,7 @@ namespace sinks {
* Windows color console sink. Uses WriteConsoleA to write to the console with
* Windows color console sink. Uses WriteConsoleA to write to the console with
* colors
* colors
*/
*/
template
<
typename
OutHandle
,
typename
ConsoleMutex
>
template
<
typename
TargetStream
,
typename
ConsoleMutex
>
class
wincolor_sink
:
public
sink
class
wincolor_sink
:
public
sink
{
{
public
:
public
:
...
@@ -35,100 +35,30 @@ public:
...
@@ -35,100 +35,30 @@ public:
const
WORD
WHITE
=
FOREGROUND_RED
|
FOREGROUND_GREEN
|
FOREGROUND_BLUE
;
const
WORD
WHITE
=
FOREGROUND_RED
|
FOREGROUND_GREEN
|
FOREGROUND_BLUE
;
const
WORD
YELLOW
=
FOREGROUND_RED
|
FOREGROUND_GREEN
;
const
WORD
YELLOW
=
FOREGROUND_RED
|
FOREGROUND_GREEN
;
wincolor_sink
()
wincolor_sink
();
:
out_handle_
(
OutHandle
::
handle
())
~
wincolor_sink
()
override
;
,
mutex_
(
ConsoleMutex
::
mutex
())
{
colors_
[
level
::
trace
]
=
WHITE
;
colors_
[
level
::
debug
]
=
CYAN
;
colors_
[
level
::
info
]
=
GREEN
;
colors_
[
level
::
warn
]
=
YELLOW
|
BOLD
;
colors_
[
level
::
err
]
=
RED
|
BOLD
;
// red bold
colors_
[
level
::
critical
]
=
BACKGROUND_RED
|
WHITE
|
BOLD
;
// white bold on red background
colors_
[
level
::
off
]
=
0
;
}
~
wincolor_sink
()
override
{
this
->
flush
();
}
wincolor_sink
(
const
wincolor_sink
&
other
)
=
delete
;
wincolor_sink
(
const
wincolor_sink
&
other
)
=
delete
;
wincolor_sink
&
operator
=
(
const
wincolor_sink
&
other
)
=
delete
;
wincolor_sink
&
operator
=
(
const
wincolor_sink
&
other
)
=
delete
;
// change the color for the given level
// change the color for the given level
void
set_color
(
level
::
level_enum
level
,
WORD
color
)
void
set_color
(
level
::
level_enum
level
,
WORD
color
);
{
void
log
(
const
details
::
log_msg
&
msg
)
final
override
;
std
::
lock_guard
<
mutex_t
>
lock
(
mutex_
);
void
flush
()
final
override
;
colors_
[
level
]
=
color
;
void
set_pattern
(
const
std
::
string
&
pattern
)
override
final
;
}
void
set_formatter
(
std
::
unique_ptr
<
spdlog
::
formatter
>
sink_formatter
)
override
final
;
void
log
(
const
details
::
log_msg
&
msg
)
final
override
{
std
::
lock_guard
<
mutex_t
>
lock
(
mutex_
);
fmt
::
memory_buffer
formatted
;
formatter_
->
format
(
msg
,
formatted
);
if
(
msg
.
color_range_end
>
msg
.
color_range_start
)
{
// before color range
print_range_
(
formatted
,
0
,
msg
.
color_range_start
);
// in color range
auto
orig_attribs
=
set_console_attribs
(
colors_
[
msg
.
level
]);
print_range_
(
formatted
,
msg
.
color_range_start
,
msg
.
color_range_end
);
::
SetConsoleTextAttribute
(
out_handle_
,
orig_attribs
);
// reset to orig colors
// after color range
print_range_
(
formatted
,
msg
.
color_range_end
,
formatted
.
size
());
}
else
// print without colors if color range is invalid
{
print_range_
(
formatted
,
0
,
formatted
.
size
());
}
}
void
flush
()
final
override
{
// windows console always flushed?
}
void
set_pattern
(
const
std
::
string
&
pattern
)
override
final
{
std
::
lock_guard
<
mutex_t
>
lock
(
mutex_
);
formatter_
=
std
::
unique_ptr
<
spdlog
::
formatter
>
(
new
pattern_formatter
(
pattern
));
}
void
set_formatter
(
std
::
unique_ptr
<
spdlog
::
formatter
>
sink_formatter
)
override
final
{
std
::
lock_guard
<
mutex_t
>
lock
(
mutex_
);
formatter_
=
std
::
move
(
sink_formatter
);
}
private
:
private
:
using
mutex_t
=
typename
ConsoleMutex
::
mutex_t
;
using
mutex_t
=
typename
ConsoleMutex
::
mutex_t
;
// set color and return the orig console attributes (for resetting later)
WORD
set_console_attribs
(
WORD
attribs
)
{
CONSOLE_SCREEN_BUFFER_INFO
orig_buffer_info
;
::
GetConsoleScreenBufferInfo
(
out_handle_
,
&
orig_buffer_info
);
WORD
back_color
=
orig_buffer_info
.
wAttributes
;
// retrieve the current background color
back_color
&=
static_cast
<
WORD
>
(
~
(
FOREGROUND_RED
|
FOREGROUND_GREEN
|
FOREGROUND_BLUE
|
FOREGROUND_INTENSITY
));
// 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
void
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
);
}
HANDLE
out_handle_
;
HANDLE
out_handle_
;
mutex_t
&
mutex_
;
mutex_t
&
mutex_
;
std
::
unordered_map
<
level
::
level_enum
,
WORD
,
level
::
level_hasher
>
colors_
;
std
::
unordered_map
<
level
::
level_enum
,
WORD
,
level
::
level_hasher
>
colors_
;
// set color and return the orig console attributes (for resetting later)
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
);
};
};
using
wincolor_stdout_sink_mt
=
wincolor_sink
<
details
::
console_stdout
,
details
::
console_mutex
>
;
using
wincolor_stdout_sink_mt
=
wincolor_sink
<
details
::
console_stdout
,
details
::
console_mutex
>
;
...
...
src/spdlog.cpp
View file @
01f5efa1
...
@@ -56,12 +56,22 @@ template class spdlog::sinks::rotating_file_sink<spdlog::details::null_mutex>;
...
@@ -56,12 +56,22 @@ template class spdlog::sinks::rotating_file_sink<spdlog::details::null_mutex>;
#include "spdlog/details/thread_pool-inl.h"
#include "spdlog/details/thread_pool-inl.h"
template
class
spdlog
::
details
::
mpmc_blocking_queue
<
spdlog
::
details
::
async_msg
>
;
template
class
spdlog
::
details
::
mpmc_blocking_queue
<
spdlog
::
details
::
async_msg
>
;
#ifndef _WIN32
#include "spdlog/sinks/ansicolor_sink.h"
#include "spdlog/sinks/ansicolor_sink.h"
#include "spdlog/sinks/ansicolor_sink-inl.h"
#include "spdlog/sinks/ansicolor_sink-inl.h"
template
class
spdlog
::
sinks
::
ansicolor_sink
<
spdlog
::
details
::
console_stdout
,
spdlog
::
details
::
console_mutex
>
;
template
class
spdlog
::
sinks
::
ansicolor_sink
<
spdlog
::
details
::
console_stdout
,
spdlog
::
details
::
console_mutex
>
;
template
class
spdlog
::
sinks
::
ansicolor_sink
<
spdlog
::
details
::
console_stdout
,
spdlog
::
details
::
console_nullmutex
>
;
template
class
spdlog
::
sinks
::
ansicolor_sink
<
spdlog
::
details
::
console_stdout
,
spdlog
::
details
::
console_nullmutex
>
;
template
class
spdlog
::
sinks
::
ansicolor_sink
<
spdlog
::
details
::
console_stderr
,
spdlog
::
details
::
console_mutex
>
;
template
class
spdlog
::
sinks
::
ansicolor_sink
<
spdlog
::
details
::
console_stderr
,
spdlog
::
details
::
console_mutex
>
;
template
class
spdlog
::
sinks
::
ansicolor_sink
<
spdlog
::
details
::
console_stderr
,
spdlog
::
details
::
console_nullmutex
>
;
template
class
spdlog
::
sinks
::
ansicolor_sink
<
spdlog
::
details
::
console_stderr
,
spdlog
::
details
::
console_nullmutex
>
;
#else
#include "spdlog/sinks/wincolor_sink.h"
#include "spdlog/sinks/wincolor_sink-inl.h"
template
class
spdlog
::
sinks
::
wincolor_sink
<
spdlog
::
details
::
console_stdout
,
spdlog
::
details
::
console_mutex
>
;
template
class
spdlog
::
sinks
::
wincolor_sink
<
spdlog
::
details
::
console_stdout
,
spdlog
::
details
::
console_nullmutex
>
;
template
class
spdlog
::
sinks
::
wincolor_sink
<
spdlog
::
details
::
console_stderr
,
spdlog
::
details
::
console_mutex
>
;
template
class
spdlog
::
sinks
::
wincolor_sink
<
spdlog
::
details
::
console_stderr
,
spdlog
::
details
::
console_nullmutex
>
;
#endif
// fmt_helper templates
// fmt_helper templates
#include "spdlog/details/fmt_helper.h"
#include "spdlog/details/fmt_helper.h"
...
...
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