2017-03-26 02:16:21 +00:00
|
|
|
/**
|
|
|
|
* The MIT License (MIT)
|
|
|
|
*
|
2019-12-30 02:10:35 +00:00
|
|
|
* Copyright (c) 2013-2020 Winlin
|
2017-03-26 02:16:21 +00:00
|
|
|
*
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
|
|
* this software and associated documentation files (the "Software"), to deal in
|
|
|
|
* the Software without restriction, including without limitation the rights to
|
|
|
|
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
|
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
|
|
|
* subject to the following conditions:
|
|
|
|
*
|
|
|
|
* The above copyright notice and this permission notice shall be included in all
|
|
|
|
* copies or substantial portions of the Software.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
|
|
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
|
|
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
|
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
|
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <srs_service_log.hpp>
|
|
|
|
|
|
|
|
#include <stdarg.h>
|
|
|
|
#include <sys/time.h>
|
2017-05-30 01:05:02 +00:00
|
|
|
#include <unistd.h>
|
2020-06-18 03:45:43 +00:00
|
|
|
#include <sstream>
|
2017-03-26 02:16:21 +00:00
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
#include <srs_kernel_error.hpp>
|
|
|
|
#include <srs_kernel_utility.hpp>
|
2020-07-09 08:51:20 +00:00
|
|
|
#include <srs_protocol_utility.hpp>
|
2017-03-26 02:16:21 +00:00
|
|
|
|
2020-07-12 11:52:03 +00:00
|
|
|
#define SRS_BASIC_LOG_SIZE 8192
|
2017-03-26 02:16:21 +00:00
|
|
|
|
|
|
|
SrsThreadContext::SrsThreadContext()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
SrsThreadContext::~SrsThreadContext()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2020-07-05 15:26:55 +00:00
|
|
|
SrsContextId SrsThreadContext::generate_id()
|
2017-03-26 02:16:21 +00:00
|
|
|
{
|
2020-07-09 08:51:20 +00:00
|
|
|
SrsContextId cid = SrsContextId(srs_random_str(8));
|
2020-07-05 15:26:55 +00:00
|
|
|
return cid;
|
2017-03-26 02:16:21 +00:00
|
|
|
}
|
|
|
|
|
2020-07-13 03:19:34 +00:00
|
|
|
const SrsContextId& SrsThreadContext::get_id()
|
2017-03-26 02:16:21 +00:00
|
|
|
{
|
2017-05-30 01:05:02 +00:00
|
|
|
return cache[srs_thread_self()];
|
2017-03-26 02:16:21 +00:00
|
|
|
}
|
|
|
|
|
2020-07-13 03:19:34 +00:00
|
|
|
const SrsContextId& SrsThreadContext::set_id(const SrsContextId& v)
|
2017-03-26 02:16:21 +00:00
|
|
|
{
|
2017-05-30 01:05:02 +00:00
|
|
|
srs_thread_t self = srs_thread_self();
|
2020-07-13 03:19:34 +00:00
|
|
|
|
|
|
|
if (cache.find(self) == cache.end()) {
|
|
|
|
cache[self] = v;
|
|
|
|
return v;
|
2017-03-26 02:16:21 +00:00
|
|
|
}
|
2020-07-13 03:19:34 +00:00
|
|
|
|
|
|
|
const SrsContextId& ov = cache[self];
|
2017-03-26 02:16:21 +00:00
|
|
|
cache[self] = v;
|
|
|
|
return ov;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SrsThreadContext::clear_cid()
|
|
|
|
{
|
2017-05-30 01:05:02 +00:00
|
|
|
srs_thread_t self = srs_thread_self();
|
2020-07-05 15:26:55 +00:00
|
|
|
std::map<srs_thread_t, SrsContextId>::iterator it = cache.find(self);
|
2017-03-26 02:16:21 +00:00
|
|
|
if (it != cache.end()) {
|
|
|
|
cache.erase(it);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-01-08 06:24:41 +00:00
|
|
|
// LCOV_EXCL_START
|
2017-03-26 02:16:21 +00:00
|
|
|
SrsConsoleLog::SrsConsoleLog(SrsLogLevel l, bool u)
|
|
|
|
{
|
|
|
|
level = l;
|
|
|
|
utc = u;
|
|
|
|
|
|
|
|
buffer = new char[SRS_BASIC_LOG_SIZE];
|
|
|
|
}
|
|
|
|
|
|
|
|
SrsConsoleLog::~SrsConsoleLog()
|
|
|
|
{
|
|
|
|
srs_freepa(buffer);
|
|
|
|
}
|
|
|
|
|
2017-06-11 06:03:19 +00:00
|
|
|
srs_error_t SrsConsoleLog::initialize()
|
2017-03-26 02:16:21 +00:00
|
|
|
{
|
2017-06-11 06:03:19 +00:00
|
|
|
return srs_success;
|
2017-03-26 02:16:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void SrsConsoleLog::reopen()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2020-07-05 15:26:55 +00:00
|
|
|
void SrsConsoleLog::verbose(const char* tag, SrsContextId context_id, const char* fmt, ...)
|
2017-03-26 02:16:21 +00:00
|
|
|
{
|
|
|
|
if (level > SrsLogLevelVerbose) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
int size = 0;
|
|
|
|
if (!srs_log_header(buffer, SRS_BASIC_LOG_SIZE, utc, false, tag, context_id, "Verb", &size)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
va_list ap;
|
|
|
|
va_start(ap, fmt);
|
|
|
|
// we reserved 1 bytes for the new line.
|
|
|
|
size += vsnprintf(buffer + size, SRS_BASIC_LOG_SIZE - size, fmt, ap);
|
|
|
|
va_end(ap);
|
|
|
|
|
2017-03-26 09:18:34 +00:00
|
|
|
fprintf(stdout, "%s\n", buffer);
|
2017-03-26 02:16:21 +00:00
|
|
|
}
|
|
|
|
|
2020-07-05 15:26:55 +00:00
|
|
|
void SrsConsoleLog::info(const char* tag, SrsContextId context_id, const char* fmt, ...)
|
2017-03-26 02:16:21 +00:00
|
|
|
{
|
|
|
|
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);
|
|
|
|
// we reserved 1 bytes for the new line.
|
|
|
|
size += vsnprintf(buffer + size, SRS_BASIC_LOG_SIZE - size, fmt, ap);
|
|
|
|
va_end(ap);
|
|
|
|
|
2017-03-26 09:18:34 +00:00
|
|
|
fprintf(stdout, "%s\n", buffer);
|
2017-03-26 02:16:21 +00:00
|
|
|
}
|
|
|
|
|
2020-07-05 15:26:55 +00:00
|
|
|
void SrsConsoleLog::trace(const char* tag, SrsContextId context_id, const char* fmt, ...)
|
2017-03-26 02:16:21 +00:00
|
|
|
{
|
|
|
|
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);
|
|
|
|
// we reserved 1 bytes for the new line.
|
|
|
|
size += vsnprintf(buffer + size, SRS_BASIC_LOG_SIZE - size, fmt, ap);
|
|
|
|
va_end(ap);
|
|
|
|
|
2017-03-26 09:18:34 +00:00
|
|
|
fprintf(stdout, "%s\n", buffer);
|
2017-03-26 02:16:21 +00:00
|
|
|
}
|
|
|
|
|
2020-07-05 15:26:55 +00:00
|
|
|
void SrsConsoleLog::warn(const char* tag, SrsContextId context_id, const char* fmt, ...)
|
2017-03-26 02:16:21 +00:00
|
|
|
{
|
|
|
|
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);
|
|
|
|
// we reserved 1 bytes for the new line.
|
|
|
|
size += vsnprintf(buffer + size, SRS_BASIC_LOG_SIZE - size, fmt, ap);
|
|
|
|
va_end(ap);
|
|
|
|
|
2017-03-26 09:18:34 +00:00
|
|
|
fprintf(stderr, "%s\n", buffer);
|
2017-03-26 02:16:21 +00:00
|
|
|
}
|
|
|
|
|
2020-07-05 15:26:55 +00:00
|
|
|
void SrsConsoleLog::error(const char* tag, SrsContextId context_id, const char* fmt, ...)
|
2017-03-26 02:16:21 +00:00
|
|
|
{
|
|
|
|
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);
|
|
|
|
// we reserved 1 bytes for the new line.
|
|
|
|
size += vsnprintf(buffer + size, SRS_BASIC_LOG_SIZE - size, fmt, ap);
|
|
|
|
va_end(ap);
|
|
|
|
|
|
|
|
// add strerror() to error msg.
|
|
|
|
if (errno != 0) {
|
|
|
|
size += snprintf(buffer + size, SRS_BASIC_LOG_SIZE - size, "(%s)", strerror(errno));
|
|
|
|
}
|
|
|
|
|
2017-03-26 09:18:34 +00:00
|
|
|
fprintf(stderr, "%s\n", buffer);
|
2017-03-26 02:16:21 +00:00
|
|
|
}
|
2020-01-08 06:24:41 +00:00
|
|
|
// LCOV_EXCL_STOP
|
2017-03-26 02:16:21 +00:00
|
|
|
|
2020-07-05 15:26:55 +00:00
|
|
|
bool srs_log_header(char* buffer, int size, bool utc, bool dangerous, const char* tag, SrsContextId cid, const char* level, int* psize)
|
2017-03-26 02:16:21 +00:00
|
|
|
{
|
|
|
|
// clock time
|
|
|
|
timeval tv;
|
|
|
|
if (gettimeofday(&tv, NULL) == -1) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// to calendar time
|
|
|
|
struct tm* tm;
|
|
|
|
if (utc) {
|
|
|
|
if ((tm = gmtime(&tv.tv_sec)) == NULL) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if ((tm = localtime(&tv.tv_sec)) == NULL) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-05-31 05:52:21 +00:00
|
|
|
int written = -1;
|
2017-03-26 02:16:21 +00:00
|
|
|
if (dangerous) {
|
|
|
|
if (tag) {
|
2017-05-31 05:52:21 +00:00
|
|
|
written = snprintf(buffer, size,
|
2020-06-18 03:45:43 +00:00
|
|
|
"[%d-%02d-%02d %02d:%02d:%02d.%03d][%s][%s][%d][%s][%d] ",
|
2017-03-26 02:16:21 +00:00
|
|
|
1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, (int)(tv.tv_usec / 1000),
|
2020-07-05 15:26:55 +00:00
|
|
|
level, tag, getpid(), cid.c_str(), errno);
|
2017-03-26 02:16:21 +00:00
|
|
|
} else {
|
2017-05-31 05:52:21 +00:00
|
|
|
written = snprintf(buffer, size,
|
2020-06-18 03:45:43 +00:00
|
|
|
"[%d-%02d-%02d %02d:%02d:%02d.%03d][%s][%d][%s][%d] ",
|
2017-03-26 02:16:21 +00:00
|
|
|
1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, (int)(tv.tv_usec / 1000),
|
2020-07-05 15:26:55 +00:00
|
|
|
level, getpid(), cid.c_str(), errno);
|
2017-03-26 02:16:21 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (tag) {
|
2017-05-31 05:52:21 +00:00
|
|
|
written = snprintf(buffer, size,
|
2020-06-18 03:45:43 +00:00
|
|
|
"[%d-%02d-%02d %02d:%02d:%02d.%03d][%s][%s][%d][%s] ",
|
2017-03-26 02:16:21 +00:00
|
|
|
1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, (int)(tv.tv_usec / 1000),
|
2020-07-05 15:26:55 +00:00
|
|
|
level, tag, getpid(), cid.c_str());
|
2017-03-26 02:16:21 +00:00
|
|
|
} else {
|
2017-05-31 05:52:21 +00:00
|
|
|
written = snprintf(buffer, size,
|
2020-06-18 03:45:43 +00:00
|
|
|
"[%d-%02d-%02d %02d:%02d:%02d.%03d][%s][%d][%s] ",
|
2017-03-26 02:16:21 +00:00
|
|
|
1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, (int)(tv.tv_usec / 1000),
|
2020-07-05 15:26:55 +00:00
|
|
|
level, getpid(), cid.c_str());
|
2017-03-26 02:16:21 +00:00
|
|
|
}
|
|
|
|
}
|
2019-12-11 03:56:00 +00:00
|
|
|
|
|
|
|
// Exceed the size, ignore this log.
|
|
|
|
// Check size to avoid security issue https://github.com/ossrs/srs/issues/1229
|
|
|
|
if (written >= size) {
|
|
|
|
return false;
|
|
|
|
}
|
2017-03-26 02:16:21 +00:00
|
|
|
|
2017-05-31 05:52:21 +00:00
|
|
|
if (written == -1) {
|
2017-03-26 02:16:21 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// write the header size.
|
2017-05-31 05:52:21 +00:00
|
|
|
*psize = written;
|
2017-03-26 02:16:21 +00:00
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|