diff --git a/td/telegram/Logging.cpp b/td/telegram/Logging.cpp new file mode 100644 index 00000000..e742418f --- /dev/null +++ b/td/telegram/Logging.cpp @@ -0,0 +1,123 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +#include "td/telegram/Logging.h" + +#include "td/telegram/net/ConnectionCreator.h" +#include "td/telegram/files/FileManager.h" +#include "td/telegram/Td.h" + +#include "tddb/td/db/binlog/BinlogEvent.h" + +#include "tdnet/td/net/TransparentProxy.h" + +#include "td/utils/FileLog.h" +#include "td/utils/logging.h" +#include "td/utils/misc.h" + +#include +#include + +namespace td { + +static std::mutex logging_mutex; +static FileLog file_log; +static TsLog ts_log(&file_log); +static NullLog null_log; + +#define ADD_TAG(tag) \ + { #tag, &VERBOSITY_NAME(tag) } +static const std::unordered_map log_tags{ + ADD_TAG(td_init), ADD_TAG(update_file), ADD_TAG(connections), ADD_TAG(binlog), ADD_TAG(proxy), + ADD_TAG(net_query), ADD_TAG(td_requests), ADD_TAG(dc), ADD_TAG(files), ADD_TAG(mtproto), + ADD_TAG(raw_mtproto), ADD_TAG(fd), ADD_TAG(buffer), ADD_TAG(sqlite)}; +#undef ADD_TAG + +Status Logging::set_current_stream(td_api::object_ptr stream) { + if (stream == nullptr) { + return Status::Error("Log stream must not be empty"); + } + + std::lock_guard lock(logging_mutex); + switch (stream->get_id()) { + case td_api::logStreamDefault::ID: + log_interface = default_log_interface; + return Status::OK(); + case td_api::logStreamFile::ID: { + auto file_stream = td_api::move_object_as(stream); + auto max_log_file_size = file_stream->max_file_size_; + if (max_log_file_size <= 0) { + return Status::Error("Max log file size should be positive"); + } + + TRY_STATUS(file_log.init(file_stream->path_, max_log_file_size)); + log_interface = &ts_log; + return Status::OK(); + } + case td_api::logStreamEmpty::ID: + log_interface = &null_log; + return Status::OK(); + default: + UNREACHABLE(); + return Status::OK(); + } +} + +Result> Logging::get_current_stream() { + std::lock_guard lock(logging_mutex); + if (log_interface == default_log_interface) { + return td_api::make_object(); + } + if (log_interface == &null_log) { + return td_api::make_object(); + } + if (log_interface == &ts_log) { + return td_api::make_object(file_log.get_path().str(), file_log.get_rotate_threshold()); + } + return Status::Error("Log stream is unrecognized"); +} + +Status Logging::set_verbosity_level(int new_verbosity_level) { + std::lock_guard lock(logging_mutex); + if (0 <= new_verbosity_level && new_verbosity_level <= VERBOSITY_NAME(NEVER)) { + SET_VERBOSITY_LEVEL(VERBOSITY_NAME(FATAL) + new_verbosity_level); + return Status::OK(); + } + + return Status::Error("Wrong new verbosity level specified"); +} + +int Logging::get_verbosity_level() { + std::lock_guard lock(logging_mutex); + return GET_VERBOSITY_LEVEL(); +} + +vector Logging::get_tags() { + return transform(log_tags, [](auto &tag) { return tag.first.str(); }); +} + +Status Logging::set_tag_verbosity_level(Slice tag, int new_verbosity_level) { + auto it = log_tags.find(tag); + if (it == log_tags.end()) { + return Status::Error("Log tag is not found"); + } + + std::lock_guard lock(logging_mutex); + *it->second = clamp(new_verbosity_level, 1, VERBOSITY_NAME(NEVER)); + return Status::OK(); +} + +Result Logging::get_tag_verbosity_level(Slice tag) { + auto it = log_tags.find(tag); + if (it == log_tags.end()) { + return Status::Error("Log tag is not found"); + } + + std::lock_guard lock(logging_mutex); + return *it->second; +} + +} // namespace td diff --git a/td/telegram/Logging.h b/td/telegram/Logging.h new file mode 100644 index 00000000..ee994611 --- /dev/null +++ b/td/telegram/Logging.h @@ -0,0 +1,34 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +#pragma once + +#include "td/telegram/td_api.h" + +#include "td/utils/common.h" +#include "td/utils/Slice.h" +#include "td/utils/Status.h" + +namespace td { + +class Logging { + public: + static Status set_current_stream(td_api::object_ptr stream); + + static Result> get_current_stream(); + + static Status set_verbosity_level(int new_verbosity_level); + + static int get_verbosity_level(); + + static vector get_tags(); + + static Status set_tag_verbosity_level(Slice tag, int new_verbosity_level); + + static Result get_tag_verbosity_level(Slice tag); +}; + +} // namespace td