[Log] fix spdlog init race (#12973)

* fix spdlog init race

* use global logger

* refine logger name and constructor
This commit is contained in:
Lingxuan Zuo 2021-01-07 03:02:54 +08:00 committed by GitHub
parent 695833082d
commit 01d4638b49
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 20 deletions

View file

@ -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<spdlog::logger> get_logger() {
auto logger = spdlog::get("ray_log_sink");
if (!logger) {
logger = spdlog::get("stderr");
}
inline std::shared_ptr<spdlog::logger> 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<spdlog::level::level_enum>(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<spdlog::logger>(
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_) {

View file

@ -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();