diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md index 08855608a..41985c711 100644 --- a/trunk/doc/CHANGELOG.md +++ b/trunk/doc/CHANGELOG.md @@ -8,6 +8,7 @@ The changelog for SRS. ## SRS 5.0 Changelog +* v5.0, 2022-10-25, Log: Refine the log interface. v5.0.82 * v5.0, 2022-10-23, For [#3216](https://github.com/ossrs/srs/issues/3216): Support Google Address Sanitizer. v5.0.81 * v5.0, 2022-10-21, Kernel: Support grab backtrace stack when assert fail. v5.0.80 * v5.0, 2022-10-21, ST: Refine tools and CMakeLists.txt. Add backtrace example. v5.0.79 diff --git a/trunk/src/app/srs_app_log.cpp b/trunk/src/app/srs_app_log.cpp index 95d355313..1db643503 100644 --- a/trunk/src/app/srs_app_log.cpp +++ b/trunk/src/app/srs_app_log.cpp @@ -30,7 +30,7 @@ SrsFileLog::SrsFileLog() { - level = SrsLogLevelTrace; + level_ = SrsLogLevelTrace; log_data = new char[LOG_MAX_SIZE]; fd = -1; @@ -62,7 +62,7 @@ srs_error_t SrsFileLog::initialize() _srs_config->subscribe(this); log_to_file_tank = _srs_config->get_log_tank_file(); - level = srs_get_log_level(_srs_config->get_log_level()); + level_ = srs_get_log_level(_srs_config->get_log_level()); utc = _srs_config->get_utc_time(); } @@ -82,141 +82,31 @@ void SrsFileLog::reopen() open_log_file(); } -void SrsFileLog::verbose(const char* tag, SrsContextId context_id, const char* fmt, ...) +void SrsFileLog::log(SrsLogLevel level, const char* tag, const SrsContextId& context_id, const char* fmt, va_list args) { + if (level < level_ || level >= SrsLogLevelDisabled) { + return; + } + SrsThreadLocker(mutex_); - if (level > SrsLogLevelVerbose) { - return; - } - int size = 0; - if (!srs_log_header(log_data, LOG_MAX_SIZE, utc, false, tag, context_id, "Verb", &size)) { + bool header_ok = srs_log_header( + log_data, LOG_MAX_SIZE, utc, level >= SrsLogLevelWarn, tag, context_id, srs_log_level_strings[level], &size + ); + if (!header_ok) { return; } - va_list ap; - va_start(ap, fmt); - int r0 = vsnprintf(log_data + size, LOG_MAX_SIZE - size, fmt, ap); - va_end(ap); - // Something not expected, drop the log. + int r0 = vsnprintf(log_data + size, LOG_MAX_SIZE - size, fmt, args); if (r0 <= 0 || r0 >= LOG_MAX_SIZE - size) { return; } size += r0; - write_log(fd, log_data, size, SrsLogLevelVerbose); -} - -void SrsFileLog::info(const char* tag, SrsContextId context_id, const char* fmt, ...) -{ - SrsThreadLocker(mutex_); - - if (level > SrsLogLevelInfo) { - return; - } - - int size = 0; - if (!srs_log_header(log_data, LOG_MAX_SIZE, utc, false, tag, context_id, "Debug", &size)) { - return; - } - - va_list ap; - va_start(ap, fmt); - int r0 = vsnprintf(log_data + size, LOG_MAX_SIZE - size, fmt, ap); - va_end(ap); - - // Something not expected, drop the log. - if (r0 <= 0 || r0 >= LOG_MAX_SIZE - size) { - return; - } - size += r0; - - write_log(fd, log_data, size, SrsLogLevelInfo); -} - -void SrsFileLog::trace(const char* tag, SrsContextId context_id, const char* fmt, ...) -{ - SrsThreadLocker(mutex_); - - if (level > SrsLogLevelTrace) { - return; - } - - int size = 0; - if (!srs_log_header(log_data, LOG_MAX_SIZE, utc, false, tag, context_id, "Trace", &size)) { - return; - } - - va_list ap; - va_start(ap, fmt); - int r0 = vsnprintf(log_data + size, LOG_MAX_SIZE - size, fmt, ap); - va_end(ap); - - // Something not expected, drop the log. - if (r0 <= 0 || r0 >= LOG_MAX_SIZE - size) { - return; - } - size += r0; - - write_log(fd, log_data, size, SrsLogLevelTrace); -} - -void SrsFileLog::warn(const char* tag, SrsContextId context_id, const char* fmt, ...) -{ - SrsThreadLocker(mutex_); - - if (level > SrsLogLevelWarn) { - return; - } - - int size = 0; - if (!srs_log_header(log_data, LOG_MAX_SIZE, utc, true, tag, context_id, "Warn", &size)) { - return; - } - - va_list ap; - va_start(ap, fmt); - int r0 = vsnprintf(log_data + size, LOG_MAX_SIZE - size, fmt, ap); - va_end(ap); - - // Something not expected, drop the log. - if (r0 <= 0 || r0 >= LOG_MAX_SIZE - size) { - return; - } - size += r0; - - write_log(fd, log_data, size, SrsLogLevelWarn); -} - -void SrsFileLog::error(const char* tag, SrsContextId context_id, const char* fmt, ...) -{ - SrsThreadLocker(mutex_); - - if (level > SrsLogLevelError) { - return; - } - - int size = 0; - if (!srs_log_header(log_data, LOG_MAX_SIZE, utc, true, tag, context_id, "Error", &size)) { - return; - } - - va_list ap; - va_start(ap, fmt); - int r0 = vsnprintf(log_data + size, LOG_MAX_SIZE - size, fmt, ap); - va_end(ap); - - // Something not expected, drop the log. - if (r0 <= 0 || r0 >= LOG_MAX_SIZE - size) { - return; - } - size += r0; - - // add strerror() to error msg. - // Check size to avoid security issue https://github.com/ossrs/srs/issues/1229 - if (errno != 0 && size < LOG_MAX_SIZE) { + // Add errno and strerror() if error. Check size to avoid security issue https://github.com/ossrs/srs/issues/1229 + if (level == SrsLogLevelError && errno != 0 && size < LOG_MAX_SIZE) { r0 = snprintf(log_data + size, LOG_MAX_SIZE - size, "(%s)", strerror(errno)); // Something not expected, drop the log. @@ -225,8 +115,8 @@ void SrsFileLog::error(const char* tag, SrsContextId context_id, const char* fmt } size += r0; } - - write_log(fd, log_data, size, SrsLogLevelError); + + write_log(fd, log_data, size, level); } void SrsFileLog::write_log(int& fd, char *str_log, int size, int level) diff --git a/trunk/src/app/srs_app_log.hpp b/trunk/src/app/srs_app_log.hpp index 24824c64f..8c063f6cb 100644 --- a/trunk/src/app/srs_app_log.hpp +++ b/trunk/src/app/srs_app_log.hpp @@ -32,7 +32,7 @@ class SrsFileLog : public ISrsLog, public ISrsReloadHandler { private: // Defined in SrsLogLevel. - SrsLogLevel level; + SrsLogLevel level_; private: char* log_data; // Log to file if specified srs_log_file @@ -51,11 +51,7 @@ public: public: virtual srs_error_t initialize(); virtual void reopen(); - virtual void verbose(const char* tag, SrsContextId context_id, const char* fmt, ...); - virtual void info(const char* tag, SrsContextId context_id, const char* fmt, ...); - virtual void trace(const char* tag, SrsContextId context_id, const char* fmt, ...); - virtual void warn(const char* tag, SrsContextId context_id, const char* fmt, ...); - virtual void error(const char* tag, SrsContextId context_id, const char* fmt, ...); + virtual void log(SrsLogLevel level, const char* tag, const SrsContextId& context_id, const char* fmt, va_list args); private: virtual void write_log(int& fd, char* str_log, int size, int level); virtual void open_log_file(); diff --git a/trunk/src/core/srs_core_version5.hpp b/trunk/src/core/srs_core_version5.hpp index 6d29ce820..b9bd1bd08 100644 --- a/trunk/src/core/srs_core_version5.hpp +++ b/trunk/src/core/srs_core_version5.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 0 -#define VERSION_REVISION 81 +#define VERSION_REVISION 82 #endif diff --git a/trunk/src/kernel/srs_kernel_log.cpp b/trunk/src/kernel/srs_kernel_log.cpp index 8469c09fb..63c290f8b 100644 --- a/trunk/src/kernel/srs_kernel_log.cpp +++ b/trunk/src/kernel/srs_kernel_log.cpp @@ -6,6 +6,18 @@ #include +#include + +const char* srs_log_level_strings[] = { + "Forbidden", + "Verb", + "Debug", NULL, + "Trace", NULL, NULL, NULL, + "Warn", NULL, NULL, NULL, NULL, NULL, NULL, NULL, + "Error", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + "Disabled", +}; + ISrsLog::ISrsLog() { } @@ -22,4 +34,15 @@ ISrsContext::~ISrsContext() { } +void srs_logger_impl(SrsLogLevel level, const char* tag, const SrsContextId& context_id, const char* fmt, ...) +{ + if (!_srs_log) return; + + va_list args; + va_start(args, fmt); + _srs_log->log(level, tag, context_id, fmt, args); + va_end(args); +} + + diff --git a/trunk/src/kernel/srs_kernel_log.hpp b/trunk/src/kernel/srs_kernel_log.hpp index f257d8601..43d04baf8 100644 --- a/trunk/src/kernel/srs_kernel_log.hpp +++ b/trunk/src/kernel/srs_kernel_log.hpp @@ -14,6 +14,7 @@ #include #include #include +#include #include @@ -33,6 +34,9 @@ enum SrsLogLevel SrsLogLevelDisabled = 0x20, }; +// Get the level in string. +extern const char* srs_log_level_strings[]; + // The log interface provides method to write log. // but we provides some macro, which enable us to disable the log when compile. // @see also SmtDebug/SmtTrace/SmtWarn/SmtError which is corresponding to Debug/Trace/Warn/Fatal. @@ -47,17 +51,8 @@ public: // Reopen the log file for log rotate. virtual void reopen() = 0; public: - // The log for verbose, very verbose information. - virtual void verbose(const char* tag, SrsContextId context_id, const char* fmt, ...) = 0; - // The log for debug, detail information. - virtual void info(const char* tag, SrsContextId context_id, const char* fmt, ...) = 0; - // The log for trace, important information. - virtual void trace(const char* tag, SrsContextId context_id, const char* fmt, ...) = 0; - // The log for warn, warn is something should take attention, but not a error. - virtual void warn(const char* tag, SrsContextId context_id, const char* fmt, ...) = 0; - // The log for error, something error occur, do something about the error, ie. close the connection, - // but we will donot abort the program. - virtual void error(const char* tag, SrsContextId context_id, const char* fmt, ...) = 0; + // Write a application level log. All parameters are required except the tag. + virtual void log(SrsLogLevel level, const char* tag, const SrsContextId& context_id, const char* fmt, va_list args) = 0; }; // The logic context, for example, a RTMP connection, or RTC Session, etc. @@ -82,26 +77,29 @@ public: virtual const SrsContextId& set_id(const SrsContextId& v) = 0; }; +// @global User must implements the LogContext and define a global instance. +extern ISrsContext* _srs_context; + // @global User must provides a log object extern ISrsLog* _srs_log; -// @global User must implements the LogContext and define a global instance. -extern ISrsContext* _srs_context; +// Global log function implementation. Please use helper macros, for example, srs_trace or srs_error. +extern void srs_logger_impl(SrsLogLevel level, const char* tag, const SrsContextId& context_id, const char* fmt, ...); // Log style. // Use __FUNCTION__ to print c method // Use __PRETTY_FUNCTION__ to print c++ class:method -#define srs_verbose(msg, ...) _srs_log->verbose(NULL, _srs_context->get_id(), msg, ##__VA_ARGS__) -#define srs_info(msg, ...) _srs_log->info(NULL, _srs_context->get_id(), msg, ##__VA_ARGS__) -#define srs_trace(msg, ...) _srs_log->trace(NULL, _srs_context->get_id(), msg, ##__VA_ARGS__) -#define srs_warn(msg, ...) _srs_log->warn(NULL, _srs_context->get_id(), msg, ##__VA_ARGS__) -#define srs_error(msg, ...) _srs_log->error(NULL, _srs_context->get_id(), msg, ##__VA_ARGS__) +#define srs_verbose(msg, ...) srs_logger_impl(SrsLogLevelVerbose, NULL, _srs_context->get_id(), msg, ##__VA_ARGS__) +#define srs_info(msg, ...) srs_logger_impl(SrsLogLevelInfo, NULL, _srs_context->get_id(), msg, ##__VA_ARGS__) +#define srs_trace(msg, ...) srs_logger_impl(SrsLogLevelTrace, NULL, _srs_context->get_id(), msg, ##__VA_ARGS__) +#define srs_warn(msg, ...) srs_logger_impl(SrsLogLevelWarn, NULL, _srs_context->get_id(), msg, ##__VA_ARGS__) +#define srs_error(msg, ...) srs_logger_impl(SrsLogLevelError, NULL, _srs_context->get_id(), msg, ##__VA_ARGS__) // With tag. -#define srs_verbose2(tag, msg, ...) _srs_log->verbose(tag, _srs_context->get_id(), msg, ##__VA_ARGS__) -#define srs_info2(tag, msg, ...) _srs_log->info(tag, _srs_context->get_id(), msg, ##__VA_ARGS__) -#define srs_trace2(tag, msg, ...) _srs_log->trace(tag, _srs_context->get_id(), msg, ##__VA_ARGS__) -#define srs_warn2(tag, msg, ...) _srs_log->warn(tag, _srs_context->get_id(), msg, ##__VA_ARGS__) -#define srs_error2(tag, msg, ...) _srs_log->error(tag, _srs_context->get_id(), msg, ##__VA_ARGS__) +#define srs_verbose2(tag, msg, ...) srs_logger_impl(SrsLogLevelVerbose, tag, _srs_context->get_id(), msg, ##__VA_ARGS__) +#define srs_info2(tag, msg, ...) srs_logger_impl(SrsLogLevelInfo, tag, _srs_context->get_id(), msg, ##__VA_ARGS__) +#define srs_trace2(tag, msg, ...) srs_logger_impl(SrsLogLevelTrace, tag, _srs_context->get_id(), msg, ##__VA_ARGS__) +#define srs_warn2(tag, msg, ...) srs_logger_impl(SrsLogLevelWarn, tag, _srs_context->get_id(), msg, ##__VA_ARGS__) +#define srs_error2(tag, msg, ...) srs_logger_impl(SrsLogLevelError, tag, _srs_context->get_id(), msg, ##__VA_ARGS__) // TODO: FIXME: Add more verbose and info logs. #ifndef SRS_VERBOSE diff --git a/trunk/src/protocol/srs_protocol_log.cpp b/trunk/src/protocol/srs_protocol_log.cpp index a80da9c70..6aec0cc44 100644 --- a/trunk/src/protocol/srs_protocol_log.cpp +++ b/trunk/src/protocol/srs_protocol_log.cpp @@ -106,7 +106,7 @@ impl_SrsContextRestore::~impl_SrsContextRestore() // LCOV_EXCL_START SrsConsoleLog::SrsConsoleLog(SrsLogLevel l, bool u) { - level = l; + level_ = l; utc = u; buffer = new char[SRS_BASIC_LOG_SIZE]; @@ -126,130 +126,26 @@ void SrsConsoleLog::reopen() { } -void SrsConsoleLog::verbose(const char* tag, SrsContextId context_id, const char* fmt, ...) +void SrsConsoleLog::log(SrsLogLevel level, const char* tag, const SrsContextId& context_id, const char* fmt, va_list args) { - if (level > SrsLogLevelVerbose) { + if (level < level_ || level >= SrsLogLevelDisabled) { return; } int size = 0; - if (!srs_log_header(buffer, SRS_BASIC_LOG_SIZE, utc, false, tag, context_id, "Verb", &size)) { + if (!srs_log_header(buffer, SRS_BASIC_LOG_SIZE, utc, level >= SrsLogLevelWarn, tag, context_id, srs_log_level_strings[level], &size)) { return; } - - va_list ap; - va_start(ap, fmt); - int r0 = vsnprintf(buffer + size, SRS_BASIC_LOG_SIZE - size, fmt, ap); - va_end(ap); // Something not expected, drop the log. + int r0 = vsnprintf(buffer + size, SRS_BASIC_LOG_SIZE - size, fmt, args); if (r0 <= 0 || r0 >= SRS_BASIC_LOG_SIZE - size) { return; } size += r0; - - fprintf(stdout, "%s\n", buffer); -} -void SrsConsoleLog::info(const char* tag, SrsContextId context_id, const char* fmt, ...) -{ - if (level > SrsLogLevelInfo) { - return; - } - - int size = 0; - if (!srs_log_header(buffer, SRS_BASIC_LOG_SIZE, utc, false, tag, context_id, "Debug", &size)) { - return; - } - - va_list ap; - va_start(ap, fmt); - int r0 = vsnprintf(buffer + size, SRS_BASIC_LOG_SIZE - size, fmt, ap); - va_end(ap); - - // Something not expected, drop the log. - if (r0 <= 0 || r0 >= SRS_BASIC_LOG_SIZE - size) { - return; - } - size += r0; - - fprintf(stdout, "%s\n", buffer); -} - -void SrsConsoleLog::trace(const char* tag, SrsContextId context_id, const char* fmt, ...) -{ - if (level > SrsLogLevelTrace) { - return; - } - - int size = 0; - if (!srs_log_header(buffer, SRS_BASIC_LOG_SIZE, utc, false, tag, context_id, "Trace", &size)) { - return; - } - - va_list ap; - va_start(ap, fmt); - int r0 = vsnprintf(buffer + size, SRS_BASIC_LOG_SIZE - size, fmt, ap); - va_end(ap); - - // Something not expected, drop the log. - if (r0 <= 0 || r0 >= SRS_BASIC_LOG_SIZE - size) { - return; - } - size += r0; - - fprintf(stdout, "%s\n", buffer); -} - -void SrsConsoleLog::warn(const char* tag, SrsContextId context_id, const char* fmt, ...) -{ - if (level > SrsLogLevelWarn) { - return; - } - - int size = 0; - if (!srs_log_header(buffer, SRS_BASIC_LOG_SIZE, utc, true, tag, context_id, "Warn", &size)) { - return; - } - - va_list ap; - va_start(ap, fmt); - int r0 = vsnprintf(buffer + size, SRS_BASIC_LOG_SIZE - size, fmt, ap); - va_end(ap); - - // Something not expected, drop the log. - if (r0 <= 0 || r0 >= SRS_BASIC_LOG_SIZE - size) { - return; - } - size += r0; - - fprintf(stderr, "%s\n", buffer); -} - -void SrsConsoleLog::error(const char* tag, SrsContextId context_id, const char* fmt, ...) -{ - if (level > SrsLogLevelError) { - return; - } - - int size = 0; - if (!srs_log_header(buffer, SRS_BASIC_LOG_SIZE, utc, true, tag, context_id, "Error", &size)) { - return; - } - - va_list ap; - va_start(ap, fmt); - int r0 = vsnprintf(buffer + size, SRS_BASIC_LOG_SIZE - size, fmt, ap); - va_end(ap); - - // Something not expected, drop the log. - if (r0 <= 0 || r0 >= SRS_BASIC_LOG_SIZE - size) { - return; - } - size += r0; - - // add strerror() to error msg. - if (errno != 0) { + // Add errno and strerror() if error. + if (level == SrsLogLevelError && errno != 0) { r0 = snprintf(buffer + size, SRS_BASIC_LOG_SIZE - size, "(%s)", strerror(errno)); // Something not expected, drop the log. @@ -258,10 +154,13 @@ void SrsConsoleLog::error(const char* tag, SrsContextId context_id, const char* } size += r0; } - - fprintf(stderr, "%s\n", buffer); + + if (level >= SrsLogLevelWarn) { + fprintf(stderr, "%s\n", buffer); + } else { + fprintf(stdout, "%s\n", buffer); + } } -// LCOV_EXCL_STOP bool srs_log_header(char* buffer, int size, bool utc, bool dangerous, const char* tag, SrsContextId cid, const char* level, int* psize) { diff --git a/trunk/src/protocol/srs_protocol_log.hpp b/trunk/src/protocol/srs_protocol_log.hpp index ffd25e1c1..5e20cd12c 100644 --- a/trunk/src/protocol/srs_protocol_log.hpp +++ b/trunk/src/protocol/srs_protocol_log.hpp @@ -52,7 +52,7 @@ public: class SrsConsoleLog : public ISrsLog { private: - SrsLogLevel level; + SrsLogLevel level_; bool utc; private: char* buffer; @@ -63,11 +63,7 @@ public: public: virtual srs_error_t initialize(); virtual void reopen(); - virtual void verbose(const char* tag, SrsContextId context_id, const char* fmt, ...); - virtual void info(const char* tag, SrsContextId context_id, const char* fmt, ...); - virtual void trace(const char* tag, SrsContextId context_id, const char* fmt, ...); - virtual void warn(const char* tag, SrsContextId context_id, const char* fmt, ...); - virtual void error(const char* tag, SrsContextId context_id, const char* fmt, ...); + virtual void log(SrsLogLevel level, const char* tag, const SrsContextId& context_id, const char* fmt, va_list args); }; // Generate the log header. diff --git a/trunk/src/utest/srs_utest.cpp b/trunk/src/utest/srs_utest.cpp index ea21b05dd..2c15cf541 100644 --- a/trunk/src/utest/srs_utest.cpp +++ b/trunk/src/utest/srs_utest.cpp @@ -102,7 +102,7 @@ GTEST_API_ int main(int argc, char **argv) { MockEmptyLog::MockEmptyLog(SrsLogLevel l) { - level = l; + level_ = l; } MockEmptyLog::~MockEmptyLog() diff --git a/trunk/src/utest/srs_utest_kernel2.cpp b/trunk/src/utest/srs_utest_kernel2.cpp index 03c822a33..0b9e57b50 100644 --- a/trunk/src/utest/srs_utest_kernel2.cpp +++ b/trunk/src/utest/srs_utest_kernel2.cpp @@ -313,3 +313,14 @@ VOID TEST(KernelPSTest, PsPacketHeaderClockDecode) } } +VOID TEST(KernelLogTest, LogLevelString) +{ + EXPECT_STREQ("Forbidden", srs_log_level_strings[SrsLogLevelForbidden]); + EXPECT_STREQ("Verb", srs_log_level_strings[SrsLogLevelVerbose]); + EXPECT_STREQ("Debug", srs_log_level_strings[SrsLogLevelInfo]); + EXPECT_STREQ("Trace", srs_log_level_strings[SrsLogLevelTrace]); + EXPECT_STREQ("Warn", srs_log_level_strings[SrsLogLevelWarn]); + EXPECT_STREQ("Error", srs_log_level_strings[SrsLogLevelError]); + EXPECT_STREQ("Disabled", srs_log_level_strings[SrsLogLevelDisabled]); +} +