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
b13735dc
Commit
b13735dc
authored
Aug 22, 2016
by
gabime
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
astyle
parent
20cb73e9
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
253 additions
and
251 deletions
+253
-251
common.h
include/spdlog/common.h
+143
-143
mpmc_bounded_q.h
include/spdlog/details/mpmc_bounded_q.h
+14
-14
os.h
include/spdlog/details/os.h
+14
-12
dist_sink.h
include/spdlog/sinks/dist_sink.h
+1
-1
syslog_sink.h
include/spdlog/sinks/syslog_sink.h
+81
-81
No files found.
include/spdlog/common.h
View file @
b13735dc
//
// Copyright(c) 2015 Gabi Melman.
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
//
#pragma once
#include <string>
#include <initializer_list>
#include <chrono>
#include <memory>
#include <atomic>
#include <exception>
#include<functional>
#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES)
#include <codecvt>
#include <locale>
#endif
#include <spdlog/details/null_mutex.h>
//visual studio upto 2013 does not support noexcept nor constexpr
#if defined(_MSC_VER) && (_MSC_VER < 1900)
#define SPDLOG_NOEXCEPT throw()
#define SPDLOG_CONSTEXPR
#else
#define SPDLOG_NOEXCEPT noexcept
#define SPDLOG_CONSTEXPR constexpr
#endif
#if defined(__GNUC__) || defined(__clang__)
#define DEPRECATED __attribute__((deprecated))
#elif defined(_MSC_VER)
#define DEPRECATED __declspec(deprecated)
#else
#define DEPRECATED
#endif
#include <spdlog/fmt/fmt.h>
namespace
spdlog
{
class
formatter
;
namespace
sinks
{
class
sink
;
}
using
log_clock
=
std
::
chrono
::
system_clock
;
using
sink_ptr
=
std
::
shared_ptr
<
sinks
::
sink
>
;
using
sinks_init_list
=
std
::
initializer_list
<
sink_ptr
>
;
using
formatter_ptr
=
std
::
shared_ptr
<
spdlog
::
formatter
>
;
#if defined(SPDLOG_NO_ATOMIC_LEVELS)
using
level_t
=
details
::
null_atomic_int
;
#else
using
level_t
=
std
::
atomic_int
;
#endif
using
log_err_handler
=
std
::
function
<
void
(
const
std
::
string
&
err_msg
)
>
;
//Log level enum
namespace
level
{
typedef
enum
{
trace
=
0
,
debug
=
1
,
info
=
2
,
warn
=
3
,
err
=
4
,
critical
=
5
,
off
=
6
}
level_enum
;
static
const
char
*
level_names
[]{
"trace"
,
"debug"
,
"info"
,
"warning"
,
"error"
,
"critical"
,
"off"
};
static
const
char
*
short_level_names
[]{
"T"
,
"D"
,
"I"
,
"W"
,
"E"
,
"C"
,
"O"
};
inline
const
char
*
to_str
(
spdlog
::
level
::
level_enum
l
)
{
return
level_names
[
l
];
}
inline
const
char
*
to_short_str
(
spdlog
::
level
::
level_enum
l
)
{
return
short_level_names
[
l
];
}
}
//level
//
// Async overflow policy - block by default.
//
enum
class
async_overflow_policy
{
block_retry
,
// Block / yield / sleep until message can be enqueued
discard_log_msg
// Discard the message it enqueue fails
};
//
// Log exception
//
namespace
details
{
namespace
os
{
std
::
string
errno_str
(
int
err_num
);
}
}
class
spdlog_ex
:
public
std
::
exception
{
public
:
spdlog_ex
(
const
std
::
string
&
msg
)
:
_msg
(
msg
)
{}
spdlog_ex
(
const
std
::
string
&
msg
,
int
last_errno
)
{
_msg
=
msg
+
": "
+
details
::
os
::
errno_str
(
last_errno
);
}
const
char
*
what
()
const
SPDLOG_NOEXCEPT
override
{
return
_msg
.
c_str
();
}
private
:
std
::
string
_msg
;
};
//
// wchar support for windows file names (SPDLOG_WCHAR_FILENAMES must be defined)
//
#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES)
using
filename_t
=
std
::
wstring
;
#else
using
filename_t
=
std
::
string
;
#endif
}
//spdlog
//
// Copyright(c) 2015 Gabi Melman.
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
//
#pragma once
#include <string>
#include <initializer_list>
#include <chrono>
#include <memory>
#include <atomic>
#include <exception>
#include<functional>
#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES)
#include <codecvt>
#include <locale>
#endif
#include <spdlog/details/null_mutex.h>
//visual studio upto 2013 does not support noexcept nor constexpr
#if defined(_MSC_VER) && (_MSC_VER < 1900)
#define SPDLOG_NOEXCEPT throw()
#define SPDLOG_CONSTEXPR
#else
#define SPDLOG_NOEXCEPT noexcept
#define SPDLOG_CONSTEXPR constexpr
#endif
#if defined(__GNUC__) || defined(__clang__)
#define DEPRECATED __attribute__((deprecated))
#elif defined(_MSC_VER)
#define DEPRECATED __declspec(deprecated)
#else
#define DEPRECATED
#endif
#include <spdlog/fmt/fmt.h>
namespace
spdlog
{
class
formatter
;
namespace
sinks
{
class
sink
;
}
using
log_clock
=
std
::
chrono
::
system_clock
;
using
sink_ptr
=
std
::
shared_ptr
<
sinks
::
sink
>
;
using
sinks_init_list
=
std
::
initializer_list
<
sink_ptr
>
;
using
formatter_ptr
=
std
::
shared_ptr
<
spdlog
::
formatter
>
;
#if defined(SPDLOG_NO_ATOMIC_LEVELS)
using
level_t
=
details
::
null_atomic_int
;
#else
using
level_t
=
std
::
atomic_int
;
#endif
using
log_err_handler
=
std
::
function
<
void
(
const
std
::
string
&
err_msg
)
>
;
//Log level enum
namespace
level
{
typedef
enum
{
trace
=
0
,
debug
=
1
,
info
=
2
,
warn
=
3
,
err
=
4
,
critical
=
5
,
off
=
6
}
level_enum
;
static
const
char
*
level_names
[]
{
"trace"
,
"debug"
,
"info"
,
"warning"
,
"error"
,
"critical"
,
"off"
};
static
const
char
*
short_level_names
[]
{
"T"
,
"D"
,
"I"
,
"W"
,
"E"
,
"C"
,
"O"
};
inline
const
char
*
to_str
(
spdlog
::
level
::
level_enum
l
)
{
return
level_names
[
l
];
}
inline
const
char
*
to_short_str
(
spdlog
::
level
::
level_enum
l
)
{
return
short_level_names
[
l
];
}
}
//level
//
// Async overflow policy - block by default.
//
enum
class
async_overflow_policy
{
block_retry
,
// Block / yield / sleep until message can be enqueued
discard_log_msg
// Discard the message it enqueue fails
};
//
// Log exception
//
namespace
details
{
namespace
os
{
std
::
string
errno_str
(
int
err_num
);
}
}
class
spdlog_ex
:
public
std
::
exception
{
public
:
spdlog_ex
(
const
std
::
string
&
msg
)
:
_msg
(
msg
)
{}
spdlog_ex
(
const
std
::
string
&
msg
,
int
last_errno
)
{
_msg
=
msg
+
": "
+
details
::
os
::
errno_str
(
last_errno
);
}
const
char
*
what
()
const
SPDLOG_NOEXCEPT
override
{
return
_msg
.
c_str
();
}
private
:
std
::
string
_msg
;
};
//
// wchar support for windows file names (SPDLOG_WCHAR_FILENAMES must be defined)
//
#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES)
using
filename_t
=
std
::
wstring
;
#else
using
filename_t
=
std
::
string
;
#endif
}
//spdlog
include/spdlog/details/mpmc_bounded_q.h
View file @
b13735dc
...
...
@@ -60,9 +60,9 @@ public:
using
item_type
=
T
;
mpmc_bounded_queue
(
size_t
buffer_size
)
:
max_size_
(
buffer_size
),
buffer_
(
new
cell_t
[
buffer_size
]),
buffer_mask_
(
buffer_size
-
1
)
:
max_size_
(
buffer_size
),
buffer_
(
new
cell_t
[
buffer_size
]),
buffer_mask_
(
buffer_size
-
1
)
{
//queue size must be power of two
if
(
!
((
buffer_size
>=
2
)
&&
((
buffer_size
&
(
buffer_size
-
1
))
==
0
)))
...
...
@@ -133,15 +133,15 @@ public:
return
true
;
}
size_t
approx_size
()
{
size_t
first_pos
=
dequeue_pos_
.
load
(
std
::
memory_order_relaxed
);
size_t
last_pos
=
enqueue_pos_
.
load
(
std
::
memory_order_relaxed
);
if
(
last_pos
<=
first_pos
)
return
0
;
auto
size
=
last_pos
-
first_pos
;
return
size
<
max_size_
?
size
:
max_size_
;
}
size_t
approx_size
()
{
size_t
first_pos
=
dequeue_pos_
.
load
(
std
::
memory_order_relaxed
);
size_t
last_pos
=
enqueue_pos_
.
load
(
std
::
memory_order_relaxed
);
if
(
last_pos
<=
first_pos
)
return
0
;
auto
size
=
last_pos
-
first_pos
;
return
size
<
max_size_
?
size
:
max_size_
;
}
private
:
struct
cell_t
...
...
@@ -150,7 +150,7 @@ private:
T
data_
;
};
size_t
const
max_size_
;
size_t
const
max_size_
;
static
size_t
const
cacheline_size
=
64
;
typedef
char
cacheline_pad_t
[
cacheline_size
];
...
...
@@ -165,7 +165,7 @@ private:
cacheline_pad_t
pad3_
;
mpmc_bounded_queue
(
mpmc_bounded_queue
const
&
)
=
delete
;
void
operator
=
(
mpmc_bounded_queue
const
&
)
=
delete
;
void
operator
=
(
mpmc_bounded_queue
const
&
)
=
delete
;
};
}
// ns details
...
...
include/spdlog/details/os.h
View file @
b13735dc
...
...
@@ -250,26 +250,28 @@ inline int utc_minutes_offset(const std::tm& tm = details::os::localtime())
offset
-=
tzinfo
.
StandardBias
;
return
offset
;
#else
#if defined(sun) || defined(__sun)
// 'tm_gmtoff' field is BSD extension and it's missing on SunOS/Solaris
struct
helper
{
static
long
int
calculate_gmt_offset
(
const
std
::
tm
&
localtm
=
details
::
os
::
localtime
(),
const
std
::
tm
&
gmtm
=
details
::
os
::
gmtime
())
{
struct
helper
{
static
long
int
calculate_gmt_offset
(
const
std
::
tm
&
localtm
=
details
::
os
::
localtime
(),
const
std
::
tm
&
gmtm
=
details
::
os
::
gmtime
())
{
int
local_year
=
localtm
.
tm_year
+
(
1900
-
1
);
int
gmt_year
=
gmtm
.
tm_year
+
(
1900
-
1
);
long
int
days
=
(
// difference in day of year
localtm
.
tm_yday
-
gmtm
.
tm_yday
// difference in day of year
localtm
.
tm_yday
-
gmtm
.
tm_yday
// + intervening leap days
+
((
local_year
>>
2
)
-
(
gmt_year
>>
2
))
-
(
local_year
/
100
-
gmt_year
/
100
)
+
((
local_year
/
100
>>
2
)
-
(
gmt_year
/
100
>>
2
))
// + intervening leap days
+
((
local_year
>>
2
)
-
(
gmt_year
>>
2
))
-
(
local_year
/
100
-
gmt_year
/
100
)
+
((
local_year
/
100
>>
2
)
-
(
gmt_year
/
100
>>
2
))
// + difference in years * 365 */
+
(
long
int
)(
local_year
-
gmt_year
)
*
365
);
// + difference in years * 365 */
+
(
long
int
)(
local_year
-
gmt_year
)
*
365
);
long
int
hours
=
(
24
*
days
)
+
(
localtm
.
tm_hour
-
gmtm
.
tm_hour
);
long
int
mins
=
(
60
*
hours
)
+
(
localtm
.
tm_min
-
gmtm
.
tm_min
);
...
...
include/spdlog/sinks/dist_sink.h
View file @
b13735dc
...
...
@@ -24,7 +24,7 @@ namespace sinks
template
<
class
Mutex
>
class
dist_sink
:
public
base_sink
<
Mutex
>
{
public
:
public
:
explicit
dist_sink
()
:
_sinks
()
{}
dist_sink
(
const
dist_sink
&
)
=
delete
;
dist_sink
&
operator
=
(
const
dist_sink
&
)
=
delete
;
...
...
include/spdlog/sinks/syslog_sink.h
View file @
b13735dc
//
// Copyright(c) 2015 Gabi Melman.
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
//
#pragma once
#include <spdlog/common.h>
#ifdef SPDLOG_ENABLE_SYSLOG
#include <spdlog/sinks/sink.h>
#include <spdlog/details/log_msg.h>
#include <array>
#include <string>
#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
<
int
>
(
level
::
trace
)]
=
LOG_DEBUG
;
_priorities
[
static_cast
<
int
>
(
level
::
debug
)]
=
LOG_DEBUG
;
_priorities
[
static_cast
<
int
>
(
level
::
info
)]
=
LOG_INFO
;
_priorities
[
static_cast
<
int
>
(
level
::
warn
)]
=
LOG_WARNING
;
_priorities
[
static_cast
<
int
>
(
level
::
err
)]
=
LOG_ERR
;
_priorities
[
static_cast
<
int
>
(
level
::
critical
)]
=
LOG_CRIT
;
_priorities
[
static_cast
<
int
>
(
level
::
off
)]
=
LOG_INFO
;
//set ident to be program name if empty
::
openlog
(
_ident
.
empty
()
?
nullptr
:
_ident
.
c_str
(),
syslog_option
,
syslog_facility
);
}
~
syslog_sink
()
{
::
closelog
();
}
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
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
;
//
// 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
<
int
>
(
msg
.
level
)];
}
};
}
}
#endif
//
// Copyright(c) 2015 Gabi Melman.
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
//
#pragma once
#include <spdlog/common.h>
#ifdef SPDLOG_ENABLE_SYSLOG
#include <spdlog/sinks/sink.h>
#include <spdlog/details/log_msg.h>
#include <array>
#include <string>
#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
<
int
>
(
level
::
trace
)]
=
LOG_DEBUG
;
_priorities
[
static_cast
<
int
>
(
level
::
debug
)]
=
LOG_DEBUG
;
_priorities
[
static_cast
<
int
>
(
level
::
info
)]
=
LOG_INFO
;
_priorities
[
static_cast
<
int
>
(
level
::
warn
)]
=
LOG_WARNING
;
_priorities
[
static_cast
<
int
>
(
level
::
err
)]
=
LOG_ERR
;
_priorities
[
static_cast
<
int
>
(
level
::
critical
)]
=
LOG_CRIT
;
_priorities
[
static_cast
<
int
>
(
level
::
off
)]
=
LOG_INFO
;
//set ident to be program name if empty
::
openlog
(
_ident
.
empty
()
?
nullptr
:
_ident
.
c_str
(),
syslog_option
,
syslog_facility
);
}
~
syslog_sink
()
{
::
closelog
();
}
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
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
;
//
// 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
<
int
>
(
msg
.
level
)];
}
};
}
}
#endif
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