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
af80db8c
Commit
af80db8c
authored
Mar 14, 2019
by
Alexander Zvyagin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add systemd sink.
parent
053d5ad2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
125 additions
and
0 deletions
+125
-0
systemd_sink.h
include/spdlog/sinks/systemd_sink.h
+90
-0
test_systemd.cpp
tests/test_systemd.cpp
+35
-0
No files found.
include/spdlog/sinks/systemd_sink.h
0 → 100644
View file @
af80db8c
//
// Copyright(c) 2015 Gabi Melman.
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
//
#pragma once
#ifndef SPDLOG_H
#include "spdlog/spdlog.h"
#endif
#include "spdlog/sinks/base_sink.h"
#include <array>
#include <string>
#include <systemd/sd-journal.h>
namespace
spdlog
{
namespace
sinks
{
inline
int
syslog_level
(
level
::
level_enum
l
)
{
switch
(
l
)
{
case
level
:
:
off
:
case
level
:
:
trace
:
case
level
:
:
debug
:
return
LOG_DEBUG
;
case
level
:
:
info
:
return
LOG_INFO
;
case
level
:
:
warn
:
return
LOG_WARNING
;
case
level
:
:
err
:
return
LOG_ERR
;
case
level
:
:
critical
:
return
LOG_CRIT
;
default
:
throw
std
::
invalid_argument
(
"systemd_sink.h syslog_level()"
);
}
}
/**
* Sink that write to systemd using the `sd_journal_print()` library call.
*
* Locking is not needed, as `sd_journal_print()` itself is thread-safe.
*/
template
<
typename
Mutex
>
class
systemd_sink
:
public
base_sink
<
Mutex
>
{
public
:
//
explicit
systemd_sink
(
void
)
{}
~
systemd_sink
()
override
{}
systemd_sink
(
const
systemd_sink
&
)
=
delete
;
systemd_sink
&
operator
=
(
const
systemd_sink
&
)
=
delete
;
protected
:
void
sink_it_
(
const
details
::
log_msg
&
msg
)
override
{
if
(
sd_journal_print
(
syslog_level
(
msg
.
level
),
"%s"
,
fmt
::
to_string
(
msg
.
payload
).
c_str
()
)
)
throw
spdlog_ex
(
"Failed writing to systemd"
);
}
void
flush_
()
override
{}
};
using
systemd_sink_mt
=
systemd_sink
<
std
::
mutex
>
;
using
systemd_sink_st
=
systemd_sink
<
details
::
null_mutex
>
;
}
// namespace sinks
// Create and register a syslog logger
template
<
typename
Factory
=
default_factory
>
inline
std
::
shared_ptr
<
logger
>
systemd_logger_mt
(
const
std
::
string
&
logger_name
)
{
return
Factory
::
template
create
<
sinks
::
systemd_sink_mt
>
(
logger_name
);
}
template
<
typename
Factory
=
default_factory
>
inline
std
::
shared_ptr
<
logger
>
systemd_logger_st
(
const
std
::
string
&
logger_name
)
{
return
Factory
::
template
create
<
sinks
::
systemd_sink_st
>
(
logger_name
);
}
}
// namespace spdlog
tests/test_systemd.cpp
0 → 100644
View file @
af80db8c
#include "includes.h"
#include <spdlog/sinks/systemd_sink.h>
namespace
{
const
char
*
tested_logger_name
=
"main"
;
}
void
run
(
spdlog
::
logger
&
logger
)
{
logger
.
debug
(
"test debug"
);
logger
.
error
(
"test error"
);
logger
.
info
(
"test info"
);
}
// std::shared_ptr<spdlog::logger> create_stdout_and_systemd_logger(
// std::string name="",
// spdlog::level::level_enum level_stdout=spdlog::level::level_enum::debug,
// spdlog::level::level_enum level_systemd=spdlog::level::level_enum::err
// ) {
// auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
// console_sink->set_level(level_stdout);
// auto systemd_sink = std::make_shared<spdlog::sinks::systemd_sink_st>();
// systemd_sink->set_level(level_systemd);
// return std::make_shared<spdlog::logger>(name, {console_sink, systemd_sink});
// }
TEST_CASE
(
"systemd"
,
"[all]"
)
{
auto
console_sink
=
std
::
make_shared
<
spdlog
::
sinks
::
stdout_color_sink_mt
>
();
console_sink
->
set_level
(
spdlog
::
level
::
level_enum
::
debug
);
auto
systemd_sink
=
std
::
make_shared
<
spdlog
::
sinks
::
systemd_sink_st
>
();
systemd_sink
->
set_level
(
spdlog
::
level
::
level_enum
::
err
);
spdlog
::
logger
logger
(
"spdlog_systemd_test"
,
{
console_sink
,
systemd_sink
});
run
(
logger
);
}
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