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 all 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
47 changes: 30 additions & 17 deletions ecal/core/include/ecal/config/logging.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,50 +39,63 @@ namespace eCAL
{
namespace Logging
{
namespace Sinks
namespace Provider
{
namespace Console
struct Sink
{
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 { 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)*/
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 File
namespace UDP
{
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)*/
unsigned int port { 14001 }; //!< UDP port number (Default: 14001)
};
}

struct Configuration
{
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!

};
}

namespace Receiver
{
namespace UDP
{
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)
unsigned int port { 14001 }; //!< UDP port number (Default: 14001)
};
}

struct Configuration
{
Console::Configuration console;
File::Configuration file;
UDP::Configuration udp;
bool enable { false }; //!< Enable UDP receiver (Default: false)
UDP::Configuration udp_config;
};
}

struct Configuration
{
Sinks::Configuration sinks;
Provider::Configuration provider;
Receiver::Configuration receiver;
};
}
}
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_.provider.udp.enable;
attributes.udp_sink.filter_log = log_config_.provider.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_.provider.file.enable;
attributes.file_sink.filter_log = log_config_.provider.file.filter_log;
attributes.file_config.path = log_config_.provider.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_.provider.console.enable;
attributes.console_sink.filter_log = log_config_.provider.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_.provider.udp_config.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_.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_.receiver.udp_config.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_);
}
}
84 changes: 52 additions & 32 deletions ecal/core/src/config/configuration_to_yaml.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -576,91 +576,111 @@ namespace YAML
/____/\___/\_, /\_, /_/_//_/\_, /
/___//___/ /___/
*/
Node convert<eCAL::Logging::Sinks::UDP::Configuration>::encode(const eCAL::Logging::Sinks::UDP::Configuration& config_)

Node convert<eCAL::Logging::Receiver::UDP::Configuration>::encode(const eCAL::Logging::Receiver::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::Receiver::UDP::Configuration" 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::Receiver::UDP::Configuration>::decode(const Node& node_, eCAL::Logging::Receiver::UDP::Configuration& config_)
{
AssignValue<bool>(config_.enable, node_, "enable");
AssignValue<unsigned int>(config_.port, node_, "port");
return true;
}

std::vector<std::string> tmp;
AssignValue<std::vector<std::string>>(tmp, node_, "level");
config_.filter_log_udp = ParseLogLevel(tmp);
Node convert<eCAL::Logging::Receiver::Configuration>::encode(const eCAL::Logging::Receiver::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::Receiver::Configuration" is directly included [misc-include-cleaner]

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

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

bool convert<eCAL::Logging::Receiver::Configuration>::decode(const Node& node_, eCAL::Logging::Receiver::Configuration& config_)
{
AssignValue<bool>(config_.enable, node_, "enable");
AssignValue<eCAL::Logging::Receiver::UDP::Configuration>(config_.udp_config, node_, "udp_config");
return true;
}

Node convert<eCAL::Logging::Sinks::Console::Configuration>::encode(const eCAL::Logging::Sinks::Console::Configuration& config_)
Node convert<eCAL::Logging::Provider::UDP::Configuration>::encode(const eCAL::Logging::Provider::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::Provider::UDP::Configuration" is directly included [misc-include-cleaner]

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

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

bool convert<eCAL::Logging::Provider::UDP::Configuration>::decode(const Node& node_, eCAL::Logging::Provider::UDP::Configuration& config_)
{
AssignValue<unsigned int>(config_.port, node_, "port");
return true;
}

Node convert<eCAL::Logging::Provider::Sink>::encode(const eCAL::Logging::Provider::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::Provider::Sink" is directly included [misc-include-cleaner]

  Node convert<eCAL::Logging::Provider::Sink>::encode(const eCAL::Logging::Provider::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::Provider::Sink>::decode(const Node& node_, eCAL::Logging::Provider::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 convert<eCAL::Logging::Provider::File::Configuration>::encode(const eCAL::Logging::Provider::File::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::Provider::File::Configuration" is directly included [misc-include-cleaner]

  Node convert<eCAL::Logging::Provider::File::Configuration>::encode(const eCAL::Logging::Provider::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_)
bool convert<eCAL::Logging::Provider::File::Configuration>::decode(const Node& node_, eCAL::Logging::Provider::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;
}

Node convert<eCAL::Logging::Sinks::Configuration>::encode(const eCAL::Logging::Sinks::Configuration& config_)
Node convert<eCAL::Logging::Provider::Configuration>::encode(const eCAL::Logging::Provider::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::Provider::Configuration" is directly included [misc-include-cleaner]

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

{
Node node;
node["console"] = config_.console;
node["file"] = config_.file;
node["udp"] = config_.udp;
node["console"] = config_.console;
node["file"] = config_.file;
node["udp"] = config_.udp;
node["file_config"] = config_.file_config;
node["udp_config"] = config_.udp_config;
return node;
}

bool convert<eCAL::Logging::Sinks::Configuration>::decode(const Node& node_, eCAL::Logging::Sinks::Configuration& config_)
bool convert<eCAL::Logging::Provider::Configuration>::decode(const Node& node_, eCAL::Logging::Provider::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::Provider::Sink>(config_.console, node_, "console");
AssignValue<eCAL::Logging::Provider::Sink>(config_.file, node_, "file");
AssignValue<eCAL::Logging::Provider::Sink>(config_.udp, node_, "udp");
AssignValue<eCAL::Logging::Provider::UDP::Configuration>(config_.udp_config, node_, "udp_config");
AssignValue<eCAL::Logging::Provider::File::Configuration>(config_.file_config, node_, "file_config");
return true;
}

Node convert<eCAL::Logging::Configuration>::encode(const eCAL::Logging::Configuration& config_)
{
Node node;
node["sinks"] = config_.sinks;
node["provider"] = config_.provider;
node["receiver"] = config_.receiver;
return node;
}

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

Expand Down
Loading
Loading