diff --git a/src/ray/util/logging.cc b/src/ray/util/logging.cc index e62615cd1..1640c5cfc 100644 --- a/src/ray/util/logging.cc +++ b/src/ray/util/logging.cc @@ -96,22 +96,19 @@ class SpdLogMessage final { explicit SpdLogMessage(const char *file, int line, int loglevel) : loglevel_(loglevel) { stream() << ConstBasename(file) << ":" << line << ": "; } - inline std::shared_ptr get_logger() { - auto logger = spdlog::get("ray_log_sink"); - if (!logger) { - logger = spdlog::get("stderr"); - } + inline std::shared_ptr GetDefaultLogger() { // We just emit all log informations to stderr when no default logger has been created // before starting ray log, which is for glog compatible. - if (!logger) { - logger = spdlog::stderr_color_mt("stderr"); - logger->set_pattern(RayLog::GetLogFormatPattern()); - } + static auto logger = spdlog::stderr_color_mt("stderr"); + logger->set_pattern(RayLog::GetLogFormatPattern()); return logger; } inline void Flush() { - auto logger = get_logger(); + auto logger = spdlog::get(RayLog::GetLoggerName()); + if (!logger) { + logger = GetDefaultLogger(); + } // To avoid dump duplicated stacktrace with installed failure signal // handler, we have to check whether glog failure signal handler is enabled. if (!RayLog::IsFailureSignalHandlerEnabled() && @@ -197,6 +194,7 @@ std::string RayLog::log_dir_ = ""; // Format pattern is 2020-08-21 17:00:00,000 I 100 1001 msg. // %L is loglevel, %P is process id, %t for thread id. std::string RayLog::log_format_pattern_ = "[%Y-%m-%d %H:%M:%S,%e %L %P %t] %v"; +std::string RayLog::logger_name_ = "ray_log_sink"; long RayLog::log_rotation_max_size_ = 1 << 29; long RayLog::log_rotation_file_num_ = 10; bool RayLog::is_failure_signal_handler_installed_ = false; @@ -319,14 +317,16 @@ void RayLog::StartRayLog(const std::string &app_name, RayLogLevel severity_thres spdlog::set_level(static_cast(severity_threshold_)); // Sink all log stuff to default file logger we defined here. We may need // multiple sinks for different files or loglevel. - auto file_logger = spdlog::get("ray_log_sink"); - if (!file_logger) { - file_logger = - spdlog::rotating_logger_mt("ray_log_sink", - dir_ends_with_slash + app_name_without_path + "_" + - std::to_string(pid) + ".log", - log_rotation_max_size_, log_rotation_file_num_); + auto file_logger = spdlog::get(RayLog::GetLoggerName()); + if (file_logger) { + // Drop this old logger first if we need reset filename or reconfig + // logger. + spdlog::drop(RayLog::GetLoggerName()); } + file_logger = spdlog::rotating_logger_mt( + RayLog::GetLoggerName(), + dir_ends_with_slash + app_name_without_path + "_" + std::to_string(pid) + ".log", + log_rotation_max_size_, log_rotation_file_num_); spdlog::set_default_logger(file_logger); #endif } else { @@ -345,7 +345,7 @@ void RayLog::StartRayLog(const std::string &app_name, RayLogLevel severity_thres err_sink->set_level(spdlog::level::err); auto logger = std::shared_ptr( - new spdlog::logger("ray_log_sink", {console_sink, err_sink})); + new spdlog::logger(RayLog::GetLoggerName(), {console_sink, err_sink})); logger->set_level(level); spdlog::set_default_logger(logger); #endif @@ -401,8 +401,9 @@ void RayLog::ShutDownRayLog() { if (spdlog::default_logger()) { spdlog::default_logger()->flush(); } - spdlog::drop_all(); - spdlog::shutdown(); + // NOTE(lingxuan.zlx) All loggers will be closed in shutdown but we don't need drop + // console logger out because of some console logging might be used after shutdown ray + // log. spdlog::shutdown(); #endif } @@ -450,6 +451,8 @@ bool RayLog::IsLevelEnabled(RayLogLevel log_level) { std::string RayLog::GetLogFormatPattern() { return log_format_pattern_; } +std::string RayLog::GetLoggerName() { return logger_name_; } + RayLog::RayLog(const char *file_name, int line_number, RayLogLevel severity) // glog does not have DEBUG level, we can handle it using is_enabled_. : logging_provider_(nullptr), is_enabled_(severity >= severity_threshold_) { diff --git a/src/ray/util/logging.h b/src/ray/util/logging.h index 98d8aa32c..0188956d6 100644 --- a/src/ray/util/logging.h +++ b/src/ray/util/logging.h @@ -156,6 +156,8 @@ class RayLog : public RayLogBase { static std::string GetLogFormatPattern(); + static std::string GetLoggerName(); + private: // Hide the implementation of log provider by void *. // Otherwise, lib user may define the same macro to use the correct header file. @@ -178,6 +180,8 @@ class RayLog : public RayLogBase { static long log_rotation_max_size_; // Log rotation file number. static long log_rotation_file_num_; + // Ray default logger name. + static std::string logger_name_; protected: virtual std::ostream &Stream();