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
cdbf2e36
Commit
cdbf2e36
authored
Jun 12, 2018
by
gabime
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Upgrade to fmt 5.x
parent
378c7789
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
31 additions
and
710 deletions
+31
-710
common.h
include/spdlog/common.h
+3
-3
log_msg.h
include/spdlog/details/log_msg.h
+2
-2
logger_impl.h
include/spdlog/details/logger_impl.h
+3
-8
pattern_formatter_impl.h
include/spdlog/details/pattern_formatter_impl.h
+0
-0
thread_pool.h
include/spdlog/details/thread_pool.h
+3
-5
format.cc
include/spdlog/fmt/bundled/format.cc
+0
-0
format.h
include/spdlog/fmt/bundled/format.h
+0
-0
ostream.cc
include/spdlog/fmt/bundled/ostream.cc
+0
-35
ostream.h
include/spdlog/fmt/bundled/ostream.h
+0
-117
posix.cc
include/spdlog/fmt/bundled/posix.cc
+0
-241
posix.h
include/spdlog/fmt/bundled/posix.h
+0
-0
printf.cc
include/spdlog/fmt/bundled/printf.cc
+0
-32
printf.h
include/spdlog/fmt/bundled/printf.h
+0
-0
time.h
include/spdlog/fmt/bundled/time.h
+0
-188
fmt.h
include/spdlog/fmt/fmt.h
+3
-8
daily_file_sink.h
include/spdlog/sinks/daily_file_sink.h
+7
-7
rotating_file_sink.h
include/spdlog/sinks/rotating_file_sink.h
+4
-4
syslog_sink.h
include/spdlog/sinks/syslog_sink.h
+1
-1
Makefile
tests/Makefile
+1
-7
errors.cpp
tests/errors.cpp
+1
-13
file_log.cpp
tests/file_log.cpp
+3
-30
test_macros.cpp
tests/test_macros.cpp
+0
-7
tests.sln
tests/tests.sln
+0
-2
No files found.
include/spdlog/common.h
View file @
cdbf2e36
...
...
@@ -158,9 +158,9 @@ public:
spdlog_ex
(
const
std
::
string
&
msg
,
int
last_errno
)
{
fmt
::
MemoryWriter
writer
;
fmt
::
format_system_error
(
writer
,
last_errno
,
msg
);
_msg
=
writer
.
str
(
);
fmt
::
memory_buffer
buf
;
fmt
::
format_system_error
(
buf
,
last_errno
,
msg
);
_msg
=
fmt
::
to_string
(
buf
);
}
const
char
*
what
()
const
SPDLOG_NOEXCEPT
override
...
...
include/spdlog/details/log_msg.h
View file @
cdbf2e36
...
...
@@ -37,8 +37,8 @@ struct log_msg
level
::
level_enum
level
;
log_clock
::
time_point
time
;
size_t
thread_id
;
fmt
::
MemoryWrit
er
raw
;
fmt
::
MemoryWrit
er
formatted
;
fmt
::
memory_buff
er
raw
;
fmt
::
memory_buff
er
formatted
;
size_t
msg_id
{
0
};
// info about wrapping the formatted text with color
size_t
color_range_start
{
0
};
...
...
include/spdlog/details/logger_impl.h
View file @
cdbf2e36
...
...
@@ -58,12 +58,7 @@ inline void spdlog::logger::log(level::level_enum lvl, const char *fmt, const Ar
try
{
details
::
log_msg
log_msg
(
&
name_
,
lvl
);
#if defined(SPDLOG_FMT_PRINTF)
fmt
::
printf
(
log_msg
.
raw
,
fmt
,
args
...);
#else
log_msg
.
raw
.
write
(
fmt
,
args
...);
#endif
fmt
::
format_to
(
log_msg
.
raw
,
fmt
,
args
...);
sink_it_
(
log_msg
);
}
SPDLOG_CATCH_AND_HANDLE
...
...
@@ -79,7 +74,7 @@ inline void spdlog::logger::log(level::level_enum lvl, const char *msg)
try
{
details
::
log_msg
log_msg
(
&
name_
,
lvl
);
log_msg
.
raw
<<
msg
;
fmt
::
format_to
(
log_msg
.
raw
,
"{}"
,
msg
)
;
sink_it_
(
log_msg
);
}
SPDLOG_CATCH_AND_HANDLE
...
...
@@ -95,7 +90,7 @@ inline void spdlog::logger::log(level::level_enum lvl, const T &msg)
try
{
details
::
log_msg
log_msg
(
&
name_
,
lvl
);
log_msg
.
raw
<<
msg
;
fmt
::
format_to
(
log_msg
.
raw
,
"{}"
,
msg
)
;
sink_it_
(
log_msg
);
}
SPDLOG_CATCH_AND_HANDLE
...
...
include/spdlog/details/pattern_formatter_impl.h
View file @
cdbf2e36
This diff is collapsed.
Click to expand it.
include/spdlog/details/thread_pool.h
View file @
cdbf2e36
...
...
@@ -65,15 +65,13 @@ struct async_msg
}
// copy into log_msg
void
to_log_msg
(
log_msg
&
&
msg
)
void
to_log_msg
(
log_msg
&
msg
)
{
msg
.
logger_name
=
&
worker_ptr
->
name
();
msg
.
level
=
level
;
msg
.
time
=
time
;
msg
.
thread_id
=
thread_id
;
msg
.
raw
.
clear
();
msg
.
raw
<<
txt
;
msg
.
formatted
.
clear
();
msg
.
raw
.
append
(
txt
.
data
(),
txt
.
data
()
+
txt
.
size
());
msg
.
msg_id
=
msg_id
;
msg
.
color_range_start
=
0
;
msg
.
color_range_end
=
0
;
...
...
@@ -182,7 +180,7 @@ private:
default:
{
log_msg
msg
;
incoming_async_msg
.
to_log_msg
(
std
::
move
(
msg
)
);
incoming_async_msg
.
to_log_msg
(
msg
);
incoming_async_msg
.
worker_ptr
->
backend_log_
(
msg
);
return
true
;
}
...
...
include/spdlog/fmt/bundled/format.cc
deleted
100644 → 0
View file @
378c7789
This diff is collapsed.
Click to expand it.
include/spdlog/fmt/bundled/format.h
deleted
100644 → 0
View file @
378c7789
This diff is collapsed.
Click to expand it.
include/spdlog/fmt/bundled/ostream.cc
deleted
100644 → 0
View file @
378c7789
/*
Formatting library for C++ - std::ostream support
Copyright (c) 2012 - 2016, Victor Zverovich
All rights reserved.
For the license information refer to format.h.
*/
#include "ostream.h"
namespace
fmt
{
namespace
internal
{
FMT_FUNC
void
write
(
std
::
ostream
&
os
,
Writer
&
w
)
{
const
char
*
data
=
w
.
data
();
typedef
internal
::
MakeUnsigned
<
std
::
streamsize
>::
Type
UnsignedStreamSize
;
UnsignedStreamSize
size
=
w
.
size
();
UnsignedStreamSize
max_size
=
internal
::
to_unsigned
((
std
::
numeric_limits
<
std
::
streamsize
>::
max
)());
do
{
UnsignedStreamSize
n
=
size
<=
max_size
?
size
:
max_size
;
os
.
write
(
data
,
static_cast
<
std
::
streamsize
>
(
n
));
data
+=
n
;
size
-=
n
;
}
while
(
size
!=
0
);
}
}
FMT_FUNC
void
print
(
std
::
ostream
&
os
,
CStringRef
format_str
,
ArgList
args
)
{
MemoryWriter
w
;
w
.
write
(
format_str
,
args
);
internal
::
write
(
os
,
w
);
}
}
// namespace fmt
include/spdlog/fmt/bundled/ostream.h
deleted
100644 → 0
View file @
378c7789
/*
Formatting library for C++ - std::ostream support
Copyright (c) 2012 - 2016, Victor Zverovich
All rights reserved.
For the license information refer to format.h.
*/
#ifndef FMT_OSTREAM_H_
#define FMT_OSTREAM_H_
#include "format.h"
#include <ostream>
namespace
fmt
{
namespace
internal
{
template
<
class
Char
>
class
FormatBuf
:
public
std
::
basic_streambuf
<
Char
>
{
private
:
typedef
typename
std
::
basic_streambuf
<
Char
>::
int_type
int_type
;
typedef
typename
std
::
basic_streambuf
<
Char
>::
traits_type
traits_type
;
Buffer
<
Char
>
&
buffer_
;
public
:
FormatBuf
(
Buffer
<
Char
>
&
buffer
)
:
buffer_
(
buffer
)
{
}
protected
:
// The put-area is actually always empty. This makes the implementation
// simpler and has the advantage that the streambuf and the buffer are always
// in sync and sputc never writes into uninitialized memory. The obvious
// disadvantage is that each call to sputc always results in a (virtual) call
// to overflow. There is no disadvantage here for sputn since this always
// results in a call to xsputn.
int_type
overflow
(
int_type
ch
=
traits_type
::
eof
())
FMT_OVERRIDE
{
if
(
!
traits_type
::
eq_int_type
(
ch
,
traits_type
::
eof
()))
buffer_
.
push_back
(
static_cast
<
Char
>
(
ch
));
return
ch
;
}
std
::
streamsize
xsputn
(
const
Char
*
s
,
std
::
streamsize
count
)
FMT_OVERRIDE
{
buffer_
.
append
(
s
,
s
+
count
);
return
count
;
}
};
Yes
&
convert
(
std
::
ostream
&
);
struct
DummyStream
:
std
::
ostream
{
DummyStream
();
// Suppress a bogus warning in MSVC.
// Hide all operator<< overloads from std::ostream.
template
<
typename
T
>
typename
EnableIf
<
sizeof
(
T
)
==
0
>::
type
operator
<<
(
const
T
&
);
};
No
&
operator
<<
(
std
::
ostream
&
,
int
);
template
<
typename
T
>
struct
ConvertToIntImpl
<
T
,
true
>
{
// Convert to int only if T doesn't have an overloaded operator<<.
enum
{
value
=
sizeof
(
convert
(
get
<
DummyStream
>
()
<<
get
<
T
>
()))
==
sizeof
(
No
)
};
};
// Write the content of w to os.
FMT_API
void
write
(
std
::
ostream
&
os
,
Writer
&
w
);
}
// namespace internal
// Formats a value.
template
<
typename
Char
,
typename
ArgFormatter_
,
typename
T
>
void
format_arg
(
BasicFormatter
<
Char
,
ArgFormatter_
>
&
f
,
const
Char
*&
format_str
,
const
T
&
value
)
{
internal
::
MemoryBuffer
<
Char
,
internal
::
INLINE_BUFFER_SIZE
>
buffer
;
internal
::
FormatBuf
<
Char
>
format_buf
(
buffer
);
std
::
basic_ostream
<
Char
>
output
(
&
format_buf
);
output
.
exceptions
(
std
::
ios_base
::
failbit
|
std
::
ios_base
::
badbit
);
output
<<
value
;
BasicStringRef
<
Char
>
str
(
&
buffer
[
0
],
buffer
.
size
());
typedef
internal
::
MakeArg
<
BasicFormatter
<
Char
>>
MakeArg
;
format_str
=
f
.
format
(
format_str
,
MakeArg
(
str
));
}
/**
\rst
Prints formatted data to the stream *os*.
**Example**::
print(cerr, "Don't {}!", "panic");
\endrst
*/
FMT_API
void
print
(
std
::
ostream
&
os
,
CStringRef
format_str
,
ArgList
args
);
FMT_VARIADIC
(
void
,
print
,
std
::
ostream
&
,
CStringRef
)
}
// namespace fmt
#ifdef FMT_HEADER_ONLY
#include "ostream.cc"
#endif
#endif // FMT_OSTREAM_H_
include/spdlog/fmt/bundled/posix.cc
deleted
100644 → 0
View file @
378c7789
/*
A C++ interface to POSIX functions.
Copyright (c) 2012 - 2016, Victor Zverovich
All rights reserved.
For the license information refer to format.h.
*/
// Disable bogus MSVC warnings.
#ifndef _CRT_SECURE_NO_WARNINGS
# define _CRT_SECURE_NO_WARNINGS
#endif
#include "posix.h"
#include <limits.h>
#include <sys/types.h>
#include <sys/stat.h>
#ifndef _WIN32
# include <unistd.h>
#else
# ifndef WIN32_LEAN_AND_MEAN
# define WIN32_LEAN_AND_MEAN
# endif
# include <windows.h>
# include <io.h>
# define O_CREAT _O_CREAT
# define O_TRUNC _O_TRUNC
# ifndef S_IRUSR
# define S_IRUSR _S_IREAD
# endif
# ifndef S_IWUSR
# define S_IWUSR _S_IWRITE
# endif
# ifdef __MINGW32__
# define _SH_DENYNO 0x40
# endif
#endif // _WIN32
#ifdef fileno
# undef fileno
#endif
namespace
{
#ifdef _WIN32
// Return type of read and write functions.
typedef
int
RWResult
;
// On Windows the count argument to read and write is unsigned, so convert
// it from size_t preventing integer overflow.
inline
unsigned
convert_rwcount
(
std
::
size_t
count
)
{
return
count
<=
UINT_MAX
?
static_cast
<
unsigned
>
(
count
)
:
UINT_MAX
;
}
#else
// Return type of read and write functions.
typedef
ssize_t
RWResult
;
inline
std
::
size_t
convert_rwcount
(
std
::
size_t
count
)
{
return
count
;
}
#endif
}
fmt
::
BufferedFile
::~
BufferedFile
()
FMT_NOEXCEPT
{
if
(
file_
&&
FMT_SYSTEM
(
fclose
(
file_
))
!=
0
)
fmt
::
report_system_error
(
errno
,
"cannot close file"
);
}
fmt
::
BufferedFile
::
BufferedFile
(
fmt
::
CStringRef
filename
,
fmt
::
CStringRef
mode
)
{
FMT_RETRY_VAL
(
file_
,
FMT_SYSTEM
(
fopen
(
filename
.
c_str
(),
mode
.
c_str
())),
0
);
if
(
!
file_
)
FMT_THROW
(
SystemError
(
errno
,
"cannot open file {}"
,
filename
));
}
void
fmt
::
BufferedFile
::
close
()
{
if
(
!
file_
)
return
;
int
result
=
FMT_SYSTEM
(
fclose
(
file_
));
file_
=
FMT_NULL
;
if
(
result
!=
0
)
FMT_THROW
(
SystemError
(
errno
,
"cannot close file"
));
}
// A macro used to prevent expansion of fileno on broken versions of MinGW.
#define FMT_ARGS
int
fmt
::
BufferedFile
::
fileno
()
const
{
int
fd
=
FMT_POSIX_CALL
(
fileno
FMT_ARGS
(
file_
));
if
(
fd
==
-
1
)
FMT_THROW
(
SystemError
(
errno
,
"cannot get file descriptor"
));
return
fd
;
}
fmt
::
File
::
File
(
fmt
::
CStringRef
path
,
int
oflag
)
{
int
mode
=
S_IRUSR
|
S_IWUSR
;
#if defined(_WIN32) && !defined(__MINGW32__)
fd_
=
-
1
;
FMT_POSIX_CALL
(
sopen_s
(
&
fd_
,
path
.
c_str
(),
oflag
,
_SH_DENYNO
,
mode
));
#else
FMT_RETRY
(
fd_
,
FMT_POSIX_CALL
(
open
(
path
.
c_str
(),
oflag
,
mode
)));
#endif
if
(
fd_
==
-
1
)
FMT_THROW
(
SystemError
(
errno
,
"cannot open file {}"
,
path
));
}
fmt
::
File
::~
File
()
FMT_NOEXCEPT
{
// Don't retry close in case of EINTR!
// See http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
if
(
fd_
!=
-
1
&&
FMT_POSIX_CALL
(
close
(
fd_
))
!=
0
)
fmt
::
report_system_error
(
errno
,
"cannot close file"
);
}
void
fmt
::
File
::
close
()
{
if
(
fd_
==
-
1
)
return
;
// Don't retry close in case of EINTR!
// See http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
int
result
=
FMT_POSIX_CALL
(
close
(
fd_
));
fd_
=
-
1
;
if
(
result
!=
0
)
FMT_THROW
(
SystemError
(
errno
,
"cannot close file"
));
}
fmt
::
LongLong
fmt
::
File
::
size
()
const
{
#ifdef _WIN32
// Use GetFileSize instead of GetFileSizeEx for the case when _WIN32_WINNT
// is less than 0x0500 as is the case with some default MinGW builds.
// Both functions support large file sizes.
DWORD
size_upper
=
0
;
HANDLE
handle
=
reinterpret_cast
<
HANDLE
>
(
_get_osfhandle
(
fd_
));
DWORD
size_lower
=
FMT_SYSTEM
(
GetFileSize
(
handle
,
&
size_upper
));
if
(
size_lower
==
INVALID_FILE_SIZE
)
{
DWORD
error
=
GetLastError
();
if
(
error
!=
NO_ERROR
)
FMT_THROW
(
WindowsError
(
GetLastError
(),
"cannot get file size"
));
}
fmt
::
ULongLong
long_size
=
size_upper
;
return
(
long_size
<<
sizeof
(
DWORD
)
*
CHAR_BIT
)
|
size_lower
;
#else
typedef
struct
stat
Stat
;
Stat
file_stat
=
Stat
();
if
(
FMT_POSIX_CALL
(
fstat
(
fd_
,
&
file_stat
))
==
-
1
)
FMT_THROW
(
SystemError
(
errno
,
"cannot get file attributes"
));
FMT_STATIC_ASSERT
(
sizeof
(
fmt
::
LongLong
)
>=
sizeof
(
file_stat
.
st_size
),
"return type of File::size is not large enough"
);
return
file_stat
.
st_size
;
#endif
}
std
::
size_t
fmt
::
File
::
read
(
void
*
buffer
,
std
::
size_t
count
)
{
RWResult
result
=
0
;
FMT_RETRY
(
result
,
FMT_POSIX_CALL
(
read
(
fd_
,
buffer
,
convert_rwcount
(
count
))));
if
(
result
<
0
)
FMT_THROW
(
SystemError
(
errno
,
"cannot read from file"
));
return
internal
::
to_unsigned
(
result
);
}
std
::
size_t
fmt
::
File
::
write
(
const
void
*
buffer
,
std
::
size_t
count
)
{
RWResult
result
=
0
;
FMT_RETRY
(
result
,
FMT_POSIX_CALL
(
write
(
fd_
,
buffer
,
convert_rwcount
(
count
))));
if
(
result
<
0
)
FMT_THROW
(
SystemError
(
errno
,
"cannot write to file"
));
return
internal
::
to_unsigned
(
result
);
}
fmt
::
File
fmt
::
File
::
dup
(
int
fd
)
{
// Don't retry as dup doesn't return EINTR.
// http://pubs.opengroup.org/onlinepubs/009695399/functions/dup.html
int
new_fd
=
FMT_POSIX_CALL
(
dup
(
fd
));
if
(
new_fd
==
-
1
)
FMT_THROW
(
SystemError
(
errno
,
"cannot duplicate file descriptor {}"
,
fd
));
return
File
(
new_fd
);
}
void
fmt
::
File
::
dup2
(
int
fd
)
{
int
result
=
0
;
FMT_RETRY
(
result
,
FMT_POSIX_CALL
(
dup2
(
fd_
,
fd
)));
if
(
result
==
-
1
)
{
FMT_THROW
(
SystemError
(
errno
,
"cannot duplicate file descriptor {} to {}"
,
fd_
,
fd
));
}
}
void
fmt
::
File
::
dup2
(
int
fd
,
ErrorCode
&
ec
)
FMT_NOEXCEPT
{
int
result
=
0
;
FMT_RETRY
(
result
,
FMT_POSIX_CALL
(
dup2
(
fd_
,
fd
)));
if
(
result
==
-
1
)
ec
=
ErrorCode
(
errno
);
}
void
fmt
::
File
::
pipe
(
File
&
read_end
,
File
&
write_end
)
{
// Close the descriptors first to make sure that assignments don't throw
// and there are no leaks.
read_end
.
close
();
write_end
.
close
();
int
fds
[
2
]
=
{};
#ifdef _WIN32
// Make the default pipe capacity same as on Linux 2.6.11+.
enum
{
DEFAULT_CAPACITY
=
65536
};
int
result
=
FMT_POSIX_CALL
(
pipe
(
fds
,
DEFAULT_CAPACITY
,
_O_BINARY
));
#else
// Don't retry as the pipe function doesn't return EINTR.
// http://pubs.opengroup.org/onlinepubs/009696799/functions/pipe.html
int
result
=
FMT_POSIX_CALL
(
pipe
(
fds
));
#endif
if
(
result
!=
0
)
FMT_THROW
(
SystemError
(
errno
,
"cannot create pipe"
));
// The following assignments don't throw because read_fd and write_fd
// are closed.
read_end
=
File
(
fds
[
0
]);
write_end
=
File
(
fds
[
1
]);
}
fmt
::
BufferedFile
fmt
::
File
::
fdopen
(
const
char
*
mode
)
{
// Don't retry as fdopen doesn't return EINTR.
FILE
*
f
=
FMT_POSIX_CALL
(
fdopen
(
fd_
,
mode
));
if
(
!
f
)
FMT_THROW
(
SystemError
(
errno
,
"cannot associate stream with file descriptor"
));
BufferedFile
file
(
f
);
fd_
=
-
1
;
return
file
;
}
long
fmt
::
getpagesize
()
{
#ifdef _WIN32
SYSTEM_INFO
si
;
GetSystemInfo
(
&
si
);
return
si
.
dwPageSize
;
#else
long
size
=
FMT_POSIX_CALL
(
sysconf
(
_SC_PAGESIZE
));
if
(
size
<
0
)
FMT_THROW
(
SystemError
(
errno
,
"cannot get memory page size"
));
return
size
;
#endif
}
include/spdlog/fmt/bundled/posix.h
deleted
100644 → 0
View file @
378c7789
This diff is collapsed.
Click to expand it.
include/spdlog/fmt/bundled/printf.cc
deleted
100644 → 0
View file @
378c7789
/*
Formatting library for C++
Copyright (c) 2012 - 2016, Victor Zverovich
All rights reserved.
For the license information refer to format.h.
*/
#include "format.h"
#include "printf.h"
namespace
fmt
{
template
<
typename
Char
>
void
printf
(
BasicWriter
<
Char
>
&
w
,
BasicCStringRef
<
Char
>
format
,
ArgList
args
);
FMT_FUNC
int
fprintf
(
std
::
FILE
*
f
,
CStringRef
format
,
ArgList
args
)
{
MemoryWriter
w
;
printf
(
w
,
format
,
args
);
std
::
size_t
size
=
w
.
size
();
return
std
::
fwrite
(
w
.
data
(),
1
,
size
,
f
)
<
size
?
-
1
:
static_cast
<
int
>
(
size
);
}
#ifndef FMT_HEADER_ONLY
template
void
PrintfFormatter
<
char
>::
format
(
CStringRef
format
);
template
void
PrintfFormatter
<
wchar_t
>::
format
(
WCStringRef
format
);
#endif // FMT_HEADER_ONLY
}
// namespace fmt
include/spdlog/fmt/bundled/printf.h
deleted
100644 → 0
View file @
378c7789
This diff is collapsed.
Click to expand it.
include/spdlog/fmt/bundled/time.h
deleted
100644 → 0
View file @
378c7789
/*
Formatting library for C++ - time formatting
Copyright (c) 2012 - 2016, Victor Zverovich
All rights reserved.
For the license information refer to format.h.
*/
#ifndef FMT_TIME_H_
#define FMT_TIME_H_
#include "format.h"
#include <ctime>
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4702) // unreachable code
#pragma warning(disable : 4996) // "deprecated" functions
#endif
namespace
fmt
{
template
<
typename
ArgFormatter
>
void
format_arg
(
BasicFormatter
<
char
,
ArgFormatter
>
&
f
,
const
char
*&
format_str
,
const
std
::
tm
&
tm
)
{
if
(
*
format_str
==
':'
)
++
format_str
;
const
char
*
end
=
format_str
;
while
(
*
end
&&
*
end
!=
'}'
)
++
end
;
if
(
*
end
!=
'}'
)
FMT_THROW
(
FormatError
(
"missing '}' in format string"
));
internal
::
MemoryBuffer
<
char
,
internal
::
INLINE_BUFFER_SIZE
>
format
;
format
.
append
(
format_str
,
end
+
1
);
format
[
format
.
size
()
-
1
]
=
'\0'
;
Buffer
<
char
>
&
buffer
=
f
.
writer
().
buffer
();
std
::
size_t
start
=
buffer
.
size
();
for
(;;)
{
std
::
size_t
size
=
buffer
.
capacity
()
-
start
;
std
::
size_t
count
=
std
::
strftime
(
&
buffer
[
start
],
size
,
&
format
[
0
],
&
tm
);
if
(
count
!=
0
)
{
buffer
.
resize
(
start
+
count
);
break
;
}
if
(
size
>=
format
.
size
()
*
256
)
{
// If the buffer is 256 times larger than the format string, assume
// that `strftime` gives an empty result. There doesn't seem to be a
// better way to distinguish the two cases:
// https://github.com/fmtlib/fmt/issues/367
break
;
}
const
std
::
size_t
MIN_GROWTH
=
10
;
buffer
.
reserve
(
buffer
.
capacity
()
+
(
size
>
MIN_GROWTH
?
size
:
MIN_GROWTH
));
}
format_str
=
end
+
1
;
}
namespace
internal
{
inline
Null
<>
localtime_r
(...)
{
return
Null
<>
();
}
inline
Null
<>
localtime_s
(...)
{
return
Null
<>
();
}
inline
Null
<>
gmtime_r
(...)
{
return
Null
<>
();
}
inline
Null
<>
gmtime_s
(...)
{
return
Null
<>
();
}
}
// namespace internal
// Thread-safe replacement for std::localtime
inline
std
::
tm
localtime
(
std
::
time_t
time
)
{
struct
LocalTime
{
std
::
time_t
time_
;
std
::
tm
tm_
;
LocalTime
(
std
::
time_t
t
)
:
time_
(
t
)
{
}
bool
run
()
{
using
namespace
fmt
::
internal
;
return
handle
(
localtime_r
(
&
time_
,
&
tm_
));
}
bool
handle
(
std
::
tm
*
tm
)
{
return
tm
!=
FMT_NULL
;
}
bool
handle
(
internal
::
Null
<>
)
{
using
namespace
fmt
::
internal
;
return
fallback
(
localtime_s
(
&
tm_
,
&
time_
));
}
bool
fallback
(
int
res
)
{
return
res
==
0
;
}
bool
fallback
(
internal
::
Null
<>
)
{
using
namespace
fmt
::
internal
;
std
::
tm
*
tm
=
std
::
localtime
(
&
time_
);
if
(
tm
)
tm_
=
*
tm
;
return
tm
!=
FMT_NULL
;
}
};
LocalTime
lt
(
time
);
if
(
lt
.
run
())
return
lt
.
tm_
;
// Too big time values may be unsupported.
FMT_THROW
(
fmt
::
FormatError
(
"time_t value out of range"
));
return
std
::
tm
();
}
// Thread-safe replacement for std::gmtime
inline
std
::
tm
gmtime
(
std
::
time_t
time
)
{
struct
GMTime
{
std
::
time_t
time_
;
std
::
tm
tm_
;
GMTime
(
std
::
time_t
t
)
:
time_
(
t
)
{
}
bool
run
()
{
using
namespace
fmt
::
internal
;
return
handle
(
gmtime_r
(
&
time_
,
&
tm_
));
}
bool
handle
(
std
::
tm
*
tm
)
{
return
tm
!=
FMT_NULL
;
}
bool
handle
(
internal
::
Null
<>
)
{
using
namespace
fmt
::
internal
;
return
fallback
(
gmtime_s
(
&
tm_
,
&
time_
));
}
bool
fallback
(
int
res
)
{
return
res
==
0
;
}
bool
fallback
(
internal
::
Null
<>
)
{
std
::
tm
*
tm
=
std
::
gmtime
(
&
time_
);
if
(
tm
!=
FMT_NULL
)
tm_
=
*
tm
;
return
tm
!=
FMT_NULL
;
}
};
GMTime
gt
(
time
);
if
(
gt
.
run
())
return
gt
.
tm_
;
// Too big time values may be unsupported.
FMT_THROW
(
fmt
::
FormatError
(
"time_t value out of range"
));
return
std
::
tm
();
}
}
// namespace fmt
#ifdef _MSC_VER
#pragma warning(pop)
#endif
#endif // FMT_TIME_H_
include/spdlog/fmt/fmt.h
View file @
cdbf2e36
//
// Copyright(c) 2016 Gabi Melman.
// Copyright(c) 2016
-2018
Gabi Melman.
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
//
...
...
@@ -11,23 +11,18 @@
//
#if !defined(SPDLOG_FMT_EXTERNAL)
#ifndef FMT_HEADER_ONLY
#define FMT_HEADER_ONLY
#endif
#ifndef FMT_USE_WINDOWS_H
#define FMT_USE_WINDOWS_H 0
#endif
#include "bundled/core.h"
#include "bundled/format.h"
#if defined(SPDLOG_FMT_PRINTF)
#include "bundled/printf.h"
#endif
#else // external fmtlib
#include <fmt/core.h>
#include <fmt/format.h>
#if defined(SPDLOG_FMT_PRINTF)
#include <fmt/printf.h>
#endif
#endif
include/spdlog/sinks/daily_file_sink.h
View file @
cdbf2e36
...
...
@@ -30,10 +30,10 @@ struct default_daily_file_name_calculator
std
::
tm
tm
=
spdlog
::
details
::
os
::
localtime
();
filename_t
basename
,
ext
;
std
::
tie
(
basename
,
ext
)
=
details
::
file_helper
::
split_by_extenstion
(
filename
);
std
::
conditional
<
std
::
is_same
<
filename_t
::
value_type
,
char
>::
value
,
fmt
::
MemoryWriter
,
fmt
::
WMemoryWrit
er
>::
type
w
;
w
.
write
(
SPDLOG_FILENAME_T
(
"{}_{:04d}-{:02d}-{:02d}_{:02d}-{:02d}{}"
),
basename
,
tm
.
tm_year
+
1900
,
tm
.
tm_mon
+
1
,
tm
.
tm_mday
,
tm
.
tm_hour
,
tm
.
tm_min
,
ext
);
return
w
.
str
(
);
std
::
conditional
<
std
::
is_same
<
filename_t
::
value_type
,
char
>::
value
,
fmt
::
memory_buffer
,
fmt
::
wmemory_buff
er
>::
type
w
;
fmt
::
format_to
(
w
,
SPDLOG_FILENAME_T
(
"{}_{:04d}-{:02d}-{:02d}_{:02d}-{:02d}{}"
),
basename
,
tm
.
tm_year
+
1900
,
tm
.
tm_mon
+
1
,
tm
.
tm_
mday
,
tm
.
tm_
hour
,
tm
.
tm_min
,
ext
);
return
fmt
::
to_string
(
w
);
}
};
...
...
@@ -48,9 +48,9 @@ struct dateonly_daily_file_name_calculator
std
::
tm
tm
=
spdlog
::
details
::
os
::
localtime
();
filename_t
basename
,
ext
;
std
::
tie
(
basename
,
ext
)
=
details
::
file_helper
::
split_by_extenstion
(
filename
);
std
::
conditional
<
std
::
is_same
<
filename_t
::
value_type
,
char
>::
value
,
fmt
::
MemoryWriter
,
fmt
::
WMemoryWrit
er
>::
type
w
;
w
.
write
(
SPDLOG_FILENAME_T
(
"{}_{:04d}-{:02d}-{:02d}{}"
),
basename
,
tm
.
tm_year
+
1900
,
tm
.
tm_mon
+
1
,
tm
.
tm_mday
,
ext
);
return
w
.
str
(
);
std
::
conditional
<
std
::
is_same
<
filename_t
::
value_type
,
char
>::
value
,
fmt
::
memory_buffer
,
fmt
::
wmemory_buff
er
>::
type
w
;
fmt
::
format_to
(
w
,
SPDLOG_FILENAME_T
(
"{}_{:04d}-{:02d}-{:02d}{}"
),
basename
,
tm
.
tm_year
+
1900
,
tm
.
tm_mon
+
1
,
tm
.
tm_mday
,
ext
);
return
fmt
::
to_string
(
w
);
}
};
...
...
include/spdlog/sinks/rotating_file_sink.h
View file @
cdbf2e36
...
...
@@ -40,18 +40,18 @@ public:
// e.g. calc_filename("logs/mylog.txt, 3) => "logs/mylog.3.txt".
static
filename_t
calc_filename
(
const
filename_t
&
filename
,
std
::
size_t
index
)
{
typename
std
::
conditional
<
std
::
is_same
<
filename_t
::
value_type
,
char
>::
value
,
fmt
::
MemoryWriter
,
fmt
::
WMemoryWrit
er
>::
type
w
;
typename
std
::
conditional
<
std
::
is_same
<
filename_t
::
value_type
,
char
>::
value
,
fmt
::
memory_buffer
,
fmt
::
wmemory_buff
er
>::
type
w
;
if
(
index
!=
0u
)
{
filename_t
basename
,
ext
;
std
::
tie
(
basename
,
ext
)
=
details
::
file_helper
::
split_by_extenstion
(
filename
);
w
.
write
(
SPDLOG_FILENAME_T
(
"{}.{}{}"
),
basename
,
index
,
ext
);
fmt
::
format_to
(
w
,
SPDLOG_FILENAME_T
(
"{}.{}{}"
),
basename
,
index
,
ext
);
}
else
{
w
.
write
(
SPDLOG_FILENAME_T
(
"{}"
),
filename
);
fmt
::
format_to
(
w
,
SPDLOG_FILENAME_T
(
"{}"
),
filename
);
}
return
w
.
str
(
);
return
fmt
::
to_string
(
w
);
}
protected
:
...
...
include/spdlog/sinks/syslog_sink.h
View file @
cdbf2e36
...
...
@@ -50,7 +50,7 @@ public:
void
log
(
const
details
::
log_msg
&
msg
)
override
{
::
syslog
(
syslog_prio_from_level
(
msg
),
"%s"
,
msg
.
raw
.
str
(
).
c_str
());
::
syslog
(
syslog_prio_from_level
(
msg
),
"%s"
,
fmt
::
to_string
(
msg
.
raw
).
c_str
());
}
void
flush
()
override
{}
...
...
tests/Makefile
View file @
cdbf2e36
CXX
?=
g++
ifeq
($(STYLE),printf)
$(info
***
PRINTF
STYLE
***)
CXXFLAGS
=
-DSPDLOG_FMT_PRINTF
-Wall
-pedantic
-std
=
c++11
-pthread
-O3
-I
../include
else
$(info
***
FORMAT
STYLE
***)
CXXFLAGS
=
-Wall
-pedantic
-std
=
c++11
-pthread
-O3
-I
../include
endif
CXXFLAGS
=
-Wall
-pedantic
-std
=
c++11
-pthread
-O3
-I
../include
LDPFALGS
=
-pthread
CPP_FILES
:=
$
(
wildcard
*
.cpp
)
...
...
tests/errors.cpp
View file @
cdbf2e36
...
...
@@ -26,13 +26,8 @@ TEST_CASE("default_error_handler", "[errors]]")
auto
logger
=
spdlog
::
create
<
spdlog
::
sinks
::
simple_file_sink_mt
>
(
"test-error"
,
filename
,
true
);
logger
->
set_pattern
(
"%v"
);
#if !defined(SPDLOG_FMT_PRINTF)
logger
->
info
(
"Test message {} {}"
,
1
);
logger
->
info
(
"Test message {}"
,
2
);
#else
logger
->
info
(
"Test message %d %d"
,
1
);
logger
->
info
(
"Test message %d"
,
2
);
#endif
logger
->
flush
();
REQUIRE
(
file_contents
(
filename
)
==
std
::
string
(
"Test message 2
\n
"
));
...
...
@@ -50,11 +45,8 @@ TEST_CASE("custom_error_handler", "[errors]]")
logger
->
flush_on
(
spdlog
::
level
::
info
);
logger
->
set_error_handler
([
=
](
const
std
::
string
&
)
{
throw
custom_ex
();
});
logger
->
info
(
"Good message #1"
);
#if !defined(SPDLOG_FMT_PRINTF)
REQUIRE_THROWS_AS
(
logger
->
info
(
"Bad format msg {} {}"
,
"xxx"
),
custom_ex
);
#else
REQUIRE_THROWS_AS
(
logger
->
info
(
"Bad format msg %s %s"
,
"xxx"
),
custom_ex
);
#endif
logger
->
info
(
"Good message #2"
);
REQUIRE
(
count_lines
(
filename
)
==
2
);
}
...
...
@@ -91,11 +83,7 @@ TEST_CASE("async_error_handler", "[errors]]")
ofs
<<
err_msg
;
});
logger
->
info
(
"Good message #1"
);
#if !defined(SPDLOG_FMT_PRINTF)
logger
->
info
(
"Bad format msg {} {}"
,
"xxx"
);
#else
logger
->
info
(
"Bad format msg %s %s"
,
"xxx"
);
#endif
logger
->
info
(
"Good message #2"
);
spdlog
::
drop
(
"logger"
);
// force logger to drain the queue and shutdown
}
...
...
tests/file_log.cpp
View file @
cdbf2e36
...
...
@@ -11,13 +11,9 @@ TEST_CASE("simple_file_logger", "[simple_logger]]")
auto
logger
=
spdlog
::
create
<
spdlog
::
sinks
::
simple_file_sink_mt
>
(
"logger"
,
filename
);
logger
->
set_pattern
(
"%v"
);
#if !defined(SPDLOG_FMT_PRINTF)
logger
->
info
(
"Test message {}"
,
1
);
logger
->
info
(
"Test message {}"
,
2
);
#else
logger
->
info
(
"Test message %d"
,
1
);
logger
->
info
(
"Test message %d"
,
2
);
#endif
logger
->
flush
();
REQUIRE
(
file_contents
(
filename
)
==
std
::
string
(
"Test message 1
\n
Test message 2
\n
"
));
REQUIRE
(
count_lines
(
filename
)
==
2
);
...
...
@@ -35,13 +31,8 @@ TEST_CASE("flush_on", "[flush_on]]")
logger
->
trace
(
"Should not be flushed"
);
REQUIRE
(
count_lines
(
filename
)
==
0
);
#if !defined(SPDLOG_FMT_PRINTF)
logger
->
info
(
"Test message {}"
,
1
);
logger
->
info
(
"Test message {}"
,
2
);
#else
logger
->
info
(
"Test message %d"
,
1
);
logger
->
info
(
"Test message %d"
,
2
);
#endif
logger
->
flush
();
REQUIRE
(
file_contents
(
filename
)
==
std
::
string
(
"Should not be flushed
\n
Test message 1
\n
Test message 2
\n
"
));
REQUIRE
(
count_lines
(
filename
)
==
3
);
...
...
@@ -56,11 +47,7 @@ TEST_CASE("rotating_file_logger1", "[rotating_logger]]")
for
(
int
i
=
0
;
i
<
10
;
++
i
)
{
#if !defined(SPDLOG_FMT_PRINTF)
logger
->
info
(
"Test message {}"
,
i
);
#else
logger
->
info
(
"Test message %d"
,
i
);
#endif
}
logger
->
flush
();
...
...
@@ -82,11 +69,8 @@ TEST_CASE("rotating_file_logger2", "[rotating_logger]]")
REQUIRE
(
count_lines
(
filename
)
==
10
);
for
(
int
i
=
0
;
i
<
1000
;
i
++
)
{
#if !defined(SPDLOG_FMT_PRINTF)
logger
->
info
(
"Test message {}"
,
i
);
#else
logger
->
info
(
"Test message %d"
,
i
);
#endif
}
logger
->
flush
();
...
...
@@ -108,11 +92,7 @@ TEST_CASE("daily_logger", "[daily_logger]]")
logger
->
flush_on
(
spdlog
::
level
::
info
);
for
(
int
i
=
0
;
i
<
10
;
++
i
)
{
#if !defined(SPDLOG_FMT_PRINTF)
logger
->
info
(
"Test message {}"
,
i
);
#else
logger
->
info
(
"Test message %d"
,
i
);
#endif
}
auto
filename
=
w
.
str
();
...
...
@@ -133,11 +113,8 @@ TEST_CASE("daily_logger with dateonly calculator", "[daily_logger_dateonly]]")
auto
logger
=
spdlog
::
create
<
sink_type
>
(
"logger"
,
basename
,
0
,
0
);
for
(
int
i
=
0
;
i
<
10
;
++
i
)
{
#if !defined(SPDLOG_FMT_PRINTF)
logger
->
info
(
"Test message {}"
,
i
);
#else
logger
->
info
(
"Test message %d"
,
i
);
#endif
}
logger
->
flush
();
auto
filename
=
w
.
str
();
...
...
@@ -169,11 +146,7 @@ TEST_CASE("daily_logger with custom calculator", "[daily_logger_custom]]")
auto
logger
=
spdlog
::
create
<
sink_type
>
(
"logger"
,
basename
,
0
,
0
);
for
(
int
i
=
0
;
i
<
10
;
++
i
)
{
#if !defined(SPDLOG_FMT_PRINTF)
logger
->
info
(
"Test message {}"
,
i
);
#else
logger
->
info
(
"Test message %d"
,
i
);
#endif
}
logger
->
flush
();
...
...
tests/test_macros.cpp
View file @
cdbf2e36
...
...
@@ -31,16 +31,9 @@ TEST_CASE("debug and trace with format strings", "[macros]]")
logger
->
set_pattern
(
"%v"
);
logger
->
set_level
(
spdlog
::
level
::
trace
);
#if !defined(SPDLOG_FMT_PRINTF)
SPDLOG_TRACE
(
logger
,
"Test message {}"
,
1
);
// SPDLOG_DEBUG(logger, "Test message 2");
SPDLOG_DEBUG
(
logger
,
"Test message {}"
,
222
);
#else
SPDLOG_TRACE
(
logger
,
"Test message %d"
,
1
);
// SPDLOG_DEBUG(logger, "Test message 2");
SPDLOG_DEBUG
(
logger
,
"Test message %d"
,
222
);
#endif
logger
->
flush
();
REQUIRE
(
ends_with
(
file_contents
(
filename
),
"Test message 222
\n
"
));
...
...
tests/tests.sln
View file @
cdbf2e36
...
...
@@ -47,8 +47,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "bundled", "bundled", "{F0D4
..\include\spdlog\fmt\bundled\ostream.h = ..\include\spdlog\fmt\bundled\ostream.h
..\include\spdlog\fmt\bundled\posix.cc = ..\include\spdlog\fmt\bundled\posix.cc
..\include\spdlog\fmt\bundled\posix.h = ..\include\spdlog\fmt\bundled\posix.h
..\include\spdlog\fmt\bundled\printf.cc = ..\include\spdlog\fmt\bundled\printf.cc
..\include\spdlog\fmt\bundled\printf.h = ..\include\spdlog\fmt\bundled\printf.h
..\include\spdlog\fmt\bundled\time.h = ..\include\spdlog\fmt\bundled\time.h
EndProjectSection
EndProject
...
...
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