Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Logging] Introducing Provider/Receiver pattern for logging #1831

Merged
merged 24 commits into from
Dec 9, 2024
Merged
Show file tree
Hide file tree
Changes from 23 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
dbb5478
Changed pubsub logging to use the API instead of globals.
Peguen Dec 2, 2024
9cbaf5a
Split of ecal_log into log provider and receiver.
Peguen Dec 2, 2024
bddd31f
Added missing atomic header.
Peguen Dec 2, 2024
360deb9
Changed typo in includes.
Peguen Dec 2, 2024
28d7734
Introduced logging UDP receive variable.
Peguen Dec 3, 2024
2c2956c
Receive functionality in log_receiver.
Peguen Dec 3, 2024
24a0b13
Adapted logging tests.
Peguen Dec 3, 2024
50f88ca
Removed unused attributes for loggin receiver/provider.
Peguen Dec 4, 2024
294e531
Changed logging structs to be defined within the attribute struct.
Peguen Dec 4, 2024
a5bf465
Changed global accessor handling.
Peguen Dec 4, 2024
c390e4c
Added UDPLogReceive to eCAL::Init.
Peguen Dec 4, 2024
d22b9a9
Added UDPLogReceive to Init::ALL.
Peguen Dec 4, 2024
960e9ba
Added UDPLogReceive to apps.
Peguen Dec 4, 2024
546db2c
Small clangtidy things.
Peguen Dec 4, 2024
4072334
Adapted test for logging.
Peguen Dec 4, 2024
ee26111
Removed failing header.
Peguen Dec 4, 2024
bcf6d54
Fixed wrong type in default yaml configuration.
Peguen Dec 5, 2024
c4f4cd7
Better logic for logging attributes.
Peguen Dec 6, 2024
e0729f6
Changed udp logging config to have an own udp receiving configuration.
Peguen Dec 6, 2024
2d6cee1
Merge branch 'master' into feature/logging_split
Peguen Dec 6, 2024
2b4d197
Changed logging struct and yaml to be consistent with the attributes.
Peguen Dec 6, 2024
2c53961
Merge remote.
Peguen Dec 6, 2024
9ceee76
Merge branch 'master' into feature/logging_split
rex-schilasky Dec 6, 2024
76707d5
Reworked logging structure.
Peguen Dec 6, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/rec/rec_server_core/src/rec_server_impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ namespace eCAL
settings_.ClearHostFilter(); // There is no global host filter

// Initialize eCAL
eCAL::Initialize("", eCAL::Init::Default | eCAL::Init::Monitoring);
eCAL::Initialize("eCALRec-Server", eCAL::Init::Default | eCAL::Init::Monitoring);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "eCAL::Init::Default" is directly included [misc-include-cleaner]

app/rec/rec_server_core/src/rec_server_impl.cpp:21:

- #include "recorder_settings.h"
+ #include "ecal/ecal_init.h"
+ #include "recorder_settings.h"

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "eCAL::Init::Monitoring" is directly included [misc-include-cleaner]

      eCAL::Initialize("eCALRec-Server", eCAL::Init::Default | eCAL::Init::Monitoring);
                                                                           ^

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "eCAL::Initialize" is directly included [misc-include-cleaner]

app/rec/rec_server_core/src/rec_server_impl.cpp:21:

- #include "recorder_settings.h"
+ #include "ecal/ecal_core.h"
+ #include "recorder_settings.h"


// Start FTP Server
ftp_server_->start(5);
Expand Down
4 changes: 2 additions & 2 deletions ecal/core/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -181,8 +181,8 @@ endif()
######################################
set(ecal_logging_src
src/logging/ecal_log.cpp
src/logging/ecal_log_impl.cpp
src/logging/ecal_log_impl.h
src/logging/ecal_log_provider.cpp
src/logging/ecal_log_receiver.cpp
)

######################################
Expand Down
43 changes: 25 additions & 18 deletions ecal/core/include/ecal/config/logging.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,42 +41,49 @@ namespace eCAL
{
namespace Sinks
{
namespace Console
struct Sink
{
struct Configuration
{
bool enable { true }; //!< Enable console logging (Default: true)
eCAL_Logging_Filter filter_log_con { log_level_error | log_level_fatal }; /*!< Log messages logged to console (all, info, warning, error, fatal, debug1, debug2, debug3, debug4)
(Default: info, warning, error, fatal)*/
};
}
bool enable; //!< Enable sink
eCAL_Logging_Filter filter_log; //!< Log messages logged (all, info, warning, error, fatal, debug1, debug2, debug3, debug4)
};

namespace File
{
struct Configuration
{
bool enable { false }; //!< Enable file logging (Default: false)
std::string path { "" }; //!< Path to log file (Default: "")
eCAL_Logging_Filter filter_log_file { log_level_none }; /*!< Log messages logged into file system (all, info, warning, error, fatal, debug1, debug2, debug3, debug4)
(Default: info, warning, error, fatal)*/
std::string path { "" }; //!< Path to log file (Default: "")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: redundant string initialization [readability-redundant-string-init]

Suggested change
std::string path { "" }; //!< Path to log file (Default: "")
std::string path; //!< Path to log file (Default: "")

};
}

namespace UDP
{
struct ReceiverConfiguration
{
bool enable { false }; //!< Enable UDP receiver (Default: false)
unsigned int port { 14001 }; //!< UDP port number (Default: 14001)
};

struct ProviderConfiguration
{
unsigned int port { 14001 }; //!< UDP port number (Default: 14001)
};

struct Configuration
{
bool enable { true }; //!< Enable UDP logging (Default: false)
unsigned int port { 14001 }; //!< UDP port number (Default: 14001)
eCAL_Logging_Filter filter_log_udp { log_filter_default }; //!< Log messages logged via udp network (Default: info, warning, error, fatal)
ReceiverConfiguration receiver;
ProviderConfiguration provider;
};
}

struct Configuration
{
Console::Configuration console;
File::Configuration file;
UDP::Configuration udp;
Sink console { true, log_level_error | log_level_fatal}; //!< default: true, log_level_error
Sink file { false, log_level_none }; //!< default: false, log_level_none
Sink udp { true, log_filter_default }; //!< default: true, log_filter_default

File::Configuration file_config;
UDP::Configuration udp_config;

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks very clean like this!

};
}

Expand Down
12 changes: 6 additions & 6 deletions ecal/core/include/ecal/ecal_init.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,12 @@ namespace eCAL
{
namespace Init
{
static const unsigned int Publisher = 0x001;
static const unsigned int Subscriber = 0x002;
static const unsigned int Service = 0x004;
static const unsigned int Monitoring = 0x008;
static const unsigned int Logging = 0x010;
static const unsigned int TimeSync = 0x020;
static const unsigned int Publisher = 0x001;
static const unsigned int Subscriber = 0x002;
static const unsigned int Service = 0x004;
static const unsigned int Monitoring = 0x008;
static const unsigned int Logging = 0x010;
static const unsigned int TimeSync = 0x020;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you could realign, so you don't get any changes in this file


static const unsigned int All = Publisher
| Subscriber
Expand Down
54 changes: 32 additions & 22 deletions ecal/core/src/config/builder/logging_attribute_builder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,60 +6,70 @@ namespace eCAL
{
namespace Logging
{
SAttributes BuildLoggingAttributes(const Logging::Configuration& log_config_, const Registration::Configuration& reg_config_, const TransportLayer::Configuration& tl_config_)
SProviderAttributes BuildLoggingProviderAttributes(const Logging::Configuration& log_config_, const Registration::Configuration& reg_config_, const TransportLayer::Configuration& tl_config_)
Peguen marked this conversation as resolved.
Show resolved Hide resolved
Peguen marked this conversation as resolved.
Show resolved Hide resolved
Peguen marked this conversation as resolved.
Show resolved Hide resolved
Peguen marked this conversation as resolved.
Show resolved Hide resolved
{
SAttributes attributes;
SProviderAttributes attributes;

attributes.network_enabled = reg_config_.network_enabled;
Peguen marked this conversation as resolved.
Show resolved Hide resolved
attributes.host_name = Process::GetHostName();
attributes.process_id = Process::GetProcessID();
attributes.process_name = Process::GetProcessName();
attributes.unit_name = Process::GetUnitName();
attributes.level = log_level_info;

attributes.udp.enabled = log_config_.sinks.udp.enable;
attributes.udp.port = log_config_.sinks.udp.port;
attributes.udp.filter_log = log_config_.sinks.udp.filter_log_udp;
attributes.udp_sink.enabled = log_config_.sinks.udp.enable;
attributes.udp_sink.filter_log = log_config_.sinks.udp.filter_log;

attributes.file.enabled = log_config_.sinks.file.enable;
attributes.file.filter_log = log_config_.sinks.file.filter_log_file;
attributes.file.path = log_config_.sinks.file.path;
if (attributes.file.path.empty())
attributes.file_sink.enabled = log_config_.sinks.file.enable;
attributes.file_sink.filter_log = log_config_.sinks.file.filter_log;
attributes.file_config.path = log_config_.sinks.file_config.path;
if (attributes.file_config.path.empty())
{
// check ECAL_DATA
// Creates path if not exists
attributes.file.path = Util::GeteCALLogPath();
attributes.file_config.path = Util::GeteCALLogPath();
}

attributes.console.enabled = log_config_.sinks.console.enable;
attributes.console.filter_log = log_config_.sinks.console.filter_log_con;
attributes.console_sink.enabled = log_config_.sinks.console.enable;
attributes.console_sink.filter_log = log_config_.sinks.console.filter_log;

// UDP related configuration part
attributes.udp_sender.broadcast = !reg_config_.network_enabled;
attributes.udp_sender.loopback = reg_config_.loopback;
attributes.udp_config.broadcast = !reg_config_.network_enabled;
attributes.udp_config.loopback = reg_config_.loopback;

attributes.udp_sender.sndbuf = tl_config_.udp.send_buffer;
attributes.udp_sender.port = tl_config_.udp.port;
attributes.udp_config.sndbuf = tl_config_.udp.send_buffer;
attributes.udp_config.port = log_config_.sinks.udp_config.provider.port;

switch (tl_config_.udp.mode)
{
case Types::UDPMode::NETWORK:
attributes.udp_sender.address = tl_config_.udp.network.group;
attributes.udp_sender.ttl = tl_config_.udp.network.ttl;
attributes.udp_config.address = tl_config_.udp.network.group;
attributes.udp_config.ttl = tl_config_.udp.network.ttl;
break;
case Types::UDPMode::LOCAL:
attributes.udp_sender.address = tl_config_.udp.local.group;
attributes.udp_sender.ttl = tl_config_.udp.local.ttl;
attributes.udp_config.address = tl_config_.udp.local.group;
attributes.udp_config.ttl = tl_config_.udp.local.ttl;
break;
default:
break;
}

return attributes;
}

SReceiverAttributes BuildLoggingReceiverAttributes(const Logging::Configuration& log_config_, const Registration::Configuration& reg_config_, const TransportLayer::Configuration& tl_config_)
Peguen marked this conversation as resolved.
Show resolved Hide resolved
{
SReceiverAttributes attributes;

attributes.network_enabled = reg_config_.network_enabled;
attributes.host_name = Process::GetHostName();

attributes.receive_enabled = log_config_.sinks.udp_config.receiver.enable;

attributes.udp_receiver.broadcast = !reg_config_.network_enabled;
attributes.udp_receiver.loopback = true;

attributes.udp_receiver.rcvbuf = tl_config_.udp.receive_buffer;
attributes.udp_receiver.port = tl_config_.udp.port;
attributes.udp_receiver.port = log_config_.sinks.udp_config.receiver.port;

switch (tl_config_.udp.mode)
{
Expand Down
6 changes: 4 additions & 2 deletions ecal/core/src/config/builder/logging_attribute_builder.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@

#pragma once

#include "logging/config/attributes/logging_attributes.h"
#include "logging/config/attributes/ecal_log_provider_attributes.h"
#include "logging/config/attributes/ecal_log_receiver_attributes.h"
#include "ecal/config/logging.h"
#include "ecal/config/registration.h"
#include "ecal/config/transport_layer.h"
Expand All @@ -28,6 +29,7 @@ namespace eCAL
{
namespace Logging
{
SAttributes BuildLoggingAttributes(const Logging::Configuration& log_config_, const Registration::Configuration& reg_config_, const TransportLayer::Configuration& tl_config_);
SProviderAttributes BuildLoggingProviderAttributes(const Logging::Configuration& log_config_, const Registration::Configuration& reg_config_, const TransportLayer::Configuration& tl_config_);
SReceiverAttributes BuildLoggingReceiverAttributes(const Logging::Configuration& log_config_, const Registration::Configuration& reg_config_, const TransportLayer::Configuration& tl_config_);
}
}
62 changes: 41 additions & 21 deletions ecal/core/src/config/configuration_to_yaml.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -576,61 +576,79 @@ namespace YAML
/____/\___/\_, /\_, /_/_//_/\_, /
/___//___/ /___/
*/
Node convert<eCAL::Logging::Sinks::UDP::Configuration>::encode(const eCAL::Logging::Sinks::UDP::Configuration& config_)

Node convert<eCAL::Logging::Sinks::UDP::ReceiverConfiguration>::encode(const eCAL::Logging::Sinks::UDP::ReceiverConfiguration& config_)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "eCAL::Logging::Sinks::UDP::ReceiverConfiguration" is directly included [misc-include-cleaner]

ecal/core/src/config/configuration_to_yaml.cpp:1:

+ #include "ecal/config/logging.h"

{
Node node;
node["enable"] = config_.enable;
node["port"] = config_.port;
node["level"] = LogLevelToVector(config_.filter_log_udp);
return node;
}

bool convert<eCAL::Logging::Sinks::UDP::Configuration>::decode(const Node& node_, eCAL::Logging::Sinks::UDP::Configuration& config_)
bool convert<eCAL::Logging::Sinks::UDP::ReceiverConfiguration>::decode(const Node& node_, eCAL::Logging::Sinks::UDP::ReceiverConfiguration& config_)
{
AssignValue<bool>(config_.enable, node_, "enable");
AssignValue<unsigned int>(config_.port, node_, "port");

std::vector<std::string> tmp;
AssignValue<std::vector<std::string>>(tmp, node_, "level");
config_.filter_log_udp = ParseLogLevel(tmp);
return true;
}

Node convert<eCAL::Logging::Sinks::UDP::ProviderConfiguration>::encode(const eCAL::Logging::Sinks::UDP::ProviderConfiguration& config_)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "eCAL::Logging::Sinks::UDP::ProviderConfiguration" is directly included [misc-include-cleaner]

  Node convert<eCAL::Logging::Sinks::UDP::ProviderConfiguration>::encode(const eCAL::Logging::Sinks::UDP::ProviderConfiguration& config_)
                                          ^

{
Node node;
node["port"] = config_.port;
return node;
}

bool convert<eCAL::Logging::Sinks::UDP::ProviderConfiguration>::decode(const Node& node_, eCAL::Logging::Sinks::UDP::ProviderConfiguration& config_)
{
AssignValue<unsigned int>(config_.port, node_, "port");

return true;
}

Node convert<eCAL::Logging::Sinks::Console::Configuration>::encode(const eCAL::Logging::Sinks::Console::Configuration& config_)
Node convert<eCAL::Logging::Sinks::UDP::Configuration>::encode(const eCAL::Logging::Sinks::UDP::Configuration& config_)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "eCAL::Logging::Sinks::UDP::Configuration" is directly included [misc-include-cleaner]

  Node convert<eCAL::Logging::Sinks::UDP::Configuration>::encode(const eCAL::Logging::Sinks::UDP::Configuration& config_)
                                          ^

{
Node node;
node["receiver"] = config_.receiver;
node["provider"] = config_.provider;
return node;
}

bool convert<eCAL::Logging::Sinks::UDP::Configuration>::decode(const Node& node_, eCAL::Logging::Sinks::UDP::Configuration& config_)
{
AssignValue<eCAL::Logging::Sinks::UDP::ProviderConfiguration>(config_.provider, node_, "provider");
AssignValue<eCAL::Logging::Sinks::UDP::ReceiverConfiguration>(config_.receiver, node_, "receiver");
return true;
}

Node convert<eCAL::Logging::Sinks::Sink>::encode(const eCAL::Logging::Sinks::Sink& config_)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "eCAL::Logging::Sinks::Sink" is directly included [misc-include-cleaner]

  Node convert<eCAL::Logging::Sinks::Sink>::encode(const eCAL::Logging::Sinks::Sink& config_)
                                     ^

{
Node node;
node["enable"] = config_.enable;
node["level"] = LogLevelToVector(config_.filter_log_con);
node["level"] = LogLevelToVector(config_.filter_log);
return node;
}

bool convert<eCAL::Logging::Sinks::Console::Configuration>::decode(const Node& node_, eCAL::Logging::Sinks::Console::Configuration& config_)
bool convert<eCAL::Logging::Sinks::Sink>::decode(const Node& node_, eCAL::Logging::Sinks::Sink& config_)
{
AssignValue<bool>(config_.enable, node_, "enable");
std::vector<std::string> tmp;
AssignValue<std::vector<std::string>>(tmp, node_, "level");
config_.filter_log_con = ParseLogLevel(tmp);
config_.filter_log = ParseLogLevel(tmp);
return true;
}

Node convert<eCAL::Logging::Sinks::File::Configuration>::encode(const eCAL::Logging::Sinks::File::Configuration& config_)
{
Node node;
node["enable"] = config_.enable;
node["path"] = config_.path;
node["level"] = LogLevelToVector(config_.filter_log_file);
return node;
}

bool convert<eCAL::Logging::Sinks::File::Configuration>::decode(const Node& node_, eCAL::Logging::Sinks::File::Configuration& config_)
{
AssignValue<bool>(config_.enable, node_, "enable");
AssignValue<std::string>(config_.path, node_, "path");

std::vector<std::string> tmp;
AssignValue<std::vector<std::string>>(tmp, node_, "level");
config_.filter_log_file = ParseLogLevel(tmp);
return true;
}

Expand All @@ -645,9 +663,11 @@ namespace YAML

bool convert<eCAL::Logging::Sinks::Configuration>::decode(const Node& node_, eCAL::Logging::Sinks::Configuration& config_)
{
AssignValue<eCAL::Logging::Sinks::Console::Configuration>(config_.console, node_, "console");
AssignValue<eCAL::Logging::Sinks::File::Configuration>(config_.file, node_, "file");
AssignValue<eCAL::Logging::Sinks::UDP::Configuration>(config_.udp, node_, "udp");
AssignValue<eCAL::Logging::Sinks::Sink>(config_.console, node_, "console");
AssignValue<eCAL::Logging::Sinks::Sink>(config_.file, node_, "file");
AssignValue<eCAL::Logging::Sinks::Sink>(config_.udp, node_, "udp");
AssignValue<eCAL::Logging::Sinks::UDP::Configuration>(config_.udp_config, node_, "udp");
AssignValue<eCAL::Logging::Sinks::File::Configuration>(config_.file_config, node_, "file");
return true;
}

Expand Down
28 changes: 22 additions & 6 deletions ecal/core/src/config/configuration_to_yaml.h
Original file line number Diff line number Diff line change
Expand Up @@ -298,19 +298,19 @@ namespace YAML
/___//___/ /___/
*/
template<>
struct convert<eCAL::Logging::Sinks::UDP::Configuration>
struct convert<eCAL::Logging::Sinks::UDP::ReceiverConfiguration>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "eCAL::Logging::Sinks::UDP::ReceiverConfiguration" is directly included [misc-include-cleaner]

ecal/core/src/config/configuration_to_yaml.h:26:

- #include <ecal/config/configuration.h>
+ #include "ecal/config/logging.h"
+ #include <ecal/config/configuration.h>

{
static Node encode(const eCAL::Logging::Sinks::UDP::Configuration& config_);
static Node encode(const eCAL::Logging::Sinks::UDP::ReceiverConfiguration& config_);

static bool decode(const Node& node_, eCAL::Logging::Sinks::UDP::Configuration& config_);
static bool decode(const Node& node_, eCAL::Logging::Sinks::UDP::ReceiverConfiguration& config_);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It feels a bit strange that ReceiverConfiguration is in the Sinks namespace.
Does eCAL::Logging::Receiver::UDP::Configuration make more sense?

};

template<>
struct convert<eCAL::Logging::Sinks::Console::Configuration>
struct convert<eCAL::Logging::Sinks::UDP::ProviderConfiguration>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "eCAL::Logging::Sinks::UDP::ProviderConfiguration" is directly included [misc-include-cleaner]

  struct convert<eCAL::Logging::Sinks::UDP::ProviderConfiguration>
                                            ^

{
static Node encode(const eCAL::Logging::Sinks::Console::Configuration& config_);
static Node encode(const eCAL::Logging::Sinks::UDP::ProviderConfiguration& config_);

static bool decode(const Node& node_, eCAL::Logging::Sinks::Console::Configuration& config_);
static bool decode(const Node& node_, eCAL::Logging::Sinks::UDP::ProviderConfiguration& config_);
};

template<>
Expand All @@ -321,6 +321,22 @@ namespace YAML
static bool decode(const Node& node_, eCAL::Logging::Sinks::File::Configuration& config_);
};

template<>
struct convert<eCAL::Logging::Sinks::UDP::Configuration>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "eCAL::Logging::Sinks::UDP::Configuration" is directly included [misc-include-cleaner]

  struct convert<eCAL::Logging::Sinks::UDP::Configuration>
                                            ^

{
static Node encode(const eCAL::Logging::Sinks::UDP::Configuration& config_);

static bool decode(const Node& node_, eCAL::Logging::Sinks::UDP::Configuration& config_);
};

template<>
struct convert<eCAL::Logging::Sinks::Sink>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warning: no header providing "eCAL::Logging::Sinks::Sink" is directly included [misc-include-cleaner]

  struct convert<eCAL::Logging::Sinks::Sink>
                                       ^

{
static Node encode(const eCAL::Logging::Sinks::Sink& config_);

static bool decode(const Node& node_, eCAL::Logging::Sinks::Sink& config_);
};

template<>
struct convert<eCAL::Logging::Sinks::Configuration>
{
Expand Down
Loading
Loading