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
c962c883
Commit
c962c883
authored
Apr 20, 2018
by
gabime
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixed linux port of v1.x
parent
c80cc330
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
530 additions
and
548 deletions
+530
-548
bench.cpp
example/bench.cpp
+1
-0
example.cpp
example/example.cpp
+0
-0
async.h
include/spdlog/async.h
+1
-1
async_logger_impl.h
include/spdlog/details/async_logger_impl.h
+14
-14
logger_impl.h
include/spdlog/details/logger_impl.h
+0
-3
os.h
include/spdlog/details/os.h
+1
-13
registry.h
include/spdlog/details/registry.h
+9
-10
traits.h
include/spdlog/details/traits.h
+43
-31
logger.h
include/spdlog/logger.h
+1
-1
android_sink.h
include/spdlog/sinks/android_sink.h
+73
-75
ansicolor_sink.h
include/spdlog/sinks/ansicolor_sink.h
+122
-128
file_sinks.h
include/spdlog/sinks/file_sinks.h
+0
-0
stdout_color_sinks.h
include/spdlog/sinks/stdout_color_sinks.h
+34
-35
stdout_sinks.h
include/spdlog/sinks/stdout_sinks.h
+68
-63
syslog_sink.h
include/spdlog/sinks/syslog_sink.h
+54
-58
wincolor_sink.h
include/spdlog/sinks/wincolor_sink.h
+106
-110
spdlog.h
include/spdlog/spdlog.h
+1
-3
includes.h
tests/includes.h
+2
-3
No files found.
example/bench.cpp
View file @
c962c883
...
...
@@ -7,6 +7,7 @@
// bench.cpp : spdlog benchmarks
//
#include "spdlog/async.h"
#include "spdlog/sinks/file_sinks.h"
#include "spdlog/sinks/null_sink.h"
#include "spdlog/spdlog.h"
...
...
example/example.cpp
View file @
c962c883
This diff is collapsed.
Click to expand it.
include/spdlog/async.h
View file @
c962c883
...
...
@@ -41,7 +41,7 @@ struct create_async
auto
new_logger
=
std
::
make_shared
<
async_logger
>
(
logger_name
,
std
::
move
(
sink
),
std
::
move
(
tp
),
async_overflow_policy
::
block_retry
);
registry
::
instance
().
register_and_init
(
new_logger
);
return
new_logger
;
}
}
};
template
<
typename
Sink
,
typename
...
SinkArgs
>
...
...
include/spdlog/details/async_logger_impl.h
View file @
c962c883
...
...
@@ -37,18 +37,18 @@ inline spdlog::async_logger::async_logger(
// send the log message to the thread pool
inline
void
spdlog
::
async_logger
::
_sink_it
(
details
::
log_msg
&
msg
)
{
{
#if defined(SPDLOG_ENABLE_MESSAGE_COUNTER)
_incr_msg_counter
(
msg
);
_incr_msg_counter
(
msg
);
#endif
if
(
auto
pool_ptr
=
_thread_pool
.
lock
())
{
pool_ptr
->
post_log
(
shared_from_this
(),
std
::
move
(
msg
),
_overflow_policy
);
}
else
{
throw
spdlog_ex
(
"async log: thread pool doens't exist anymore"
);
}
if
(
auto
pool_ptr
=
_thread_pool
.
lock
())
{
pool_ptr
->
post_log
(
shared_from_this
(),
std
::
move
(
msg
),
_overflow_policy
);
}
else
{
throw
spdlog_ex
(
"async log: thread pool doens't exist anymore"
);
}
}
// send flush request to the thread pool
...
...
@@ -89,10 +89,10 @@ inline void spdlog::async_logger::_backend_log(details::log_msg &incoming_log_ms
_err_handler
(
"Unknown exception in async logger "
+
_name
);
}
if
(
_should_flush
(
incoming_log_msg
))
{
_backend_flush
();
}
if
(
_should_flush
(
incoming_log_msg
))
{
_backend_flush
();
}
}
inline
void
spdlog
::
async_logger
::
_backend_flush
()
...
...
include/spdlog/details/logger_impl.h
View file @
c962c883
...
...
@@ -5,9 +5,6 @@
#pragma once
#include "../logger.h"
#include "../sinks/stdout_sinks.h"
#include <memory>
#include <string>
...
...
include/spdlog/details/os.h
View file @
c962c883
...
...
@@ -13,11 +13,11 @@
#include <cstring>
#include <ctime>
#include <functional>
#include <mutex>
#include <string>
#include <sys/stat.h>
#include <sys/types.h>
#include <thread>
#include <mutex>
#ifdef _WIN32
...
...
@@ -476,18 +476,6 @@ inline bool in_terminal(FILE *file)
#endif
}
// stdout/stderr global mutexes
inline
std
::
mutex
&
stdout_mutex
()
{
static
std
::
mutex
&
mutex
=
std
::
mutex
{};
return
mutex
;
}
inline
std
::
mutex
&
stderr_mutex
()
{
static
std
::
mutex
&
mutex
=
std
::
mutex
{};
return
mutex
;
}
}
// namespace os
}
// namespace details
}
// namespace spdlog
include/spdlog/details/registry.h
View file @
c962c883
...
...
@@ -148,16 +148,15 @@ public:
void
drop_all
()
{
{
std
::
lock_guard
<
Mutex
>
lock
(
_mutex
);
_loggers
.
clear
();
}
{
std
::
lock_guard
<
Mutex
>
lock
(
_tp_mutex
);
_tp
.
reset
();
}
{
std
::
lock_guard
<
Mutex
>
lock
(
_mutex
);
_loggers
.
clear
();
}
{
std
::
lock_guard
<
Mutex
>
lock
(
_tp_mutex
);
_tp
.
reset
();
}
}
Mutex
&
tp_mutex
()
...
...
include/spdlog/details/traits.h
View file @
c962c883
...
...
@@ -6,41 +6,53 @@
#include "stdio.h"
namespace
spdlog
{
namespace
details
{
struct
console_stdout_trait
{
static
FILE
*
stream
()
{
return
stdout
;}
namespace
details
{
struct
console_stdout_trait
{
static
FILE
*
stream
()
{
return
stdout
;
}
#ifdef _WIN32
static
HANDLE
handle
()
{
return
::
GetStdHandle
(
STD_OUTPUT_HANDLE
);
}
static
HANDLE
handle
()
{
return
::
GetStdHandle
(
STD_OUTPUT_HANDLE
);
}
#endif
};
};
struct
console_stderr_trait
{
static
FILE
*
stream
()
{
return
stdout
;
}
struct
console_stderr_trait
{
static
FILE
*
stream
()
{
return
stdout
;
}
#ifdef _WIN32
static
HANDLE
handle
()
{
return
::
GetStdHandle
(
STD_ERROR_HANDLE
);
}
static
HANDLE
handle
()
{
return
::
GetStdHandle
(
STD_ERROR_HANDLE
);
}
#endif
};
};
struct
console_mutex_trait
{
using
mutex_t
=
std
::
mutex
;
static
mutex_t
&
console_mutex
()
{
static
auto
&
mutex
=
mutex_t
{}
;
return
mutex
;
}
};
struct
console_mutex_trait
{
using
mutex_t
=
std
::
mutex
;
static
mutex_t
&
console_mutex
()
{
static
mutex_t
mutex
;
return
mutex
;
}
};
struct
console_null_mutex_trait
{
using
mutex_t
=
null_mutex
;
static
mutex_t
&
console_mutex
()
{
static
auto
mutex
=
mutex_t
{}
;
return
mutex
;
}
};
}
}
struct
console_null_mutex_trait
{
using
mutex_t
=
null_mutex
;
static
mutex_t
&
console_mutex
()
{
static
mutex_t
mutex
;
return
mutex
;
}
};
}
// namespace details
}
// namespace spdlog
include/spdlog/logger.h
View file @
c962c883
...
...
@@ -13,8 +13,8 @@
// 3. Pass the formatted message to its sinks to performa the actual logging
#include "common.h"
#include "sinks/sink.h"
#include "formatter.h"
#include "sinks/sink.h"
#include <memory>
#include <string>
...
...
include/spdlog/sinks/android_sink.h
View file @
c962c883
...
...
@@ -21,81 +21,79 @@
#endif
namespace
spdlog
{
namespace
sinks
{
/*
* Android sink (logging using __android_log_write)
* __android_log_write is thread-safe. No lock is needed.
*/
class
android_sink
:
public
sink
{
public
:
explicit
android_sink
(
const
std
::
string
&
tag
=
"spdlog"
,
bool
use_raw_msg
=
false
)
:
_tag
(
tag
)
,
_use_raw_msg
(
use_raw_msg
)
{
}
void
log
(
const
details
::
log_msg
&
msg
)
override
{
const
android_LogPriority
priority
=
convert_to_android
(
msg
.
level
);
const
char
*
msg_output
=
(
_use_raw_msg
?
msg
.
raw
.
c_str
()
:
msg
.
formatted
.
c_str
());
// See system/core/liblog/logger_write.c for explanation of return value
int
ret
=
__android_log_write
(
priority
,
_tag
.
c_str
(),
msg_output
);
int
retry_count
=
0
;
while
((
ret
==
-
11
/*EAGAIN*/
)
&&
(
retry_count
<
SPDLOG_ANDROID_RETRIES
))
{
details
::
os
::
sleep_for_millis
(
5
);
ret
=
__android_log_write
(
priority
,
_tag
.
c_str
(),
msg_output
);
retry_count
++
;
}
if
(
ret
<
0
)
{
throw
spdlog_ex
(
"__android_log_write() failed"
,
ret
);
}
}
void
flush
()
override
{}
private
:
static
android_LogPriority
convert_to_android
(
spdlog
::
level
::
level_enum
level
)
{
switch
(
level
)
{
case
spdlog
:
:
level
::
trace
:
return
ANDROID_LOG_VERBOSE
;
case
spdlog
:
:
level
::
debug
:
return
ANDROID_LOG_DEBUG
;
case
spdlog
:
:
level
::
info
:
return
ANDROID_LOG_INFO
;
case
spdlog
:
:
level
::
warn
:
return
ANDROID_LOG_WARN
;
case
spdlog
:
:
level
::
err
:
return
ANDROID_LOG_ERROR
;
case
spdlog
:
:
level
::
critical
:
return
ANDROID_LOG_FATAL
;
default
:
return
ANDROID_LOG_DEFAULT
;
}
}
std
::
string
_tag
;
bool
_use_raw_msg
;
};
}
// namespace sinks
// Create and register android syslog logger
template
<
typename
Factory
=
default_factory
>
inline
std
::
shared_ptr
<
logger
>
android_logger
(
const
std
::
string
&
logger_name
,
const
std
::
string
&
tag
=
"spdlog"
)
{
return
return
Factory
::
template
create
<
sinks
::
android_sink
>
(
logger_name
,
tag
);
}
namespace
sinks
{
/*
* Android sink (logging using __android_log_write)
* __android_log_write is thread-safe. No lock is needed.
*/
class
android_sink
:
public
sink
{
public
:
explicit
android_sink
(
const
std
::
string
&
tag
=
"spdlog"
,
bool
use_raw_msg
=
false
)
:
_tag
(
tag
)
,
_use_raw_msg
(
use_raw_msg
)
{
}
void
log
(
const
details
::
log_msg
&
msg
)
override
{
const
android_LogPriority
priority
=
convert_to_android
(
msg
.
level
);
const
char
*
msg_output
=
(
_use_raw_msg
?
msg
.
raw
.
c_str
()
:
msg
.
formatted
.
c_str
());
// See system/core/liblog/logger_write.c for explanation of return value
int
ret
=
__android_log_write
(
priority
,
_tag
.
c_str
(),
msg_output
);
int
retry_count
=
0
;
while
((
ret
==
-
11
/*EAGAIN*/
)
&&
(
retry_count
<
SPDLOG_ANDROID_RETRIES
))
{
details
::
os
::
sleep_for_millis
(
5
);
ret
=
__android_log_write
(
priority
,
_tag
.
c_str
(),
msg_output
);
retry_count
++
;
}
if
(
ret
<
0
)
{
throw
spdlog_ex
(
"__android_log_write() failed"
,
ret
);
}
}
void
flush
()
override
{}
private
:
static
android_LogPriority
convert_to_android
(
spdlog
::
level
::
level_enum
level
)
{
switch
(
level
)
{
case
spdlog
:
:
level
::
trace
:
return
ANDROID_LOG_VERBOSE
;
case
spdlog
:
:
level
::
debug
:
return
ANDROID_LOG_DEBUG
;
case
spdlog
:
:
level
::
info
:
return
ANDROID_LOG_INFO
;
case
spdlog
:
:
level
::
warn
:
return
ANDROID_LOG_WARN
;
case
spdlog
:
:
level
::
err
:
return
ANDROID_LOG_ERROR
;
case
spdlog
:
:
level
::
critical
:
return
ANDROID_LOG_FATAL
;
default
:
return
ANDROID_LOG_DEFAULT
;
}
}
std
::
string
_tag
;
bool
_use_raw_msg
;
};
}
// namespace sinks
// Create and register android syslog logger
template
<
typename
Factory
=
default_factory
>
inline
std
::
shared_ptr
<
logger
>
android_logger
(
const
std
::
string
&
logger_name
,
const
std
::
string
&
tag
=
"spdlog"
)
{
return
return
Factory
::
template
create
<
sinks
::
android_sink
>
(
logger_name
,
tag
);
}
}
// namespace spdlog
...
...
include/spdlog/sinks/ansicolor_sink.h
View file @
c962c883
...
...
@@ -9,137 +9,131 @@
#include "../details/os.h"
#include "../details/traits.h"
#include <string>
#include <unordered_map>
#include <memory>
#include <mutex>
#include <string>
#include <unordered_map>
namespace
spdlog
{
namespace
sinks
{
/**
* This sink prefixes the output with an ANSI escape sequence color code depending on the severity
* of the message.
* If no color terminal detected, omit the escape codes.
*/
template
<
class
StdoutTrait
,
class
ConsoleMutexTrait
>
class
ansicolor_sink
:
public
sink
{
public
:
using
mutex_t
=
typename
ConsoleMutexTrait
::
mutex_t
;
ansicolor_sink
()
:
target_file_
(
StdoutTrait
::
stream
()),
_mutex
(
ConsoleMutexTrait
::
mutex
())
{
should_do_colors_
=
details
::
os
::
in_terminal
(
file
)
&&
details
::
os
::
is_color_terminal
();
colors_
[
level
::
trace
]
=
white
;
colors_
[
level
::
debug
]
=
cyan
;
colors_
[
level
::
info
]
=
green
;
colors_
[
level
::
warn
]
=
yellow
+
bold
;
colors_
[
level
::
err
]
=
red
+
bold
;
colors_
[
level
::
critical
]
=
bold
+
on_red
;
colors_
[
level
::
off
]
=
reset
;
}
~
ansicolor_sink
()
override
{
_flush
();
}
ansicolor_sink
(
const
ansicolor_sink
&
other
)
=
delete
;
ansicolor_sink
&
operator
=
(
const
ansicolor_sink
&
other
)
=
delete
;
void
set_color
(
level
::
level_enum
color_level
,
const
std
::
string
&
color
)
{
std
::
lock_guard
<
mutex_t
>
lock
(
_mutex
);
colors_
[
color_level
]
=
color
;
}
/// Formatting codes
const
std
::
string
reset
=
"
\033
[m"
;
const
std
::
string
bold
=
"
\033
[1m"
;
const
std
::
string
dark
=
"
\033
[2m"
;
const
std
::
string
underline
=
"
\033
[4m"
;
const
std
::
string
blink
=
"
\033
[5m"
;
const
std
::
string
reverse
=
"
\033
[7m"
;
const
std
::
string
concealed
=
"
\033
[8m"
;
const
std
::
string
clear_line
=
"
\033
[K"
;
// Foreground colors
const
std
::
string
black
=
"
\033
[30m"
;
const
std
::
string
red
=
"
\033
[31m"
;
const
std
::
string
green
=
"
\033
[32m"
;
const
std
::
string
yellow
=
"
\033
[33m"
;
const
std
::
string
blue
=
"
\033
[34m"
;
const
std
::
string
magenta
=
"
\033
[35m"
;
const
std
::
string
cyan
=
"
\033
[36m"
;
const
std
::
string
white
=
"
\033
[37m"
;
/// Background colors
const
std
::
string
on_black
=
"
\033
[40m"
;
const
std
::
string
on_red
=
"
\033
[41m"
;
const
std
::
string
on_green
=
"
\033
[42m"
;
const
std
::
string
on_yellow
=
"
\033
[43m"
;
const
std
::
string
on_blue
=
"
\033
[44m"
;
const
std
::
string
on_magenta
=
"
\033
[45m"
;
const
std
::
string
on_cyan
=
"
\033
[46m"
;
const
std
::
string
on_white
=
"
\033
[47m"
;
void
log
(
const
details
::
log_msg
&
msg
)
SPDLOG_FINAL
override
{
// Wrap the originally formatted message in color codes.
// If color is not supported in the terminal, log as is instead.
std
::
lock_guard
<
mutex_t
>
lock
(
_mutex
);
if
(
should_do_colors_
&&
msg
.
color_range_end
>
msg
.
color_range_start
)
{
// before color range
_print_range
(
msg
,
0
,
msg
.
color_range_start
);
// in color range
_print_ccode
(
colors_
[
msg
.
level
]);
_print_range
(
msg
,
msg
.
color_range_start
,
msg
.
color_range_end
);
_print_ccode
(
reset
);
// after color range
_print_range
(
msg
,
msg
.
color_range_end
,
msg
.
formatted
.
size
());
}
else
// no color
{
_print_range
(
msg
,
0
,
msg
.
formatted
.
size
());
}
fflush
(
target_file_
);
}
void
flush
()
SPDLOG_FINAL
override
{
std
::
lock_guard
<
mutex_t
>
lock
(
_mutex
);
fflush
(
target_file_
);
}
private
:
void
_print_ccode
(
const
std
::
string
&
color_code
)
{
fwrite
(
color_code
.
data
(),
sizeof
(
char
),
color_code
.
size
(),
target_file_
);
}
void
_print_range
(
const
details
::
log_msg
&
msg
,
size_t
start
,
size_t
end
)
{
fwrite
(
msg
.
formatted
.
data
()
+
start
,
sizeof
(
char
),
end
-
start
,
target_file_
);
}
FILE
*
target_file_
;
mutex_t
&
_mutex
;
bool
should_do_colors_
;
std
::
unordered_map
<
level
::
level_enum
,
std
::
string
,
level
::
level_hasher
>
colors_
;
};
using
ansicolor_stdout_sink_mt
=
ansicolor_sink
<
details
::
console_stdout_trait
,
details
::
console_mutex_trait
>
;
using
ansicolor_stdout_sink_st
=
ansicolor_sink
<
details
::
console_stdout_trait
,
details
::
console_null_mutex_trait
>
;
using
ansicolor_stderr_sink_mt
=
ansicolor_sink
<
details
::
console_stderr_trait
,
details
::
console_mutex_trait
>
;
using
ansicolor_stderr_sink_st
=
ansicolor_sink
<
details
::
console_stderr_trait
,
details
::
console_null_mutex_trait
>
;
}
// namespace sinks
namespace
sinks
{
/**
* This sink prefixes the output with an ANSI escape sequence color code depending on the severity
* of the message.
* If no color terminal detected, omit the escape codes.
*/
template
<
class
StdoutTrait
,
class
ConsoleMutexTrait
>
class
ansicolor_sink
:
public
sink
{
public
:
using
mutex_t
=
typename
ConsoleMutexTrait
::
mutex_t
;
ansicolor_sink
()
:
target_file_
(
StdoutTrait
::
stream
())
,
_mutex
(
ConsoleMutexTrait
::
console_mutex
())
{
should_do_colors_
=
details
::
os
::
in_terminal
(
target_file_
)
&&
details
::
os
::
is_color_terminal
();
colors_
[
level
::
trace
]
=
white
;
colors_
[
level
::
debug
]
=
cyan
;
colors_
[
level
::
info
]
=
green
;
colors_
[
level
::
warn
]
=
yellow
+
bold
;
colors_
[
level
::
err
]
=
red
+
bold
;
colors_
[
level
::
critical
]
=
bold
+
on_red
;
colors_
[
level
::
off
]
=
reset
;
}
~
ansicolor_sink
()
override
=
default
;
ansicolor_sink
(
const
ansicolor_sink
&
other
)
=
delete
;
ansicolor_sink
&
operator
=
(
const
ansicolor_sink
&
other
)
=
delete
;
void
set_color
(
level
::
level_enum
color_level
,
const
std
::
string
&
color
)
{
std
::
lock_guard
<
mutex_t
>
lock
(
_mutex
);
colors_
[
color_level
]
=
color
;
}
/// Formatting codes
const
std
::
string
reset
=
"
\033
[m"
;
const
std
::
string
bold
=
"
\033
[1m"
;
const
std
::
string
dark
=
"
\033
[2m"
;
const
std
::
string
underline
=
"
\033
[4m"
;
const
std
::
string
blink
=
"
\033
[5m"
;
const
std
::
string
reverse
=
"
\033
[7m"
;
const
std
::
string
concealed
=
"
\033
[8m"
;
const
std
::
string
clear_line
=
"
\033
[K"
;
// Foreground colors
const
std
::
string
black
=
"
\033
[30m"
;
const
std
::
string
red
=
"
\033
[31m"
;
const
std
::
string
green
=
"
\033
[32m"
;
const
std
::
string
yellow
=
"
\033
[33m"
;
const
std
::
string
blue
=
"
\033
[34m"
;
const
std
::
string
magenta
=
"
\033
[35m"
;
const
std
::
string
cyan
=
"
\033
[36m"
;
const
std
::
string
white
=
"
\033
[37m"
;
/// Background colors
const
std
::
string
on_black
=
"
\033
[40m"
;
const
std
::
string
on_red
=
"
\033
[41m"
;
const
std
::
string
on_green
=
"
\033
[42m"
;
const
std
::
string
on_yellow
=
"
\033
[43m"
;
const
std
::
string
on_blue
=
"
\033
[44m"
;
const
std
::
string
on_magenta
=
"
\033
[45m"
;
const
std
::
string
on_cyan
=
"
\033
[46m"
;
const
std
::
string
on_white
=
"
\033
[47m"
;
void
log
(
const
details
::
log_msg
&
msg
)
SPDLOG_FINAL
override
{
// Wrap the originally formatted message in color codes.
// If color is not supported in the terminal, log as is instead.
std
::
lock_guard
<
mutex_t
>
lock
(
_mutex
);
if
(
should_do_colors_
&&
msg
.
color_range_end
>
msg
.
color_range_start
)
{
// before color range
_print_range
(
msg
,
0
,
msg
.
color_range_start
);
// in color range
_print_ccode
(
colors_
[
msg
.
level
]);
_print_range
(
msg
,
msg
.
color_range_start
,
msg
.
color_range_end
);
_print_ccode
(
reset
);
// after color range
_print_range
(
msg
,
msg
.
color_range_end
,
msg
.
formatted
.
size
());
}
else
// no color
{
_print_range
(
msg
,
0
,
msg
.
formatted
.
size
());
}
fflush
(
target_file_
);
}
void
flush
()
SPDLOG_FINAL
override
{
std
::
lock_guard
<
mutex_t
>
lock
(
_mutex
);
fflush
(
target_file_
);
}
private
:
void
_print_ccode
(
const
std
::
string
&
color_code
)
{
fwrite
(
color_code
.
data
(),
sizeof
(
char
),
color_code
.
size
(),
target_file_
);
}
void
_print_range
(
const
details
::
log_msg
&
msg
,
size_t
start
,
size_t
end
)
{
fwrite
(
msg
.
formatted
.
data
()
+
start
,
sizeof
(
char
),
end
-
start
,
target_file_
);
}
FILE
*
target_file_
;
mutex_t
&
_mutex
;
bool
should_do_colors_
;
std
::
unordered_map
<
level
::
level_enum
,
std
::
string
,
level
::
level_hasher
>
colors_
;
};
using
ansicolor_stdout_sink_mt
=
ansicolor_sink
<
details
::
console_stdout_trait
,
details
::
console_mutex_trait
>
;
using
ansicolor_stdout_sink_st
=
ansicolor_sink
<
details
::
console_stdout_trait
,
details
::
console_null_mutex_trait
>
;
using
ansicolor_stderr_sink_mt
=
ansicolor_sink
<
details
::
console_stderr_trait
,
details
::
console_mutex_trait
>
;
using
ansicolor_stderr_sink_st
=
ansicolor_sink
<
details
::
console_stderr_trait
,
details
::
console_null_mutex_trait
>
;
}
// namespace sinks
}
// namespace spdlog
include/spdlog/sinks/file_sinks.h
View file @
c962c883
This diff is collapsed.
Click to expand it.
include/spdlog/sinks/stdout_color_sinks.h
View file @
c962c883
...
...
@@ -12,44 +12,43 @@
#include "ansicolor_sink.h"
#endif
namespace
{
using
namespace
spdlog
::
sinks
;
namespace
{
using
namespace
spdlog
::
sinks
;
#ifdef _WIN32
using
stdout_color_sink_mt
=
wincolor_stdout_sink_mt
;
using
stdout_color_sink_st
=
wincolor_stdout_sink_st
;
using
stderr_color_sink_mt
=
wincolor_stderr_sink_mt
;
using
stderr_color_sink_st
=
wincolor_stderr_sink_st
;
using
stdout_color_sink_mt
=
wincolor_stdout_sink_mt
;
using
stdout_color_sink_st
=
wincolor_stdout_sink_st
;
using
stderr_color_sink_mt
=
wincolor_stderr_sink_mt
;
using
stderr_color_sink_st
=
wincolor_stderr_sink_st
;
#else
using
stdout_color_sink_mt
=
ansicolor_stdout_sink_mt
;
using
stdout_color_sink_st
=
ansicolor_stdout_sink_st
;
using
stderr_color_sink_mt
=
ansicolor_stderr_sink_mt
;
using
stderr_color_sink_st
=
ansicolor_stderr_sink_st
;
using
stdout_color_sink_mt
=
ansicolor_stdout_sink_mt
;
using
stdout_color_sink_st
=
ansicolor_stdout_sink_st
;
using
stderr_color_sink_mt
=
ansicolor_stderr_sink_mt
;
using
stderr_color_sink_st
=
ansicolor_stderr_sink_st
;
#endif
}
}
// namespace
namespace
spdlog
{
template
<
typename
Factory
=
default_factory
>
inline
std
::
shared_ptr
<
logger
>
stdout_color_mt
(
const
std
::
string
&
logger_name
)
{
return
Factory
::
template
create
<
stdout_color_sink_mt
>
(
logger_name
);
}
template
<
typename
Factory
=
default_factory
>
inline
std
::
shared_ptr
<
logger
>
stdout_color_st
(
const
std
::
string
&
logger_name
)
{
return
Factory
::
template
create
<
stdout_color_sink_st
>
(
logger_name
);
}
namespace
spdlog
{
template
<
typename
Factory
=
default_factory
>
inline
std
::
shared_ptr
<
logger
>
stdout_color_mt
(
const
std
::
string
&
logger_name
)
{
return
Factory
::
template
create
<
stdout_color_sink_mt
>
(
logger_name
);
}
template
<
typename
Factory
=
default_factory
>
inline
std
::
shared_ptr
<
logger
>
stdout_color_st
(
const
std
::
string
&
logger_name
)
{
return
Factory
::
template
create
<
stdout_color_sink_st
>
(
logger_name
);
}
template
<
typename
Factory
=
default_factory
>
inline
std
::
shared_ptr
<
logger
>
stderr_color_mt
(
const
std
::
string
&
logger_name
)
{
return
Factory
::
template
create
<
stderr_color_sink_mt
>
(
logger_name
);
}
template
<
typename
Factory
=
default_factory
>
inline
std
::
shared_ptr
<
logger
>
stderr_color_mt
(
const
std
::
string
&
logger_name
)
{
return
Factory
::
template
create
<
stderr_color_sink_mt
>
(
logger_name
);
}
template
<
typename
Factory
=
default_factory
>
inline
std
::
shared_ptr
<
logger
>
stderr_color_st
(
const
std
::
string
&
logger_name
)
{
return
Factory
::
template
createstderr_color_sink_mt
>
(
logger_name
);
}
}
\ No newline at end of file
template
<
typename
Factory
=
default_factory
>
inline
std
::
shared_ptr
<
logger
>
stderr_color_st
(
const
std
::
string
&
logger_name
)
{
return
Factory
::
template
createstderr_color_sink_mt
>
(
logger_name
);
}
}
// namespace spdlog
\ No newline at end of file
include/spdlog/sinks/stdout_sinks.h
View file @
c962c883
...
...
@@ -7,73 +7,78 @@
#include "../details/null_mutex.h"
#include "../details/traits.h"
#include "../spdlog.h"
#include <cstdio>
#include <memory>
#include <mutex>
namespace
spdlog
{
namespace
sinks
{
template
<
class
StdoutTrait
,
class
ConsoleMutexTrait
>
class
stdout_sink
:
public
sink
{
public
:
using
mutex_t
=
typename
ConsoleMutexTrait
::
mutex_t
;
stdout_sink
()
:
_mutex
(
ConsoleMutexTrait
::
console_mutex
()),
_file
(
StdoutTrait
::
stream
())
{}
~
stdout_sink
()
=
default
;
stdout_sink
(
const
stdout_sink
&
other
)
=
delete
;
stdout_sink
&
operator
=
(
const
stdout_sink
&
other
)
=
delete
;
void
log
(
const
details
::
log_msg
&
msg
)
override
{
std
::
lock_guard
<
mutex_t
>
lock
(
_mutex
);
fwrite
(
msg
.
formatted
.
data
(),
sizeof
(
char
),
msg
.
formatted
.
size
(),
_file
);
fflush
(
StdoutTrait
::
stream
());
}
void
flush
()
override
{
std
::
lock_guard
<
mutex_t
>
lock
(
_mutex
);
fflush
(
StdoutTrait
::
stream
());
}
private
:
typename
mutex_t
&
_mutex
;
FILE
*
_file
;
};
using
stdout_sink_mt
=
stdout_sink
<
details
::
console_stdout_trait
,
details
::
console_mutex_trait
>
;
using
stdout_sink_st
=
stdout_sink
<
details
::
console_stdout_trait
,
details
::
console_null_mutex_trait
>
;
using
stderr_sink_mt
=
stdout_sink
<
details
::
console_stderr_trait
,
details
::
console_mutex_trait
>
;
using
stderr_sink_st
=
stdout_sink
<
details
::
console_stderr_trait
,
details
::
console_null_mutex_trait
>
;
}
// namespace sinks
// factory methods
template
<
typename
Factory
=
default_factory
>
inline
std
::
shared_ptr
<
logger
>
stdout_logger_mt
(
const
std
::
string
&
logger_name
)
{
return
Factory
::
template
create
<
stdout_color_sink_mt
>
(
logger_name
);
}
template
<
typename
Factory
=
default_factory
>
inline
std
::
shared_ptr
<
logger
>
stdout_logger_st
(
const
std
::
string
&
logger_name
)
{
return
Factory
::
template
create
<
stdout_color_sink_mt
>
(
logger_name
);
}
template
<
typename
Factory
=
default_factory
>
inline
std
::
shared_ptr
<
logger
>
stderr_logger_mt
(
const
std
::
string
&
logger_name
)
{
return
Factory
::
template
create
<
stderr_color_sink_mt
>
(
logger_name
);
}
template
<
typename
Factory
=
default_factory
>
inline
std
::
shared_ptr
<
logger
>
stderr_logger_st
(
const
std
::
string
&
logger_name
)
{
return
Factory
::
template
create
<
stderr_logger_sink_mt
>
(
logger_name
);
}
namespace
sinks
{
template
<
class
StdoutTrait
,
class
ConsoleMutexTrait
>
class
stdout_sink
:
public
sink
{
public
:
using
mutex_t
=
typename
ConsoleMutexTrait
::
mutex_t
;
stdout_sink
()
:
_mutex
(
ConsoleMutexTrait
::
console_mutex
())
,
_file
(
StdoutTrait
::
stream
())
{
}
~
stdout_sink
()
=
default
;
stdout_sink
(
const
stdout_sink
&
other
)
=
delete
;
stdout_sink
&
operator
=
(
const
stdout_sink
&
other
)
=
delete
;
void
log
(
const
details
::
log_msg
&
msg
)
override
{
std
::
lock_guard
<
mutex_t
>
lock
(
_mutex
);
fwrite
(
msg
.
formatted
.
data
(),
sizeof
(
char
),
msg
.
formatted
.
size
(),
_file
);
fflush
(
StdoutTrait
::
stream
());
}
void
flush
()
override
{
std
::
lock_guard
<
mutex_t
>
lock
(
_mutex
);
fflush
(
StdoutTrait
::
stream
());
}
private
:
mutex_t
&
_mutex
;
FILE
*
_file
;
};
using
stdout_sink_mt
=
stdout_sink
<
details
::
console_stdout_trait
,
details
::
console_mutex_trait
>
;
using
stdout_sink_st
=
stdout_sink
<
details
::
console_stdout_trait
,
details
::
console_null_mutex_trait
>
;
using
stderr_sink_mt
=
stdout_sink
<
details
::
console_stderr_trait
,
details
::
console_mutex_trait
>
;
using
stderr_sink_st
=
stdout_sink
<
details
::
console_stderr_trait
,
details
::
console_null_mutex_trait
>
;
}
// namespace sinks
// factory methods
template
<
typename
Factory
=
default_factory
>
inline
std
::
shared_ptr
<
logger
>
stdout_logger_mt
(
const
std
::
string
&
logger_name
)
{
return
Factory
::
template
create
<
stdout_color_sink_mt
>
(
logger_name
);
}
template
<
typename
Factory
=
default_factory
>
inline
std
::
shared_ptr
<
logger
>
stdout_logger_st
(
const
std
::
string
&
logger_name
)
{
return
Factory
::
template
create
<
stdout_color_sink_mt
>
(
logger_name
);
}
template
<
typename
Factory
=
default_factory
>
inline
std
::
shared_ptr
<
logger
>
stderr_logger_mt
(
const
std
::
string
&
logger_name
)
{
return
Factory
::
template
create
<
stderr_color_sink_mt
>
(
logger_name
);
}
template
<
typename
Factory
=
default_factory
>
inline
std
::
shared_ptr
<
logger
>
stderr_logger_st
(
const
std
::
string
&
logger_name
)
{
return
Factory
::
template
create
<
stderr_logger_sink_mt
>
(
logger_name
);
}
}
// namespace spdlog
include/spdlog/sinks/syslog_sink.h
View file @
c962c883
...
...
@@ -7,8 +7,6 @@
#include "../common.h"
#ifdef SPDLOG_ENABLE_SYSLOG
#include "../details/log_msg.h"
#include "sink.h"
...
...
@@ -17,68 +15,66 @@
#include <syslog.h>
namespace
spdlog
{
namespace
sinks
{
/**
* Sink that write to syslog using the `syscall()` library call.
*
* Locking is not needed, as `syslog()` itself is thread-safe.
*/
class
syslog_sink
:
public
sink
{
public
:
//
syslog_sink
(
const
std
::
string
&
ident
=
""
,
int
syslog_option
=
0
,
int
syslog_facility
=
LOG_USER
)
:
_ident
(
ident
)
{
_priorities
[
static_cast
<
size_t
>
(
level
::
trace
)]
=
LOG_DEBUG
;
_priorities
[
static_cast
<
size_t
>
(
level
::
debug
)]
=
LOG_DEBUG
;
_priorities
[
static_cast
<
size_t
>
(
level
::
info
)]
=
LOG_INFO
;
_priorities
[
static_cast
<
size_t
>
(
level
::
warn
)]
=
LOG_WARNING
;
_priorities
[
static_cast
<
size_t
>
(
level
::
err
)]
=
LOG_ERR
;
_priorities
[
static_cast
<
size_t
>
(
level
::
critical
)]
=
LOG_CRIT
;
_priorities
[
static_cast
<
size_t
>
(
level
::
off
)]
=
LOG_INFO
;
namespace
sinks
{
/**
* Sink that write to syslog using the `syscall()` library call.
*
* Locking is not needed, as `syslog()` itself is thread-safe.
*/
class
syslog_sink
:
public
sink
{
public
:
//
syslog_sink
(
const
std
::
string
&
ident
=
""
,
int
syslog_option
=
0
,
int
syslog_facility
=
LOG_USER
)
:
_ident
(
ident
)
{
_priorities
[
static_cast
<
size_t
>
(
level
::
trace
)]
=
LOG_DEBUG
;
_priorities
[
static_cast
<
size_t
>
(
level
::
debug
)]
=
LOG_DEBUG
;
_priorities
[
static_cast
<
size_t
>
(
level
::
info
)]
=
LOG_INFO
;
_priorities
[
static_cast
<
size_t
>
(
level
::
warn
)]
=
LOG_WARNING
;
_priorities
[
static_cast
<
size_t
>
(
level
::
err
)]
=
LOG_ERR
;
_priorities
[
static_cast
<
size_t
>
(
level
::
critical
)]
=
LOG_CRIT
;
_priorities
[
static_cast
<
size_t
>
(
level
::
off
)]
=
LOG_INFO
;
// set ident to be program name if empty
::
openlog
(
_ident
.
empty
()
?
nullptr
:
_ident
.
c_str
(),
syslog_option
,
syslog_facility
);
}
// set ident to be program name if empty
::
openlog
(
_ident
.
empty
()
?
nullptr
:
_ident
.
c_str
(),
syslog_option
,
syslog_facility
);
}
~
syslog_sink
()
override
{
::
closelog
();
}
~
syslog_sink
()
override
{
::
closelog
();
}
syslog_sink
(
const
syslog_sink
&
)
=
delete
;
syslog_sink
&
operator
=
(
const
syslog_sink
&
)
=
delete
;
syslog_sink
(
const
syslog_sink
&
)
=
delete
;
syslog_sink
&
operator
=
(
const
syslog_sink
&
)
=
delete
;
void
log
(
const
details
::
log_msg
&
msg
)
override
{
::
syslog
(
syslog_prio_from_level
(
msg
),
"%s"
,
msg
.
raw
.
str
().
c_str
());
}
void
log
(
const
details
::
log_msg
&
msg
)
override
{
::
syslog
(
syslog_prio_from_level
(
msg
),
"%s"
,
msg
.
raw
.
str
().
c_str
());
}
void
flush
()
override
{}
void
flush
()
override
{}
private
:
std
::
array
<
int
,
7
>
_priorities
;
// must store the ident because the man says openlog might use the pointer as is and not a string copy
const
std
::
string
_ident
;
private
:
std
::
array
<
int
,
7
>
_priorities
;
// must store the ident because the man says openlog might use the pointer as is and not a string copy
const
std
::
string
_ident
;
//
// Simply maps spdlog's log level to syslog priority level.
//
int
syslog_prio_from_level
(
const
details
::
log_msg
&
msg
)
const
{
return
_priorities
[
static_cast
<
size_t
>
(
msg
.
level
)];
}
};
}
// namespace sinks
//
// Simply maps spdlog's log level to syslog priority level.
//
int
syslog_prio_from_level
(
const
details
::
log_msg
&
msg
)
const
{
return
_priorities
[
static_cast
<
size_t
>
(
msg
.
level
)];
}
};
}
// namespace sinks
// Create and register a syslog logger
template
<
typename
Factory
=
default_factory
>
inline
std
::
shared_ptr
<
logger
>
syslog_logger
(
const
std
::
string
&
logger_name
,
const
std
::
string
&
ident
=
""
,
int
syslog_option
=
0
,
int
syslog_facil
ty
=
(
1
<<
3
))
{
return
return
Factory
::
template
create
<
sinks
::
syslog_sink
>
(
logger_name
,
syslog_ident
,
syslog_option
,
syslog_facility
);
}
// Create and register a syslog logger
template
<
typename
Factory
=
default_factory
>
inline
std
::
shared_ptr
<
logger
>
syslog_logger
(
const
std
::
string
&
logger_name
,
const
std
::
string
&
syslog_ident
=
""
,
int
syslog_option
=
0
,
int
syslog_facili
ty
=
(
1
<<
3
))
{
return
Factory
::
template
create
<
sinks
::
syslog_sink
>
(
logger_name
,
syslog_ident
,
syslog_option
,
syslog_facility
);
}
}
// namespace spdlog
#endif
include/spdlog/sinks/wincolor_sink.h
View file @
c962c883
...
...
@@ -5,124 +5,120 @@
#pragma once
#include "sink.h"
#include "../common.h"
#include "../details/null_mutex.h"
#include "../details/traits.h"
#include "sink.h"
#include <mutex>
#include <memory>
#include <mutex>
#include <string>
#include <unordered_map>
#include <wincon.h>
namespace
spdlog
{
namespace
sinks
{
/*
* Windows color console sink. Uses WriteConsoleA to write to the console with colors
*/
template
<
class
HandleTrait
,
class
ConsoleMutexTrait
>
class
wincolor_sink
:
public
sink
{
public
:
const
WORD
BOLD
=
FOREGROUND_INTENSITY
;
const
WORD
RED
=
FOREGROUND_RED
;
const
WORD
GREEN
=
FOREGROUND_GREEN
;
const
WORD
CYAN
=
FOREGROUND_GREEN
|
FOREGROUND_BLUE
;
const
WORD
WHITE
=
FOREGROUND_RED
|
FOREGROUND_GREEN
|
FOREGROUND_BLUE
;
const
WORD
YELLOW
=
FOREGROUND_RED
|
FOREGROUND_GREEN
;
wincolor_sink
()
:
out_handle_
(
HandleTrait
::
handle
()),
_mutex
(
ConsoleMutexTrait
::
console_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
&
operator
=
(
const
wincolor_sink
&
other
)
=
delete
;
// change the color for the given level
void
set_color
(
level
::
level_enum
level
,
WORD
color
)
{
std
::
lock_guard
<
mutex_t
>
lock
(
_mutex
);
colors_
[
level
]
=
color
;
}
void
log
(
const
details
::
log_msg
&
msg
)
SPDLOG_FINAL
override
{
std
::
lock_guard
<
mutex_t
>
lock
(
_mutex
);
if
(
msg
.
color_range_end
>
msg
.
color_range_start
)
{
// before color range
_print_range
(
msg
,
0
,
msg
.
color_range_start
);
// in color range
auto
orig_attribs
=
set_console_attribs
(
colors_
[
msg
.
level
]);
_print_range
(
msg
,
msg
.
color_range_start
,
msg
.
color_range_end
);
::
SetConsoleTextAttribute
(
out_handle_
,
orig_attribs
);
// reset to orig colors
// after color range
_print_range
(
msg
,
msg
.
color_range_end
,
msg
.
formatted
.
size
());
}
else
// print without colors if color range is invalid
{
_print_range
(
msg
,
0
,
msg
.
formatted
.
size
());
}
}
void
flush
()
SPDLOG_FINAL
override
{
// windows console always flushed?
}
private
:
using
mutex_t
=
typename
ConsoleMutexTrait
::
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
details
::
log_msg
&
msg
,
size_t
start
,
size_t
end
)
{
auto
size
=
static_cast
<
DWORD
>
(
end
-
start
);
::
WriteConsoleA
(
out_handle_
,
msg
.
formatted
.
data
()
+
start
,
size
,
nullptr
,
nullptr
);
}
HANDLE
out_handle_
;
mutex_t
&
_mutex
;
std
::
unordered_map
<
level
::
level_enum
,
WORD
,
level
::
level_hasher
>
colors_
;
};
using
wincolor_stdout_sink_mt
=
wincolor_sink
<
details
::
console_stdout_trait
,
details
::
console_mutex_trait
>
;
using
wincolor_stdout_sink_st
=
wincolor_sink
<
details
::
console_stdout_trait
,
details
::
console_null_mutex_trait
>
;
using
wincolor_stderr_sink_mt
=
wincolor_sink
<
details
::
console_stderr_trait
,
details
::
console_mutex_trait
>
;
using
wincolor_stderr_sink_st
=
wincolor_sink
<
details
::
console_stderr_trait
,
details
::
console_null_mutex_trait
>
;
}
// namespace sinks
namespace
sinks
{
/*
* Windows color console sink. Uses WriteConsoleA to write to the console with colors
*/
template
<
class
HandleTrait
,
class
ConsoleMutexTrait
>
class
wincolor_sink
:
public
sink
{
public
:
const
WORD
BOLD
=
FOREGROUND_INTENSITY
;
const
WORD
RED
=
FOREGROUND_RED
;
const
WORD
GREEN
=
FOREGROUND_GREEN
;
const
WORD
CYAN
=
FOREGROUND_GREEN
|
FOREGROUND_BLUE
;
const
WORD
WHITE
=
FOREGROUND_RED
|
FOREGROUND_GREEN
|
FOREGROUND_BLUE
;
const
WORD
YELLOW
=
FOREGROUND_RED
|
FOREGROUND_GREEN
;
wincolor_sink
()
:
out_handle_
(
HandleTrait
::
handle
())
,
_mutex
(
ConsoleMutexTrait
::
console_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
&
operator
=
(
const
wincolor_sink
&
other
)
=
delete
;
// change the color for the given level
void
set_color
(
level
::
level_enum
level
,
WORD
color
)
{
std
::
lock_guard
<
mutex_t
>
lock
(
_mutex
);
colors_
[
level
]
=
color
;
}
void
log
(
const
details
::
log_msg
&
msg
)
SPDLOG_FINAL
override
{
std
::
lock_guard
<
mutex_t
>
lock
(
_mutex
);
if
(
msg
.
color_range_end
>
msg
.
color_range_start
)
{
// before color range
_print_range
(
msg
,
0
,
msg
.
color_range_start
);
// in color range
auto
orig_attribs
=
set_console_attribs
(
colors_
[
msg
.
level
]);
_print_range
(
msg
,
msg
.
color_range_start
,
msg
.
color_range_end
);
::
SetConsoleTextAttribute
(
out_handle_
,
orig_attribs
);
// reset to orig colors
// after color range
_print_range
(
msg
,
msg
.
color_range_end
,
msg
.
formatted
.
size
());
}
else
// print without colors if color range is invalid
{
_print_range
(
msg
,
0
,
msg
.
formatted
.
size
());
}
}
void
flush
()
SPDLOG_FINAL
override
{
// windows console always flushed?
}
private
:
using
mutex_t
=
typename
ConsoleMutexTrait
::
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
details
::
log_msg
&
msg
,
size_t
start
,
size_t
end
)
{
auto
size
=
static_cast
<
DWORD
>
(
end
-
start
);
::
WriteConsoleA
(
out_handle_
,
msg
.
formatted
.
data
()
+
start
,
size
,
nullptr
,
nullptr
);
}
HANDLE
out_handle_
;
mutex_t
&
_mutex
;
std
::
unordered_map
<
level
::
level_enum
,
WORD
,
level
::
level_hasher
>
colors_
;
};
using
wincolor_stdout_sink_mt
=
wincolor_sink
<
details
::
console_stdout_trait
,
details
::
console_mutex_trait
>
;
using
wincolor_stdout_sink_st
=
wincolor_sink
<
details
::
console_stdout_trait
,
details
::
console_null_mutex_trait
>
;
using
wincolor_stderr_sink_mt
=
wincolor_sink
<
details
::
console_stderr_trait
,
details
::
console_mutex_trait
>
;
using
wincolor_stderr_sink_st
=
wincolor_sink
<
details
::
console_stderr_trait
,
details
::
console_null_mutex_trait
>
;
}
// namespace sinks
}
// namespace spdlog
include/spdlog/spdlog.h
View file @
c962c883
...
...
@@ -7,8 +7,8 @@
#pragma once
#include "details/registry.h"
#include "common.h"
#include "details/registry.h"
#include "logger.h"
#include <chrono>
...
...
@@ -32,7 +32,6 @@ struct default_factory
}
};
// Create and register a logger with a templated sink type
// The logger's level, formatter and flush level will be set according the global settings.
// Example:
...
...
@@ -116,7 +115,6 @@ inline void drop_all()
details
::
registry
::
instance
().
drop_all
();
}
///////////////////////////////////////////////////////////////////////////////
//
// Trace & Debug can be switched on/off at compile time for zero cost debug statements.
...
...
tests/includes.h
View file @
c962c883
...
...
@@ -12,9 +12,8 @@
#define SPDLOG_TRACE_ON
#define SPDLOG_DEBUG_ON
#include "../include/spdlog/spdlog.h"
#include "../include/spdlog/async.h"
#include "../include/spdlog/sinks/null_sink.h"
#include "../include/spdlog/sinks/file_sinks.h"
#include "../include/spdlog/sinks/null_sink.h"
#include "../include/spdlog/sinks/ostream_sink.h"
#include "../include/spdlog/spdlog.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