diff --git a/repertory/librepertory/include/events/event.hpp b/repertory/librepertory/include/events/event.hpp index 5a6a88d3..fc767b03 100644 --- a/repertory/librepertory/include/events/event.hpp +++ b/repertory/librepertory/include/events/event.hpp @@ -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: diff --git a/repertory/librepertory/src/app_config.cpp b/repertory/librepertory/src/app_config.cpp index ea822147..24b25f13 100644 --- a/repertory/librepertory/src/app_config.cpp +++ b/repertory/librepertory/src/app_config.cpp @@ -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"); diff --git a/repertory/librepertory/src/drives/fuse/fuse_base.cpp b/repertory/librepertory/src/drives/fuse/fuse_base.cpp index 7d6c463e..20828206 100644 --- a/repertory/librepertory/src/drives/fuse/fuse_base.cpp +++ b/repertory/librepertory/src/drives/fuse/fuse_base.cpp @@ -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( utils::string::right_trim(function_name, '_'), api_path, ret); } diff --git a/repertory/librepertory/src/drives/fuse/remotefuse/remote_server.cpp b/repertory/librepertory/src/drives/fuse/remotefuse/remote_server.cpp index b923ba8a..ccd44aac 100644 --- a/repertory/librepertory/src/drives/fuse/remotefuse/remote_server.cpp +++ b/repertory/librepertory/src/drives/fuse/remotefuse/remote_server.cpp @@ -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(func, file, ret) // clang-format off diff --git a/repertory/librepertory/src/drives/winfsp/remotewinfsp/remote_client.cpp b/repertory/librepertory/src/drives/winfsp/remotewinfsp/remote_client.cpp index 245becc2..07bc79bd 100644 --- a/repertory/librepertory/src/drives/winfsp/remotewinfsp/remote_client.cpp +++ b/repertory/librepertory/src/drives/winfsp/remotewinfsp/remote_client.cpp @@ -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(func, file, ret) // clang-format off diff --git a/repertory/librepertory/src/drives/winfsp/remotewinfsp/remote_server.cpp b/repertory/librepertory/src/drives/winfsp/remotewinfsp/remote_server.cpp index bf6c459e..06e56f0e 100644 --- a/repertory/librepertory/src/drives/winfsp/remotewinfsp/remote_server.cpp +++ b/repertory/librepertory/src/drives/winfsp/remotewinfsp/remote_server.cpp @@ -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(func, file, ret) // clang-format off diff --git a/repertory/librepertory/src/drives/winfsp/winfsp_drive.cpp b/repertory/librepertory/src/drives/winfsp/winfsp_drive.cpp index f20d51b3..4438ee01 100644 --- a/repertory/librepertory/src/drives/winfsp/winfsp_drive.cpp +++ b/repertory/librepertory/src/drives/winfsp/winfsp_drive.cpp @@ -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(func, file, ret) winfsp_drive::winfsp_service::winfsp_service( diff --git a/repertory/librepertory/src/events/consumers/logging_consumer.cpp b/repertory/librepertory/src/events/consumers/logging_consumer.cpp index 757fb3b8..a90a7735 100644 --- a/repertory/librepertory/src/events/consumers/logging_consumer.cpp +++ b/repertory/librepertory/src/events/consumers/logging_consumer.cpp @@ -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()); + switch (event_level_) {} }); + + spdlog::init_thread_pool(8192, 1); + std::vector sinks{ + std::make_shared(), + std::make_shared( + utils::path::combine(log_directory_, {"repertory.log"}), + MAX_LOG_FILE_SIZE, MAX_LOG_FILES), + }; + + spdlog::register_logger(std::make_shared( + "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 diff --git a/repertory/librepertory/src/events/event.cpp b/repertory/librepertory/src/events/event.cpp index 428155ad..c848627a 100644 --- a/repertory/librepertory/src/events/event.cpp +++ b/repertory/librepertory/src/events/event.cpp @@ -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 diff --git a/repertory/librepertory/src/utils/polling.cpp b/repertory/librepertory/src/utils/polling.cpp index 673011c9..4bd2178a 100644 --- a/repertory/librepertory/src/utils/polling.cpp +++ b/repertory/librepertory/src/utils/polling.cpp @@ -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(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(kv.first); } diff --git a/repertory/repertory_test/include/fixtures/winfsp_fixture.hpp b/repertory/repertory_test/include/fixtures/winfsp_fixture.hpp index a2642918..2fa29e7f 100644 --- a/repertory/repertory_test/include/fixtures/winfsp_fixture.hpp +++ b/repertory/repertory_test/include/fixtures/winfsp_fixture.hpp @@ -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(); diff --git a/repertory/repertory_test/src/fuse_drive_test.cpp b/repertory/repertory_test/src/fuse_drive_test.cpp index c701c7f4..b43f1da9 100644 --- a/repertory/repertory_test/src/fuse_drive_test.cpp +++ b/repertory/repertory_test/src/fuse_drive_test.cpp @@ -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()); } diff --git a/repertory/repertory_test/src/remote_fuse_test.cpp b/repertory/repertory_test/src/remote_fuse_test.cpp index 30684cf1..0945bac2 100644 --- a/repertory/repertory_test/src/remote_fuse_test.cpp +++ b/repertory/repertory_test/src/remote_fuse_test.cpp @@ -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) diff --git a/repertory/repertory_test/src/remote_winfsp_test.cpp b/repertory/repertory_test/src/remote_winfsp_test.cpp index 6a74d1cb..37b5c6f7 100644 --- a/repertory/repertory_test/src/remote_winfsp_test.cpp +++ b/repertory/repertory_test/src/remote_winfsp_test.cpp @@ -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)