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
2aceb13f
Commit
2aceb13f
authored
Apr 05, 2019
by
gabime
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix support for utf8 logging under win32
parent
e9f34fbd
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
179 additions
and
157 deletions
+179
-157
example.cpp
example/example.cpp
+2
-1
os.h
include/spdlog/details/os.h
+5
-0
logger.h
include/spdlog/logger.h
+147
-154
logger.cpp
src/logger.cpp
+1
-2
os.cpp
src/os.cpp
+24
-0
No files found.
example/example.cpp
View file @
2aceb13f
...
...
@@ -14,5 +14,5 @@ spdlog::logger *get_logger();
int
main
(
int
,
char
*
[])
{
auto
*
l
=
get_logger
();
l
->
info
(
"HE LO "
,
"GA"
);
l
->
info
(
L"HEllo {}"
,
L"HGFS"
);
}
\ No newline at end of file
include/spdlog/details/os.h
View file @
2aceb13f
...
...
@@ -79,6 +79,11 @@ bool is_color_terminal() SPDLOG_NOEXCEPT;
// Detrmine if the terminal attached
// Source: https://github.com/agauniyal/rang/
bool
in_terminal
(
FILE
*
file
)
SPDLOG_NOEXCEPT
;
#if defined(SPDLOG_WCHAR_TO_UTF8_SUPPORT) && defined(_WIN32)
void
wbuf_to_utf8buf
(
const
fmt
::
wmemory_buffer
&
wbuf
,
fmt
::
memory_buffer
&
target
);
#endif
}
// namespace os
}
// namespace details
}
// namespace spdlog
...
...
include/spdlog/logger.h
View file @
2aceb13f
...
...
@@ -20,6 +20,10 @@
#include "spdlog/common.h"
#include "spdlog/details/log_msg.h"
#ifdef SPDLOG_WCHAR_TO_UTF8_SUPPORT
#include "spdlog/details/os.h"
#endif
#include <memory>
#include <string>
#include <vector>
...
...
@@ -52,253 +56,240 @@ public:
template
<
typename
...
Args
>
void
log
(
source_loc
loc
,
level
::
level_enum
lvl
,
const
char
*
fmt
,
const
Args
&
...
args
)
{
if
(
!
should_log
(
lvl
))
{
return
;
}
try
{
fmt
::
memory_buffer
buf
;
fmt
::
format_to
(
buf
,
fmt
,
args
...);
details
::
log_msg
log_msg
(
loc
,
&
name_
,
lvl
,
string_view_t
(
buf
.
data
(),
buf
.
size
()));
sink_it_
(
log_msg
);
}
catch
(
const
std
::
exception
&
ex
)
{
err_handler_
(
ex
.
what
());
}
catch
(...)
{
err_handler_
(
"Unknown exception in logger"
);
}
if
(
!
should_log
(
lvl
))
{
return
;
}
try
{
fmt
::
memory_buffer
buf
;
fmt
::
format_to
(
buf
,
fmt
,
args
...);
details
::
log_msg
log_msg
(
loc
,
&
name_
,
lvl
,
string_view_t
(
buf
.
data
(),
buf
.
size
()));
sink_it_
(
log_msg
);
}
catch
(
const
std
::
exception
&
ex
)
{
err_handler_
(
ex
.
what
());
}
catch
(...)
{
err_handler_
(
"Unknown exception in logger"
);
}
}
template
<
typename
...
Args
>
void
log
(
level
::
level_enum
lvl
,
const
char
*
fmt
,
const
Args
&
...
args
)
{
log
(
source_loc
{},
lvl
,
fmt
,
args
...);
log
(
source_loc
{},
lvl
,
fmt
,
args
...);
}
void
log
(
source_loc
loc
,
level
::
level_enum
lvl
,
const
char
*
msg
);
void
log
(
level
::
level_enum
lvl
,
const
char
*
msg
);
template
<
typename
...
Args
>
void
trace
(
const
char
*
fmt
,
const
Args
&
...
args
)
{
log
(
level
::
trace
,
fmt
,
args
...);
log
(
level
::
trace
,
fmt
,
args
...);
}
template
<
typename
...
Args
>
void
debug
(
const
char
*
fmt
,
const
Args
&
...
args
)
{
log
(
level
::
debug
,
fmt
,
args
...);
log
(
level
::
debug
,
fmt
,
args
...);
}
template
<
typename
...
Args
>
void
info
(
const
char
*
fmt
,
const
Args
&
...
args
)
{
log
(
level
::
info
,
fmt
,
args
...);
log
(
level
::
info
,
fmt
,
args
...);
}
template
<
typename
...
Args
>
void
warn
(
const
char
*
fmt
,
const
Args
&
...
args
)
{
log
(
level
::
warn
,
fmt
,
args
...);
log
(
level
::
warn
,
fmt
,
args
...);
}
template
<
typename
...
Args
>
void
error
(
const
char
*
fmt
,
const
Args
&
...
args
)
{
log
(
level
::
err
,
fmt
,
args
...);
log
(
level
::
err
,
fmt
,
args
...);
}
template
<
typename
...
Args
>
void
critical
(
const
char
*
fmt
,
const
Args
&
...
args
)
{
log
(
level
::
critical
,
fmt
,
args
...);
log
(
level
::
critical
,
fmt
,
args
...);
}
#ifdef SPDLOG_WCHAR_TO_UTF8_SUPPORT
#ifndef _WIN32
#error SPDLOG_WCHAR_TO_UTF8_SUPPORT only supported on windows
#else
inline
void
wbuf_to_utf8buf
(
const
fmt
::
wmemory_buffer
&
wbuf
,
fmt
::
memory_buffer
&
target
)
template
<
typename
T
>
void
log
(
level
::
level_enum
lvl
,
const
T
&
msg
)
{
int
wbuf_size
=
static_cast
<
int
>
(
wbuf
.
size
());
if
(
wbuf_size
==
0
)
log
(
source_loc
{},
lvl
,
msg
);
}
// T can be statically converted to string_view
template
<
class
T
,
typename
std
::
enable_if
<
std
::
is_convertible
<
T
,
spdlog
::
string_view_t
>::
value
,
T
>::
type
*
=
nullptr
>
void
log
(
source_loc
loc
,
level
::
level_enum
lvl
,
const
T
&
msg
)
{
return
;
if
(
!
should_log
(
lvl
))
{
return
;
}
try
{
details
::
log_msg
log_msg
(
loc
,
&
name_
,
lvl
,
msg
);
sink_it_
(
log_msg
);
}
catch
(
const
std
::
exception
&
ex
)
{
err_handler_
(
ex
.
what
());
}
catch
(...)
{
err_handler_
(
"Unknown exception in logger"
);
}
}
auto
result_size
=
::
WideCharToMultiByte
(
CP_UTF8
,
0
,
wbuf
.
data
(),
wbuf_size
,
NULL
,
0
,
NULL
,
NULL
);
// T cannot be statically converted to string_view
template
<
class
T
,
typename
std
::
enable_if
<!
std
::
is_convertible
<
T
,
spdlog
::
string_view_t
>::
value
,
T
>::
type
*
=
nullptr
>
void
log
(
source_loc
loc
,
level
::
level_enum
lvl
,
const
T
&
msg
)
{
if
(
!
should_log
(
lvl
))
{
return
;
}
try
{
using
details
::
fmt_helper
::
to_string_view
;
fmt
::
memory_buffer
buf
;
fmt
::
format_to
(
buf
,
"{}"
,
msg
);
details
::
log_msg
log_msg
(
loc
,
&
name_
,
lvl
,
to_string_view
(
buf
));
sink_it_
(
log_msg
);
}
catch
(
const
std
::
exception
&
ex
)
{
err_handler_
(
ex
.
what
());
}
catch
(...)
{
err_handler_
(
"Unknown exception in logger"
);
}
}
if
(
result_size
>
0
)
template
<
typename
T
>
void
trace
(
const
T
&
msg
)
{
target
.
resize
(
result_size
);
::
WideCharToMultiByte
(
CP_UTF8
,
0
,
wbuf
.
data
(),
wbuf_size
,
&
target
.
data
()[
0
],
result_size
,
NULL
,
NULL
);
log
(
level
::
trace
,
msg
);
}
else
template
<
typename
T
>
void
debug
(
const
T
&
msg
)
{
throw
spdlog
::
spdlog_ex
(
fmt
::
format
(
"WideCharToMultiByte failed. Last error: {}"
,
::
GetLastError
())
);
log
(
level
::
debug
,
msg
);
}
template
<
typename
T
>
void
info
(
const
T
&
msg
)
{
log
(
level
::
info
,
msg
);
}
template
<
typename
...
Args
>
void
log
(
source_loc
source
,
level
::
level_enum
lvl
,
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
template
<
typename
T
>
void
warn
(
const
T
&
msg
)
{
if
(
!
should_log
(
lvl
))
log
(
level
::
warn
,
msg
);
}
template
<
typename
T
>
void
error
(
const
T
&
msg
)
{
return
;
log
(
level
::
err
,
msg
)
;
}
try
template
<
typename
T
>
void
critical
(
const
T
&
msg
)
{
// format to wmemory_buffer and convert to utf8
using
details
::
fmt_helper
::
to_string_view
;
fmt
::
wmemory_buffer
wbuf
;
fmt
::
format_to
(
wbuf
,
fmt
,
args
...);
fmt
::
memory_buffer
buf
;
wbuf_to_utf8buf
(
wbuf
,
buf
);
details
::
log_msg
log_msg
(
source
,
&
name_
,
lvl
,
to_string_view
(
buf
));
sink_it_
(
log_msg
);
log
(
level
::
critical
,
msg
);
}
SPDLOG_CATCH_AND_HANDLE
#ifdef SPDLOG_WCHAR_TO_UTF8_SUPPORT
#ifndef _WIN32
#error SPDLOG_WCHAR_TO_UTF8_SUPPORT only supported on windows
#else
template
<
typename
...
Args
>
void
log
(
source_loc
source
,
level
::
level_enum
lvl
,
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
{
if
(
!
should_log
(
lvl
))
{
return
;
}
try
{
// format to wmemory_buffer and convert to utf8
fmt
::
wmemory_buffer
wbuf
;
fmt
::
format_to
(
wbuf
,
fmt
,
args
...);
fmt
::
memory_buffer
buf
;
details
::
os
::
wbuf_to_utf8buf
(
wbuf
,
buf
);
details
::
log_msg
log_msg
(
source
,
&
name_
,
lvl
,
string_view_t
(
buf
.
data
(),
buf
.
size
()));
sink_it_
(
log_msg
);
}
catch
(
const
std
::
exception
&
ex
)
{
err_handler_
(
ex
.
what
());
}
catch
(...)
{
err_handler_
(
"Unknown exception in logger"
);
}
}
template
<
typename
...
Args
>
void
log
(
level
::
level_enum
lvl
,
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
{
log
(
source_loc
{},
lvl
,
fmt
,
args
...);
log
(
source_loc
{},
lvl
,
fmt
,
args
...);
}
template
<
typename
...
Args
>
void
trace
(
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
{
log
(
level
::
trace
,
fmt
,
args
...);
log
(
level
::
trace
,
fmt
,
args
...);
}
template
<
typename
...
Args
>
void
debug
(
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
{
log
(
level
::
debug
,
fmt
,
args
...);
log
(
level
::
debug
,
fmt
,
args
...);
}
template
<
typename
...
Args
>
void
info
(
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
{
log
(
level
::
info
,
fmt
,
args
...);
log
(
level
::
info
,
fmt
,
args
...);
}
template
<
typename
...
Args
>
void
warn
(
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
{
log
(
level
::
warn
,
fmt
,
args
...);
log
(
level
::
warn
,
fmt
,
args
...);
}
template
<
typename
...
Args
>
void
error
(
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
{
log
(
level
::
err
,
fmt
,
args
...);
log
(
level
::
err
,
fmt
,
args
...);
}
template
<
typename
...
Args
>
void
critical
(
const
wchar_t
*
fmt
,
const
Args
&
...
args
)
{
log
(
level
::
critical
,
fmt
,
args
...);
log
(
level
::
critical
,
fmt
,
args
...);
}
#endif // _WIN32
#endif // SPDLOG_WCHAR_TO_UTF8_SUPPORT
template
<
typename
T
>
void
log
(
level
::
level_enum
lvl
,
const
T
&
msg
)
{
log
(
source_loc
{},
lvl
,
msg
);
}
// T can be statically converted to string_view
template
<
class
T
,
typename
std
::
enable_if
<
std
::
is_convertible
<
T
,
spdlog
::
string_view_t
>::
value
,
T
>::
type
*
=
nullptr
>
void
log
(
source_loc
loc
,
level
::
level_enum
lvl
,
const
T
&
msg
)
{
if
(
!
should_log
(
lvl
))
{
return
;
}
try
{
details
::
log_msg
log_msg
(
loc
,
&
name_
,
lvl
,
msg
);
sink_it_
(
log_msg
);
}
catch
(
const
std
::
exception
&
ex
)
{
err_handler_
(
ex
.
what
());
}
catch
(...)
{
err_handler_
(
"Unknown exception in logger"
);
}
}
// T cannot be statically converted to string_view
template
<
class
T
,
typename
std
::
enable_if
<!
std
::
is_convertible
<
T
,
spdlog
::
string_view_t
>::
value
,
T
>::
type
*
=
nullptr
>
void
log
(
source_loc
loc
,
level
::
level_enum
lvl
,
const
T
&
msg
)
{
if
(
!
should_log
(
lvl
))
{
return
;
}
try
{
using
details
::
fmt_helper
::
to_string_view
;
fmt
::
memory_buffer
buf
;
fmt
::
format_to
(
buf
,
"{}"
,
msg
);
details
::
log_msg
log_msg
(
loc
,
&
name_
,
lvl
,
to_string_view
(
buf
));
sink_it_
(
log_msg
);
}
catch
(
const
std
::
exception
&
ex
)
{
err_handler_
(
ex
.
what
());
}
catch
(...)
{
err_handler_
(
"Unknown exception in logger"
);
}
}
template
<
typename
T
>
void
trace
(
const
T
&
msg
)
{
log
(
level
::
trace
,
msg
);
}
template
<
typename
T
>
void
debug
(
const
T
&
msg
)
{
log
(
level
::
debug
,
msg
);
}
template
<
typename
T
>
void
info
(
const
T
&
msg
)
{
log
(
level
::
info
,
msg
);
}
template
<
typename
T
>
void
warn
(
const
T
&
msg
)
{
log
(
level
::
warn
,
msg
);
}
template
<
typename
T
>
void
error
(
const
T
&
msg
)
{
log
(
level
::
err
,
msg
);
}
template
<
typename
T
>
void
critical
(
const
T
&
msg
)
{
log
(
level
::
critical
,
msg
);
}
#endif // SPDLOG_WCHAR_TO_UTF8_SUPPORT
bool
should_log
(
level
::
level_enum
msg_level
)
const
;
...
...
@@ -350,6 +341,8 @@ public:
spdlog
::
level_t
level_
{
spdlog
::
logger
::
default_level
()};
spdlog
::
level_t
flush_level_
{
level
::
off
};
void
(
*
custom_err_handler_
)(
const
std
::
string
&
msg
)
{
nullptr
};
};
}
// namespace spdlog
...
...
src/logger.cpp
View file @
2aceb13f
...
...
@@ -172,4 +172,4 @@ void spdlog::logger::err_handler_(const std::string &msg)
std
::
strftime
(
date_buf
,
sizeof
(
date_buf
),
"%Y-%m-%d %H:%M:%S"
,
&
tm_time
);
fmt
::
print
(
stderr
,
"[*** LOG ERROR ***] [{}] [{}] {}
\n
"
,
date_buf
,
name
(),
msg
);
}
}
\ No newline at end of file
}
src/os.cpp
View file @
2aceb13f
...
...
@@ -397,6 +397,30 @@ SPDLOG_INLINE bool in_terminal(FILE *file) SPDLOG_NOEXCEPT
return
isatty
(
fileno
(
file
))
!=
0
;
#endif
}
#if defined(SPDLOG_WCHAR_TO_UTF8_SUPPORT) && defined(_WIN32)
SPDLOG_INLINE
void
wbuf_to_utf8buf
(
const
fmt
::
wmemory_buffer
&
wbuf
,
fmt
::
memory_buffer
&
target
)
{
int
wbuf_size
=
static_cast
<
int
>
(
wbuf
.
size
());
if
(
wbuf_size
==
0
)
{
return
;
}
auto
result_size
=
::
WideCharToMultiByte
(
CP_UTF8
,
0
,
wbuf
.
data
(),
wbuf_size
,
NULL
,
0
,
NULL
,
NULL
);
if
(
result_size
>
0
)
{
target
.
resize
(
result_size
);
::
WideCharToMultiByte
(
CP_UTF8
,
0
,
wbuf
.
data
(),
wbuf_size
,
&
target
.
data
()[
0
],
result_size
,
NULL
,
NULL
);
}
else
{
throw
spdlog
::
spdlog_ex
(
fmt
::
format
(
"WideCharToMultiByte failed. Last error: {}"
,
::
GetLastError
()));
}
}
#endif // SPDLOG_WCHAR_TO_UTF8_SUPPORT) && _WIN32
}
// namespace os
}
// namespace details
}
// namespace spdlog
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