This commit is contained in:
Scott E. Graves 2024-07-25 12:17:12 -05:00
parent 5a928208fd
commit de6a7beb5e
14 changed files with 148 additions and 104 deletions

View File

@ -24,16 +24,17 @@
namespace repertory {
enum class event_level {
critical,
error,
warn,
normal,
info,
debug,
verbose,
trace,
};
auto event_level_from_string(std::string level) -> event_level;
auto event_level_to_string(const event_level &level) -> std::string;
auto event_level_to_string(event_level level) -> std::string;
class event {
protected:

View File

@ -72,7 +72,7 @@ app_config::app_config(const provider_type &prov,
enable_mount_manager_(false),
#endif
enable_remote_mount_(false),
event_level_(event_level::normal),
event_level_(event_level::info),
eviction_delay_mins_(default_eviction_delay_mins),
eviction_uses_accessed_time_(false),
high_freq_interval_secs_(default_high_freq_interval_secs),
@ -195,72 +195,71 @@ auto app_config::default_rpc_port(const provider_type &prov) -> std::uint16_t {
auto app_config::get_json() const -> json {
json ret = {
{"ApiAuth", api_auth_},
{"ApiPort", api_port_},
{"ApiUser", api_user_},
{"ChunkDownloaderTimeoutSeconds", download_timeout_secs_},
{"EnableChunkDownloaderTimeout", enable_chunk_downloader_timeout_},
{"EnableCommDurationEvents", enable_comm_duration_events_},
{"EnableDriveEvents", enable_drive_events_},
{"ApiAuth", api_auth_},
{"ApiPort", api_port_},
{"ApiUser", api_user_},
{"ChunkDownloaderTimeoutSeconds", download_timeout_secs_},
{"EnableChunkDownloaderTimeout", enable_chunk_downloader_timeout_},
{"EnableCommDurationEvents", enable_comm_duration_events_},
{"EnableDriveEvents", enable_drive_events_},
#if defined(_WIN32)
{"EnableMountManager", enable_mount_manager_},
{"EnableMountManager", enable_mount_manager_},
#endif
{"EnableMaxCacheSize", enable_max_cache_size_},
{"EncryptConfig",
{
{"EncryptionToken", encrypt_config_.encryption_token},
{"Path", encrypt_config_.path},
}},
{"EventLevel", event_level_to_string(event_level_)},
{"EvictionDelayMinutes", eviction_delay_mins_},
{"EvictionUsesAccessedTime", eviction_uses_accessed_time_},
{"HighFreqIntervalSeconds", high_freq_interval_secs_},
{"HostConfig",
{
{"AgentString", hc_.agent_string},
{"ApiPassword", hc_.api_password},
{"ApiPort", hc_.api_port},
{"HostNameOrIp", hc_.host_name_or_ip},
{"TimeoutMs", hc_.timeout_ms},
}},
{"LowFreqIntervalSeconds", low_freq_interval_secs_},
{"MaxCacheSizeBytes", max_cache_size_bytes_},
{"MaxUploadCount", max_upload_count_},
{"OnlineCheckRetrySeconds", online_check_retry_secs_},
{"OrphanedFileRetentionDays", orphaned_file_retention_days_},
{"PreferredDownloadType", preferred_download_type_},
{"ReadAheadCount", read_ahead_count_},
{
"RemoteMount",
{
{"EnableRemoteMount", enable_remote_mount_},
{"IsRemoteMount", is_remote_mount_},
{"RemoteClientPoolSize", remote_client_pool_size_},
{"RemoteMaxConnections", remote_max_connections_},
{"RemoteHostNameOrIp", remote_host_name_or_ip_},
{"RemotePort", remote_port_},
{"RemoteReceiveTimeoutSeconds", remote_receive_timeout_secs_},
{"RemoteSendTimeoutSeconds", remote_send_timeout_secs_},
{"RemoteToken", remote_token_},
},
},
{"RetryReadCount", retry_read_count_},
{"RingBufferFileSize", ring_buffer_file_size_},
{"S3Config",
{
{"AccessKey", s3_config_.access_key},
{"Bucket", s3_config_.bucket},
{"CacheTimeoutSeconds", s3_config_.cache_timeout_secs},
{"EncryptionToken", s3_config_.encryption_token},
{"Region", s3_config_.region},
{"SecretKey", s3_config_.secret_key},
{"TimeoutMs", s3_config_.timeout_ms},
{"URL", s3_config_.url},
{"UsePathStyle", s3_config_.use_path_style},
{"UseRegionInURL", s3_config_.use_region_in_url},
}},
{"Version", version_}
};
{"EnableMaxCacheSize", enable_max_cache_size_},
{"EncryptConfig",
{
{"EncryptionToken", encrypt_config_.encryption_token},
{"Path", encrypt_config_.path},
}},
{"EventLevel", event_level_to_string(event_level_)},
{"EvictionDelayMinutes", eviction_delay_mins_},
{"EvictionUsesAccessedTime", eviction_uses_accessed_time_},
{"HighFreqIntervalSeconds", high_freq_interval_secs_},
{"HostConfig",
{
{"AgentString", hc_.agent_string},
{"ApiPassword", hc_.api_password},
{"ApiPort", hc_.api_port},
{"HostNameOrIp", hc_.host_name_or_ip},
{"TimeoutMs", hc_.timeout_ms},
}},
{"LowFreqIntervalSeconds", low_freq_interval_secs_},
{"MaxCacheSizeBytes", max_cache_size_bytes_},
{"MaxUploadCount", max_upload_count_},
{"OnlineCheckRetrySeconds", online_check_retry_secs_},
{"OrphanedFileRetentionDays", orphaned_file_retention_days_},
{"PreferredDownloadType", preferred_download_type_},
{"ReadAheadCount", read_ahead_count_},
{
"RemoteMount",
{
{"EnableRemoteMount", enable_remote_mount_},
{"IsRemoteMount", is_remote_mount_},
{"RemoteClientPoolSize", remote_client_pool_size_},
{"RemoteMaxConnections", remote_max_connections_},
{"RemoteHostNameOrIp", remote_host_name_or_ip_},
{"RemotePort", remote_port_},
{"RemoteReceiveTimeoutSeconds", remote_receive_timeout_secs_},
{"RemoteSendTimeoutSeconds", remote_send_timeout_secs_},
{"RemoteToken", remote_token_},
},
},
{"RetryReadCount", retry_read_count_},
{"RingBufferFileSize", ring_buffer_file_size_},
{"S3Config",
{
{"AccessKey", s3_config_.access_key},
{"Bucket", s3_config_.bucket},
{"CacheTimeoutSeconds", s3_config_.cache_timeout_secs},
{"EncryptionToken", s3_config_.encryption_token},
{"Region", s3_config_.region},
{"SecretKey", s3_config_.secret_key},
{"TimeoutMs", s3_config_.timeout_ms},
{"URL", s3_config_.url},
{"UsePathStyle", s3_config_.use_path_style},
{"UseRegionInURL", s3_config_.use_region_in_url},
}},
{"Version", version_}};
if (prov_ == provider_type::encrypt) {
ret.erase("ChunkDownloaderTimeoutSeconds");

View File

@ -680,7 +680,7 @@ void fuse_base::raise_fuse_event(std::string function_name,
}
if (((config_.get_event_level() >= fuse_event::level) && (ret != 0)) ||
(config_.get_event_level() >= event_level::verbose)) {
(config_.get_event_level() >= event_level::trace)) {
event_system::instance().raise<fuse_event>(
utils::string::right_trim(function_name, '_'), api_path, ret);
}

View File

@ -45,7 +45,7 @@ namespace repertory::remote_fuse {
if (config_.get_enable_drive_events() && \
(((config_.get_event_level() >= remote_fuse_server_event::level) && \
(ret < 0)) || \
(config_.get_event_level() >= event_level::verbose))) \
(config_.get_event_level() >= event_level::trace))) \
event_system::instance().raise<remote_fuse_server_event>(func, file, ret)
// clang-format off

View File

@ -34,7 +34,7 @@ namespace repertory::remote_winfsp {
if (config_.get_enable_drive_events() && \
(((config_.get_event_level() >= remote_winfsp_client_event::level) && \
(ret != STATUS_SUCCESS)) || \
(config_.get_event_level() >= event_level::verbose))) \
(config_.get_event_level() >= event_level::trace))) \
event_system::instance().raise<remote_winfsp_client_event>(func, file, ret)
// clang-format off

View File

@ -52,7 +52,7 @@ namespace repertory::remote_winfsp {
if (config_.get_enable_drive_events() && \
(((config_.get_event_level() >= remote_winfsp_server_event::level) && \
(ret != STATUS_SUCCESS)) || \
(config_.get_event_level() >= event_level::verbose))) \
(config_.get_event_level() >= event_level::trace))) \
event_system::instance().raise<remote_winfsp_server_event>(func, file, ret)
// clang-format off

View File

@ -51,7 +51,7 @@ E_SIMPLE3(winfsp_event, debug, true,
if (config_.get_enable_drive_events() && \
(((config_.get_event_level() >= winfsp_event::level) && \
(ret != STATUS_SUCCESS)) || \
(config_.get_event_level() >= event_level::verbose))) \
(config_.get_event_level() >= event_level::trace))) \
event_system::instance().raise<winfsp_event>(func, file, ret)
winfsp_drive::winfsp_service::winfsp_service(

View File

@ -21,6 +21,11 @@
*/
#include "events/consumers/logging_consumer.hpp"
#include "events/events.hpp"
#include "spdlog/spdlog.h"
#include "spdlog/async.h"
#include "spdlog/sinks/rotating_file_sink.h"
#include "spdlog/sinks/stdout_color_sinks.h"
#include "utils/path_utils.hpp"
namespace repertory {
@ -32,21 +37,45 @@ logging_consumer::logging_consumer(event_level level, std::string log_directory)
[this](const event_level_changed &changed) {
event_level_ = event_level_from_string(
changed.get_new_event_level().get<std::string>());
switch (event_level_) {}
});
spdlog::init_thread_pool(8192, 1);
std::vector<spdlog::sink_ptr> sinks{
std::make_shared<spdlog::sinks::stdout_color_sink_mt>(),
std::make_shared<spdlog::sinks::rotating_file_sink_mt>(
utils::path::combine(log_directory_, {"repertory.log"}),
MAX_LOG_FILE_SIZE, MAX_LOG_FILES),
};
spdlog::register_logger(std::make_shared<spdlog::async_logger>(
"logger", sinks.begin(), sinks.end(), spdlog::thread_pool(),
spdlog::async_overflow_policy::block));
}
logging_consumer::~logging_consumer() { E_CONSUMER_RELEASE(); }
void logging_consumer::process_event(const event &event) {
/* auto msg = ([&]() -> std::string {
struct tm local_time {};
utils::get_local_time_now(local_time);
std::stringstream ss;
ss << std::put_time(&local_time, "%F %T") << "|"
<< event_level_to_string(event->get_event_level()).c_str() << "|"
<< event->get_single_line().c_str() << std::endl;
return ss.str();
})(); */
switch (event.get_event_level()) {
case event_level::critical:
spdlog::critical(event.get_single_line());
break;
case event_level::error:
spdlog::error(event.get_single_line());
break;
case event_level::warn:
spdlog::warn(event.get_single_line());
break;
case event_level::info:
spdlog::info(event.get_single_line());
break;
case event_level::debug:
spdlog::debug(event.get_single_line());
break;
case event_level::trace:
default:
spdlog::trace(event.get_single_line());
break;
}
}
} // namespace repertory

View File

@ -26,34 +26,49 @@
namespace repertory {
auto event_level_from_string(std::string level) -> event_level {
level = utils::string::to_lower(level);
if (level == "critical" || level == "event_level::critical") {
return event_level::critical;
}
if (level == "debug" || level == "event_level::debug") {
return event_level::debug;
} else if (level == "warn" || level == "event_level::warn") {
return event_level::warn;
} else if (level == "normal" || level == "event_level::normal") {
return event_level::normal;
} else if (level == "error" || level == "event_level::error") {
return event_level::error;
} else if (level == "verbose" || level == "event_level::verbose") {
return event_level::verbose;
}
return event_level::normal;
if (level == "warn" || level == "event_level::warn") {
return event_level::warn;
}
if (level == "info" || level == "event_level::info") {
return event_level::info;
}
if (level == "error" || level == "event_level::error") {
return event_level::error;
}
if (level == "trace" || level == "event_level::trace") {
return event_level::trace;
}
return event_level::info;
}
auto event_level_to_string(const event_level &level) -> std::string {
auto event_level_to_string(event_level level) -> std::string {
switch (level) {
case event_level::critical:
return "critical";
case event_level::debug:
return "debug";
case event_level::error:
return "error";
case event_level::normal:
return "normal";
case event_level::info:
return "info";
case event_level::warn:
return "warn";
case event_level::verbose:
return "verbose";
case event_level::trace:
return "trace";
default:
return "normal";
return "info";
}
}
} // namespace repertory

View File

@ -38,12 +38,12 @@ void polling::frequency_thread(
if (kv.second.freq == freq) {
futures.emplace_back(
std::async(std::launch::async, [this, &freq, kv]() -> void {
if (config_->get_event_level() == event_level::verbose ||
if (config_->get_event_level() == event_level::trace ||
freq != frequency::second) {
event_system::instance().raise<polling_item_begin>(kv.first);
}
kv.second.action();
if (config_->get_event_level() == event_level::verbose ||
if (config_->get_event_level() == event_level::trace ||
freq != frequency::second) {
event_system::instance().raise<polling_item_end>(kv.first);
}

View File

@ -78,7 +78,7 @@ protected:
.empty());
EXPECT_FALSE(
config->set_value_by_name("S3Config.Bucket", "repertory").empty());
config->set_event_level(event_level::verbose);
config->set_event_level(event_level::trace);
config->set_enable_drive_events(true);
event_system::instance().start();

View File

@ -541,7 +541,7 @@ TEST(fuse_drive, all_tests) {
app_config src_cfg(provider_type::s3,
utils::path::combine(get_test_dir(), {"storj"}));
config_ptr->set_enable_drive_events(true);
config_ptr->set_event_level(event_level::verbose);
config_ptr->set_event_level(event_level::trace);
config_ptr->set_s3_config(src_cfg.get_s3_config());
}

View File

@ -926,7 +926,7 @@ TEST(remote_fuse, all_tests) {
config.set_remote_port(port);
config.set_remote_token("testtoken");
config.set_enable_drive_events(true);
config.set_event_level(event_level::verbose);
config.set_event_level(event_level::trace);
event_system::instance().start();
#if defined(_WIN32)

View File

@ -498,7 +498,7 @@ TEST(remote_winfsp, all_tests) {
config.set_remote_port(port);
config.set_remote_token("testtoken");
config.set_enable_drive_events(true);
config.set_event_level(event_level::verbose);
config.set_event_level(event_level::trace);
event_system::instance().start();
#if defined(_WIN32)