Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
ACS
Public
VILLASframework
VILLAScommon
Commits
df4e5a32
Commit
df4e5a32
authored
Jul 09, 2021
by
Steffen Vogel
🎅🏼
Browse files
log: add support for glob style logger expressions
parent
d818bcab
Changes
2
Hide whitespace changes
Inline
Side-by-side
include/villas/log.hpp
View file @
df4e5a32
...
...
@@ -25,6 +25,7 @@
#pragma once
#include
<string>
#include
<list>
#include
<spdlog/spdlog.h>
#include
<spdlog/sinks/dist_sink.h>
...
...
@@ -49,6 +50,19 @@ public:
using
DefaultSink
=
std
::
shared_ptr
<
spdlog
::
sinks
::
stderr_color_sink_mt
>
;
using
DistSink
=
std
::
shared_ptr
<
spdlog
::
sinks
::
dist_sink_mt
>
;
class
Expression
{
public:
std
::
string
name
;
Level
level
;
Expression
(
const
std
::
string
&
n
,
Level
lvl
)
:
name
(
n
),
level
(
lvl
)
{
}
Expression
(
json_t
*
json
);
};
protected:
DistSink
sinks
;
DefaultSink
sink
;
...
...
@@ -58,6 +72,8 @@ protected:
std
::
string
pattern
;
/**< Logging format. */
std
::
string
prefix
;
/**< Prefix each line with this string. */
std
::
list
<
Expression
>
expressions
;
public:
Log
(
Level
level
=
Level
::
info
);
...
...
lib/log.cpp
View file @
df4e5a32
...
...
@@ -23,6 +23,8 @@
#include
<list>
#include
<algorithm>
#include
<fnmatch.h>
#include
<spdlog/sinks/syslog_sink.h>
#include
<spdlog/sinks/basic_file_sink.h>
...
...
@@ -74,6 +76,11 @@ Logger Log::get(const std::string &name)
logger
->
set_level
(
level
);
logger
->
set_pattern
(
prefix
+
pattern
);
for
(
auto
&
expr
:
expressions
)
{
if
(
!
fnmatch
(
expr
.
name
.
c_str
(),
name
.
c_str
(),
FNM_EXTMATCH
))
logger
->
set_level
(
expr
.
level
);
}
spdlog
::
register_logger
(
logger
);
}
...
...
@@ -125,22 +132,8 @@ void Log::parse(json_t *json)
size_t
i
;
json_t
*
json_expression
;
json_array_foreach
(
json_expressions
,
i
,
json_expression
)
{
const
char
*
name
;
const
char
*
lvl
;
ret
=
json_unpack_ex
(
json_expression
,
&
err
,
JSON_STRICT
,
"{ s: s, s: s }"
,
"name"
,
&
name
,
"level"
,
&
lvl
);
if
(
ret
)
throw
ConfigError
(
json_expression
,
err
,
"node-config-logging-expressions"
);
Logger
logger
=
get
(
name
);
auto
level
=
spdlog
::
level
::
from_str
(
lvl
);
logger
->
set_level
(
level
);
}
json_array_foreach
(
json_expressions
,
i
,
json_expression
)
expressions
.
emplace_back
(
json_expression
);
}
}
...
...
@@ -182,3 +175,23 @@ std::string Log::getLevelName() const
return
std
::
string
(
sv
.
data
());
}
Log
::
Expression
::
Expression
(
json_t
*
json
)
{
int
ret
;
const
char
*
nme
;
const
char
*
lvl
;
json_error_t
err
;
ret
=
json_unpack_ex
(
json
,
&
err
,
JSON_STRICT
,
"{ s: s, s: s }"
,
"name"
,
&
nme
,
"level"
,
&
lvl
);
if
(
ret
)
throw
ConfigError
(
json
,
err
,
"node-config-logging-expressions"
);
level
=
spdlog
::
level
::
from_str
(
lvl
);
name
=
nme
;
}
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new 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