1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

Fix #3218: Log: Follow Java/log4j log level specs. v5.0.83 (#3219)

1. Support Java/log4j log level text.
2. Support configuring by `--log-new-level=on` which is enabled by default.
3. Support `--log-new-level=off` to use SRS 4.0 log level for compatibility.
This commit is contained in:
Winlin 2022-10-26 21:23:03 +08:00 committed by GitHub
parent 20c38e07c0
commit 2d1ba46e37
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 147 additions and 24 deletions

View file

@ -2280,7 +2280,7 @@ srs_error_t SrsConfig::check_normal_config()
SrsConfDirective* conf = root->at(i);
std::string n = conf->name;
if (n != "listen" && n != "pid" && n != "chunk_size" && n != "ff_log_dir"
&& n != "srs_log_tank" && n != "srs_log_level" && n != "srs_log_file"
&& n != "srs_log_tank" && n != "srs_log_level" && n != "srs_log_level_v2" && n != "srs_log_file"
&& n != "max_connections" && n != "daemon" && n != "heartbeat" && n != "tencentcloud_apm"
&& n != "http_api" && n != "stats" && n != "vhost" && n != "pithy_print_ms"
&& n != "http_server" && n != "stream_caster" && n != "rtc_server" && n != "srt_server"
@ -6342,12 +6342,26 @@ string SrsConfig::get_log_level()
SRS_OVERWRITE_BY_ENV_STRING("srs.srs_log_level");
static string DEFAULT = "trace";
SrsConfDirective* conf = root->get("srs_log_level");
if (!conf || conf->arg0().empty()) {
return DEFAULT;
}
return conf->arg0();
}
string SrsConfig::get_log_level_v2()
{
SRS_OVERWRITE_BY_ENV_STRING("srs.srs_log_level_v2");
static string DEFAULT = "";
SrsConfDirective* conf = root->get("srs_log_level_v2");
if (!conf || conf->arg0().empty()) {
return DEFAULT;
}
return conf->arg0();
}

View file

@ -869,6 +869,7 @@ public:
virtual bool get_log_tank_file();
// Get the log level.
virtual std::string get_log_level();
virtual std::string get_log_level_v2();
// Get the log file path.
virtual std::string get_log_file();
// Whether ffmpeg log enabled

View file

@ -62,8 +62,11 @@ 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());
utc = _srs_config->get_utc_time();
std::string level = _srs_config->get_log_level();
std::string level_v2 = _srs_config->get_log_level_v2();
level_ = level_v2.empty() ? srs_get_log_level(level) : srs_get_log_level_v2(level_v2);
}
return srs_success;

View file

@ -53,6 +53,23 @@ SrsLogLevel srs_get_log_level(string level)
}
}
SrsLogLevel srs_get_log_level_v2(string level)
{
if ("trace" == level) {
return SrsLogLevelVerbose;
} else if ("debug" == level) {
return SrsLogLevelInfo;
} else if ("info" == level) {
return SrsLogLevelTrace;
} else if ("warn" == level) {
return SrsLogLevelWarn;
} else if ("error" == level) {
return SrsLogLevelError;
} else {
return SrsLogLevelDisabled;
}
}
string srs_path_build_stream(string template_path, string vhost, string app, string stream)
{
std::string path = template_path;

View file

@ -28,6 +28,7 @@ class SrsJsonObject;
// Convert level in string to log level in int.
// @return the log level defined in SrsLogLevel.
extern SrsLogLevel srs_get_log_level(std::string level);
extern SrsLogLevel srs_get_log_level_v2(std::string level);
// Build the path according to vhost/app/stream, where replace variables:
// [vhost], the vhost of stream.

View file

@ -9,6 +9,6 @@
#define VERSION_MAJOR 5
#define VERSION_MINOR 0
#define VERSION_REVISION 82
#define VERSION_REVISION 83
#endif

View file

@ -8,14 +8,25 @@
#include <stdarg.h>
// Go log level: Info, Warning, Error, Fatal, see https://github.com/golang/glog/blob/master/glog.go#L17
// Java log level: TRACE, DEBUG, INFO, WARN, ERROR, FATAL, see https://stackoverflow.com/a/2031209/17679565
// or https://github.com/apache/logging-log4j2/blob/release-2.x/log4j-api/src/main/java/org/apache/logging/log4j/Level.java#L29
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",
#ifdef SRS_LOG_LEVEL_V2
// The v2 log level specs by log4j.
"FORB", "TRACE", "DEBUG", NULL, "INFO", 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,
"OFF",
#else
// SRS 4.0 level definition, to keep compatible.
"Forb", "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,
"Off",
#endif
};
ISrsLog::ISrsLog()

View file

@ -18,12 +18,12 @@
#include <srs_kernel_consts.hpp>
// The log level, for example:
// if specified Debug level, all level messages will be logged.
// if specified Warn level, only Warn/Error/Fatal level messages will be logged.
// The log level, see https://github.com/apache/logging-log4j2/blob/release-2.x/log4j-api/src/main/java/org/apache/logging/log4j/Level.java
// Please note that the enum name might not be the string, to keep compatible with previous definition.
enum SrsLogLevel
{
SrsLogLevelForbidden = 0x00,
// Only used for very verbose debug, generally,
// we compile without this level for high performance.
SrsLogLevelVerbose = 0x01,
@ -31,6 +31,7 @@ enum SrsLogLevel
SrsLogLevelTrace = 0x04,
SrsLogLevelWarn = 0x08,
SrsLogLevelError = 0x10,
SrsLogLevelDisabled = 0x20,
};

View file

@ -16,6 +16,7 @@ using namespace std;
#include <srs_protocol_st.hpp>
#include <srs_protocol_rtmp_stack.hpp>
#include <srs_utest_kernel.hpp>
#include <srs_app_utility.hpp>
MockSrsConfigBuffer::MockSrsConfigBuffer(string buf)
{
@ -3832,3 +3833,26 @@ VOID TEST(ConfigMainTest, CheckIncludeConfig)
HELPER_ASSERT_FAILED(conf.parse("include ./conf/include_test/include.conf;"));
}
}
VOID TEST(ConfigMainTest, LogLevelV2)
{
srs_error_t err;
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.parse(_MIN_OK_CONF));
EXPECT_EQ(SrsLogLevelTrace, srs_get_log_level(conf.get_log_level()));
}
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.parse(_MIN_OK_CONF "srs_log_level warn;"));
EXPECT_EQ(SrsLogLevelWarn, srs_get_log_level(conf.get_log_level()));
}
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.parse(_MIN_OK_CONF "srs_log_level_v2 warn;"));
EXPECT_EQ(SrsLogLevelWarn, srs_get_log_level(conf.get_log_level_v2()));
}
}

View file

@ -10,6 +10,7 @@
#include <srs_kernel_buffer.hpp>
#include <srs_kernel_rtc_rtcp.hpp>
#include <srs_app_gb28181.hpp>
#include <srs_app_utility.hpp>
VOID TEST(KernelPSTest, PsPacketDecodeNormal)
{
@ -315,12 +316,39 @@ 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]);
#ifdef SRS_LOG_LEVEL_V2
EXPECT_STREQ("FORB", srs_log_level_strings[SrsLogLevelForbidden]);
EXPECT_STREQ("TRACE", srs_log_level_strings[SrsLogLevelVerbose]);
EXPECT_STREQ("DEBUG", srs_log_level_strings[SrsLogLevelInfo]);
EXPECT_STREQ("INFO", srs_log_level_strings[SrsLogLevelTrace]);
EXPECT_STREQ("WARN", srs_log_level_strings[SrsLogLevelWarn]);
EXPECT_STREQ("ERROR", srs_log_level_strings[SrsLogLevelError]);
EXPECT_STREQ("OFF", srs_log_level_strings[SrsLogLevelDisabled]);
#else
EXPECT_STREQ("Forb", 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("Off", srs_log_level_strings[SrsLogLevelDisabled]);
#endif
}
VOID TEST(KernelLogTest, LogLevelStringV2)
{
EXPECT_EQ(srs_get_log_level("verbose"), SrsLogLevelVerbose);
EXPECT_EQ(srs_get_log_level("info"), SrsLogLevelInfo);
EXPECT_EQ(srs_get_log_level("trace"), SrsLogLevelTrace);
EXPECT_EQ(srs_get_log_level("warn"), SrsLogLevelWarn);
EXPECT_EQ(srs_get_log_level("error"), SrsLogLevelError);
EXPECT_EQ(srs_get_log_level("off"), SrsLogLevelDisabled);
EXPECT_EQ(srs_get_log_level_v2("trace"), SrsLogLevelVerbose);
EXPECT_EQ(srs_get_log_level_v2("debug"), SrsLogLevelInfo);
EXPECT_EQ(srs_get_log_level_v2("info"), SrsLogLevelTrace);
EXPECT_EQ(srs_get_log_level_v2("warn"), SrsLogLevelWarn);
EXPECT_EQ(srs_get_log_level_v2("error"), SrsLogLevelError);
EXPECT_EQ(srs_get_log_level_v2("off"), SrsLogLevelDisabled);
}