open5gs/lib/core/src/debug.c

406 lines
11 KiB
C

#include "core_debug.h"
#include "core_param.h"
#include "core_file.h"
#include <syslog.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
int g_trace_mask = 1;
int g_msg_to = D_MSG_TO_LOGD | D_MSG_TO_STDOUT;
int g_console_connected = 0;
int g_syslog_connected = 0;
int g_logd_connected = 0;
int g_log_level_console = D_LOG_LEVEL_FULL;
int g_log_level_stdout = D_LOG_LEVEL_FULL;
int g_log_level_syslog = D_LOG_LEVEL_FULL;
int g_log_level_logd = D_LOG_LEVEL_FULL;
int g_console_fd = -1;
int g_logd_fd = -1;
struct sockaddr_un g_logd_addr;
void d_msg_init()
{
openlog("wmcore", 0, LOG_DAEMON);
g_syslog_connected = 1;
g_logd_fd = socket(AF_UNIX, SOCK_DGRAM, 0);
d_assert(g_logd_fd >= 0, return,
"socket() failed. (%d:%s)\n", errno, strerror(errno));
g_logd_addr.sun_family = AF_UNIX;
strcpy(g_logd_addr.sun_path, D_LOGD_IPC_PATH);
g_logd_connected = 1;
}
void d_msg_final()
{
g_syslog_connected = 0;
closelog();
g_logd_connected = 0;
close(g_logd_fd);
g_logd_fd = -1;
}
void d_msg_register_console(int console_fd)
{
d_assert(console_fd >= 0, return, "param 'console_fd' is invalid");
g_console_fd = console_fd;
g_console_connected = 1;
}
void d_msg_deregister_console()
{
g_console_connected = 0;
g_console_fd = -1;
}
void d_msg_to(int to, int on_off)
{
switch (to)
{
case D_MSG_TO_CONSOLE:
g_msg_to = on_off ?
g_msg_to | D_MSG_TO_CONSOLE :
g_msg_to & ~D_MSG_TO_CONSOLE;
break;
case D_MSG_TO_STDOUT:
g_msg_to = on_off ?
g_msg_to | D_MSG_TO_STDOUT :
g_msg_to & ~D_MSG_TO_STDOUT;
break;
case D_MSG_TO_SYSLOG:
g_msg_to = on_off ?
g_msg_to | D_MSG_TO_SYSLOG :
g_msg_to & ~D_MSG_TO_SYSLOG;
break;
case D_MSG_TO_LOGD:
g_msg_to = on_off ?
g_msg_to | D_MSG_TO_LOGD :
g_msg_to & ~D_MSG_TO_LOGD;
break;
case D_MSG_TO_ALL:
g_msg_to = on_off ? D_MSG_TO_ALL : 0;
break;
default:
break;
}
}
int d_msg_get_to()
{
return g_msg_to;
}
void d_log_set_level(int to, int level)
{
switch (to)
{
case D_MSG_TO_CONSOLE:
g_log_level_console = level;
break;
case D_MSG_TO_STDOUT:
g_log_level_stdout = level;
break;
case D_MSG_TO_SYSLOG:
g_log_level_syslog = level;
break;
case D_MSG_TO_LOGD:
g_log_level_logd = level;
break;
case D_MSG_TO_ALL:
g_log_level_console = level;
g_log_level_stdout = level;
g_log_level_syslog = level;
g_log_level_logd = level;
break;
default:
break;
}
}
int d_log_get_level(int to)
{
switch (to)
{
case D_MSG_TO_CONSOLE:
return g_log_level_console;
case D_MSG_TO_STDOUT:
return g_log_level_stdout;
case D_MSG_TO_SYSLOG:
return g_log_level_syslog;
case D_MSG_TO_LOGD:
return g_log_level_logd;
default:
break;
}
return -1;
}
void d_log_full(int to)
{
switch (to)
{
case D_MSG_TO_CONSOLE:
g_log_level_console = D_LOG_LEVEL_FULL;
break;
case D_MSG_TO_STDOUT:
g_log_level_stdout = D_LOG_LEVEL_FULL;
break;
case D_MSG_TO_SYSLOG:
g_log_level_syslog = D_LOG_LEVEL_FULL;
break;
case D_MSG_TO_LOGD:
g_log_level_logd = D_LOG_LEVEL_FULL;
break;
case D_MSG_TO_ALL:
g_log_level_console = D_LOG_LEVEL_FULL;
g_log_level_stdout = D_LOG_LEVEL_FULL;
g_log_level_syslog = D_LOG_LEVEL_FULL;
g_log_level_logd = D_LOG_LEVEL_FULL;
break;
default:
break;
}
}
void d_log_off(int to)
{
switch (to)
{
case D_MSG_TO_CONSOLE:
g_log_level_console = D_LOG_LEVEL_NONE;
break;
case D_MSG_TO_STDOUT:
g_log_level_stdout = D_LOG_LEVEL_NONE;
break;
case D_MSG_TO_SYSLOG:
g_log_level_syslog = D_LOG_LEVEL_NONE;
break;
case D_MSG_TO_LOGD:
g_log_level_logd = D_LOG_LEVEL_NONE;
break;
case D_MSG_TO_ALL:
g_log_level_console = D_LOG_LEVEL_NONE;
g_log_level_stdout = D_LOG_LEVEL_NONE;
g_log_level_syslog = D_LOG_LEVEL_NONE;
g_log_level_logd = D_LOG_LEVEL_NONE;
break;
default:
break;
}
}
void d_trace_global_on()
{
g_trace_mask = 1;
}
void d_trace_global_off()
{
g_trace_mask = 0;
}
void d_trace_level(int *mod_name, int level)
{
*mod_name = level;
}
void d_trace_off(int *mod_name)
{
*mod_name = 0;
}
#define TA_NOR "\033[0m" /* all off */
#define TA_BOLD "\033[1m" /* bold */
#define TA_UNDER "\033[4m" /* underscore */
#define TA_BLINK "\033[5m" /* blink */
#define TA_REVERSE "\033[7m" /* reverse video */
#define TA_CONCEALED "\033[8m" /* concealed */
#define TA_FGC_BLACK "\033[30m" /* Black */
#define TA_FGC_RED "\033[31m" /* Red */
#define TA_FGC_GREEN "\033[32m" /* Green */
#define TA_FGC_YELLOW "\033[33m" /* Yellow */
#define TA_FGC_BLUE "\033[34m" /* Blue */
#define TA_FGC_MAGENTA "\033[35m" /* Magenta */
#define TA_FGC_CYAN "\033[36m" /* Cyan */
#define TA_FGC_WHITE "\033[37m" /* White */
#define TA_FGC_DEFAULT "\033[39m" /* default */
#define TA_BGC_BLACK "\033[40m" /* Black */
#define TA_BGC_RED "\033[41m" /* Red */
#define TA_BGC_GREEN "\033[42m" /* Green */
#define TA_BGC_YELLOW "\033[43m" /* Yellow */
#define TA_BGC_BLUE "\033[44m" /* Blue */
#define TA_BGC_MAGENTA "\033[45m" /* Magenta */
#define TA_BGC_CYAN "\033[46m" /* Cyan */
#define TA_BGC_WHITE "\033[47m" /* White */
#define TA_BGC_DEFAULT "\033[49m" /* default */
#define TIME_FMT_STR "%02d/%02d %02d:%02d:%02d.%03d"
#define TIME_FMT_STR2 "%02d.%06d"
#define TIME_FMT_STR3 "%04d/%02d/%02d %02d:%02d:%02d.%03d"
int d_msg(int tp, int lv, c_time_t t, char *fn, int ln, char *fmt, ...)
{
char str[384] = {0}, fstr[512] = {0}, *ac_str;
time_exp_t te;
size_t n;
char *lv_str[5] = {"NONE", "FATL", "ERRR", "WARN", "INFO"};
va_list args;
va_start(args, fmt);
if (t)
{
time_exp_lt(&te, t);
}
switch (tp)
{
case D_MSG_TYPE_RAW:
{
n = vsprintf(fstr, fmt, args);
if (g_msg_to & D_MSG_TO_STDOUT)
{
printf("%s", fstr);
}
if (g_syslog_connected && (g_msg_to & D_MSG_TO_SYSLOG))
{
syslog(LOG_DEBUG, "%s", fstr);
}
if (g_logd_connected && (g_msg_to & D_MSG_TO_LOGD))
{
sendto(g_logd_fd, fstr, n, 0,
(struct sockaddr *)&g_logd_addr, sizeof(g_logd_addr));
}
if (g_console_connected && (g_msg_to & D_MSG_TO_CONSOLE))
{
if (fstr[n-1] == '\n')
{
fstr[n-1] = '\r'; fstr[n++] = '\n';
}
write(g_console_fd, fstr, n);
}
break;
}
case D_MSG_TYPE_TRACE:
{
n = vsprintf(fstr, fmt, args);
if (g_msg_to & D_MSG_TO_STDOUT)
{
printf("%s", fstr);
}
if (g_syslog_connected && (g_msg_to & D_MSG_TO_SYSLOG))
{
syslog(LOG_DEBUG, "%s", fstr);
}
if (g_logd_connected && (g_msg_to & D_MSG_TO_LOGD))
{
sendto(g_logd_fd, fstr, n, 0,
(struct sockaddr *)&g_logd_addr, sizeof(g_logd_addr));
}
if (g_console_connected && (g_msg_to & D_MSG_TO_CONSOLE))
{
if (fstr[n-1] == '\n')
{
fstr[n-1] = '\r'; fstr[n++] = '\n';
}
write(g_console_fd, fstr, n);
}
break;
}
case D_MSG_TYPE_LOG:
{
switch(lv)
{
case D_LOG_LEVEL_INFO: ac_str = TA_FGC_WHITE; break;
case D_LOG_LEVEL_WARN: ac_str = TA_FGC_CYAN; break;
case D_LOG_LEVEL_ERROR: ac_str = TA_FGC_YELLOW; break;
case D_LOG_LEVEL_FATAL: ac_str = TA_FGC_RED; break;
default: ac_str = NULL; break;
}
vsprintf(str, fmt, args);
n = sprintf(fstr, "["TIME_FMT_STR"] %s: %s (%s:%d)",
te.tm_mon + 1, te.tm_mday, te.tm_hour,
te.tm_min, te.tm_sec, te.tm_usec/1000,
lv_str[lv], str, fn, ln);
if ((g_msg_to & D_MSG_TO_STDOUT) &&
lv <= g_log_level_stdout)
{
printf("%s%s" TA_NOR "\n", ac_str, fstr);
}
if (g_syslog_connected && (g_msg_to & D_MSG_TO_SYSLOG) &&
lv <= g_log_level_syslog)
{
syslog(LOG_INFO, "[%s\n", fstr + 13);
}
if (g_logd_connected && (g_msg_to & D_MSG_TO_LOGD) &&
lv <= g_log_level_logd)
{
fstr[n++] = '\n';
sendto(g_logd_fd, fstr, n, 0,
(struct sockaddr *)&g_logd_addr, sizeof(g_logd_addr));
}
if (g_console_connected && (g_msg_to & D_MSG_TO_CONSOLE) &&
lv <= g_log_level_console)
{
fstr[n++] = '\r'; /* fstr[n++] = '\n'; FIXME: */
write(g_console_fd, fstr, n);
}
break;
}
case D_MSG_TYPE_ASSERT:
{
vsprintf(str, fmt, args);
n = sprintf(fstr, "[" TIME_FMT_STR "] ASSERT: %s (%s:%d)",
te.tm_mon + 1, te.tm_mday, te.tm_hour,
te.tm_min, te.tm_sec, te.tm_usec/1000, str, fn, ln);
if (g_msg_to & D_MSG_TO_STDOUT)
{
printf(TA_BOLD TA_FGC_RED "%s" TA_NOR "\n", fstr);
}
if (g_syslog_connected && (g_msg_to & D_MSG_TO_SYSLOG))
{
syslog(LOG_CRIT, "[%s\n", fstr + 13);
}
if (g_logd_connected && (g_msg_to & D_MSG_TO_LOGD))
{
fstr[n++] = '\n';
sendto(g_logd_fd, fstr, n, 0,
(struct sockaddr *)&g_logd_addr, sizeof(g_logd_addr));
}
if (g_console_connected && (g_msg_to & D_MSG_TO_CONSOLE))
{
fstr[n++] = '\r'; /* fstr[n++] = '\n'; FIXME: */
write(g_console_fd, fstr, n);
}
break;
}
default:
break;
}
return CORE_OK;
}