diff --git a/td/telegram/Log.cpp b/td/telegram/Log.cpp index 4c8a28b9d..57e5b7bb7 100644 --- a/td/telegram/Log.cpp +++ b/td/telegram/Log.cpp @@ -30,8 +30,11 @@ void Log::set_file_path(string file_path) { return; } - file_log.init(file_path, max_log_file_size); - log_interface = &ts_log; + if (file_log.init(file_path, max_log_file_size)) { + log_interface = &ts_log; + } else { + LOG(FATAL) << "Can't init file log"; + } } void Log::set_max_file_size(int64 max_file_size) { diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index a7634175e..e830a4f44 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -2948,10 +2948,9 @@ void main(int argc, char **argv) { if (*arg == '\0' && i + 1 < argc) { arg = argv[++i]; } - file_log.init(arg); - file_log.init(arg); - file_log.init(arg); - log_interface = &ts_log; + if (file_log.init(arg) && file_log.init(arg) && file_log.init(arg)) { + log_interface = &ts_log; + } } else if (!std::strcmp(argv[i], "-W")) { get_chat_list = true; } else if (!std::strcmp(argv[i], "--disable-network") || !std::strcmp(argv[i], "-n")) { diff --git a/tdutils/td/utils/FileLog.cpp b/tdutils/td/utils/FileLog.cpp index 7732b1502..e3c84f171 100644 --- a/tdutils/td/utils/FileLog.cpp +++ b/tdutils/td/utils/FileLog.cpp @@ -17,16 +17,26 @@ namespace td { -void FileLog::init(string path, int64 rotate_threshold) { - fd_.close(); - path_ = std::move(path); +bool FileLog::init(string path, int64 rotate_threshold) { + if (path == path_) { + set_rotate_threshold(rotate_threshold); + return true; + } - auto r_fd = FileFd::open(path_, FileFd::Create | FileFd::Write | FileFd::Append); - LOG_IF(FATAL, r_fd.is_error()) << "Can't open log: " << r_fd.error(); + auto r_fd = FileFd::open(path, FileFd::Create | FileFd::Write | FileFd::Append); + if (r_fd.is_error()) { + LOG(ERROR) << "Can't open log: " << r_fd.error(); + return false; + } + + fd_.close(); fd_ = r_fd.move_as_ok(); Fd::duplicate(fd_.get_fd(), Fd::Stderr()).ignore(); + + path_ = std::move(path); size_ = fd_.get_size(); rotate_threshold_ = rotate_threshold; + return true; } void FileLog::set_rotate_threshold(int64 rotate_threshold) { diff --git a/tdutils/td/utils/FileLog.h b/tdutils/td/utils/FileLog.h index 2114448dc..12e9d1479 100644 --- a/tdutils/td/utils/FileLog.h +++ b/tdutils/td/utils/FileLog.h @@ -17,7 +17,7 @@ class FileLog : public LogInterface { static constexpr int64 DEFAULT_ROTATE_THRESHOLD = 10 * (1 << 20); public: - void init(string path, int64 rotate_threshold = DEFAULT_ROTATE_THRESHOLD); + bool init(string path, int64 rotate_threshold = DEFAULT_ROTATE_THRESHOLD); void set_rotate_threshold(int64 rotate_threshold); diff --git a/test/TestsRunner.cpp b/test/TestsRunner.cpp index 600e5c3ee..fbe155738 100644 --- a/test/TestsRunner.cpp +++ b/test/TestsRunner.cpp @@ -55,8 +55,9 @@ void TestsRunner::init(string dir) { SET_VERBOSITY_LEVEL(VERBOSITY_NAME(WARNING)); chdir(dir).ensure(); LOG(WARNING) << "Redirect log into " << tag("file", dir + TD_DIR_SLASH + "log.txt"); - file_log.init("log.txt", std::numeric_limits::max()); - log_interface = &ts_log; + if (file_log.init("log.txt", std::numeric_limits::max())) { + log_interface = &ts_log; + } } } // namespace td