LOG configuration is changed.

We'll juse file log as a default log.
Older logger name is changed socket logger and default configuration is
disabled
This commit is contained in:
Sukchan Lee 2017-10-29 10:22:22 +00:00
parent 2d1983cfb0
commit baf6af79d6
16 changed files with 297 additions and 89 deletions

View File

@ -43,7 +43,7 @@ install-data-hook:
$(MKDIR_P) $(DESTDIR)/$(localstatedir)/run/nextepc-hssd
$(MKDIR_P) $(DESTDIR)/$(localstatedir)/run/nextepc-epcd
CLEANFILES = symtbl.c
CLEANFILES = -R data
DISTCLEANFILES = $(DIST_ARCHIVES)
MAINTAINERCLEANFILES = \
configure config.in \

2
debian/control vendored
View File

@ -69,7 +69,7 @@ Multi-Arch: same
Depends: ${shlibs:Depends},
${misc:Depends},
nextepc-core (= ${binary:Version}),
iproute2
ifupdown
Description: Open Source based 3GPP EPC PGW (Packet Data Network Gateway)
NextEPC is a C-language Open Source implementation of the 3GPP Evolved
Packet Core, i.e. the core network of an LTE network.

View File

@ -21,9 +21,7 @@ set -e
case "$1" in
configure)
if ! grep "pgwtun" /proc/net/dev > /dev/null; then
ip tuntap add name pgwtun mode tun
ip addr add 45.45.0.1/16 dev pgwtun
ip link set pgwtun up
ifup pgwtun
fi
;;

View File

@ -110,6 +110,8 @@ status_t context_parse_config()
d_assert(config, return CORE_ERROR, );
self.log.console = -1;
if (!bson_iter_init(&iter, config->bson))
{
d_error("bson_iter_init failed in this document");
@ -129,10 +131,15 @@ status_t context_parse_config()
while(bson_iter_next(&child1_iter))
{
const char *child1_key = bson_iter_key(&child1_iter);
if (!strcmp(child1_key, "FILE") &&
if (!strcmp(child1_key, "CONSOLE") &&
BSON_ITER_HOLDS_INT32(&child1_iter))
{
self.log.console = bson_iter_int32(&child1_iter);
}
else if (!strcmp(child1_key, "SYSLOG") &&
BSON_ITER_HOLDS_UTF8(&child1_iter))
{
self.log.file = bson_iter_utf8(&child1_iter, &length);
self.log.syslog = bson_iter_utf8(&child1_iter, &length);
}
else if (!strcmp(child1_key, "SOCKET") &&
BSON_ITER_HOLDS_DOCUMENT(&iter))
@ -154,7 +161,11 @@ status_t context_parse_config()
bson_iter_utf8(&child2_iter, &length);
}
}
}
else if (!strcmp(child1_key, "FILE") &&
BSON_ITER_HOLDS_UTF8(&child1_iter))
{
self.log.file = bson_iter_utf8(&child1_iter, &length);
}
}
}

View File

@ -30,11 +30,13 @@ typedef struct _context_t {
void *database;
struct {
const char *file;
int console;
const char *syslog;
struct {
const char *unix_domain;
const char *file;
} socket;
const char *file;
} log;
struct {

View File

@ -26,8 +26,10 @@ extern int g_trace_mask;
#define D_MSG_TO_STDOUT 0x00000002
#define D_MSG_TO_SYSLOG 0x00000004
#define D_MSG_TO_SOCKET 0x00000008
#define D_MSG_TO_FILE 0x00000010
#define D_MSG_TO_ALL (D_MSG_TO_CONSOLE | D_MSG_TO_STDOUT | \
D_MSG_TO_SYSLOG | D_MSG_TO_SOCKET)
D_MSG_TO_SYSLOG | D_MSG_TO_SOCKET | \
D_MSG_TO_FILE )
#define D_LOG_LEVEL_NONE 0
#define D_LOG_LEVEL_FATAL 1
@ -138,12 +140,17 @@ CORE_DECLARE(int) d_msg(int tp, int lv, c_time_t t, char *fn, int ln,
expr; \
}
void d_msg_register_syslog(const char *name);
void d_msg_deregister_syslog();
void d_msg_register_socket(const char *name, const char *log_file);
void d_msg_deregister_socket();
void d_msg_register_console(int console_fd);
void d_msg_deregister_console();
status_t d_msg_console_init(int console_fd);
void d_msg_console_final();
void d_msg_syslog_init(const char *name);
void d_msg_syslog_final();
status_t d_msg_socket_init(const char *name);
void d_msg_socket_final();
status_t d_msg_socket_start(const char *file);
void d_msg_socket_stop();
void d_msg_socket_final();
status_t d_msg_file_init(const char *file);
void d_msg_file_final();
void d_msg_to(int to, int on_off);

View File

@ -15,11 +15,13 @@ int g_msg_to = D_MSG_TO_STDOUT;
int g_console_connected = 0;
int g_syslog_connected = 0;
int g_socket_connected = 0;
int g_file_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_socket = D_LOG_LEVEL_FULL;
int g_log_level_file = D_LOG_LEVEL_FULL;
static int g_console_fd = -1;
static int g_socket_fd = -1;
@ -29,7 +31,26 @@ static thread_id socket_thread = 0;
static void *THREAD_FUNC socket_main(thread_id id, void *data);
static int socket_handler(const char *path);
void d_msg_register_syslog(const char *name)
static file_t *g_file = NULL;
status_t d_msg_console_init(int console_fd)
{
d_assert(console_fd >= 0, return CORE_ERROR,
"param 'console_fd' is invalid");
g_console_fd = console_fd;
g_console_connected = 1;
return CORE_OK;
}
void d_msg_console_final()
{
g_console_connected = 0;
g_console_fd = -1;
}
void d_msg_syslog_init(const char *name)
{
d_assert(name, return, );
@ -37,39 +58,53 @@ void d_msg_register_syslog(const char *name)
g_syslog_connected = 1;
}
void d_msg_deregister_syslog()
void d_msg_syslog_final()
{
g_syslog_connected = 0;
closelog();
}
void d_msg_register_socket(const char *name, const char *log_file)
status_t d_msg_socket_init(const char *name)
{
status_t rv;
d_assert(name, return, );
d_assert(name, return CORE_ERROR, );
g_socket_fd = socket(AF_UNIX, SOCK_DGRAM, 0);
d_assert(g_socket_fd >= 0, return,
d_assert(g_socket_fd >= 0, return CORE_ERROR,
"socket() failed. (%d:%s)\n", errno, strerror(errno));
g_socket_addr.sun_family = AF_UNIX;
strcpy(g_socket_addr.sun_path, name);
rv = thread_create(&socket_thread, NULL, socket_main, (void*)log_file);
d_assert(rv == CORE_OK, return, "socket thread creation failed");
return CORE_OK;
}
status_t d_msg_socket_start(const char *file)
{
status_t rv;
d_assert(file, return CORE_ERROR, );
rv = thread_create(&socket_thread, NULL, socket_main, (void*)file);
d_assert(rv == CORE_OK, return CORE_ERROR,
"socket thread creation failed");
g_socket_connected = 1;
d_msg_to(D_MSG_TO_SOCKET, 1);
return CORE_OK;
}
void d_msg_deregister_socket()
void d_msg_socket_stop()
{
d_msg_to(D_MSG_TO_SOCKET, 0);
g_socket_connected = 0;
thread_delete(socket_thread);
if (socket_thread)
thread_delete(socket_thread);
}
void d_msg_socket_final()
{
close(g_socket_fd);
g_socket_fd = -1;
}
@ -99,7 +134,7 @@ static int socket_handler(const char *path)
fd_set readfd;
struct timeval timer_val;
struct sockaddr_un svaddr;
file_t *g_file = NULL;
file_t *file = NULL;
char g_buffer[1024];
us = socket(AF_UNIX, SOCK_DGRAM, 0);
@ -136,7 +171,7 @@ static int socket_handler(const char *path)
}
}
rv = file_open(&g_file, path,
rv = file_open(&file, path,
FILE_CREATE | FILE_WRITE| FILE_APPEND,
FILE_UREAD | FILE_UWRITE | FILE_GREAD);
if (rv != CORE_OK)
@ -180,7 +215,7 @@ static int socket_handler(const char *path)
continue;
nbytes = r;
rv = file_write(g_file, g_buffer, &nbytes);
rv = file_write(file, g_buffer, &nbytes);
if (rv != CORE_OK || r != nbytes)
{
d_error("Cannot write %ld bytes to log file (%ld written)",
@ -189,7 +224,7 @@ static int socket_handler(const char *path)
}
}
file_close(g_file);
file_close(file);
close(us);
@ -198,18 +233,33 @@ static int socket_handler(const char *path)
return 0;
}
void d_msg_register_console(int console_fd)
status_t d_msg_file_init(const char *file)
{
d_assert(console_fd >= 0, return, "param 'console_fd' is invalid");
status_t rv;
g_console_fd = console_fd;
g_console_connected = 1;
d_assert(file, return CORE_ERROR, );
rv = file_open(&g_file, file,
FILE_CREATE | FILE_WRITE| FILE_APPEND,
FILE_UREAD | FILE_UWRITE | FILE_GREAD);
if (rv != CORE_OK)
{
d_error("Cannot open log file '%s'", file);
return CORE_ERROR;
}
g_file_connected = 1;
d_msg_to(D_MSG_TO_FILE, 1);
return CORE_OK;
}
void d_msg_deregister_console()
void d_msg_file_final()
{
g_console_connected = 0;
g_console_fd = -1;
d_msg_to(D_MSG_TO_FILE, 0);
g_file_connected = 0;
file_close(g_file);
}
void d_msg_to(int to, int on_off)
@ -236,6 +286,11 @@ void d_msg_to(int to, int on_off)
g_msg_to | D_MSG_TO_SOCKET :
g_msg_to & ~D_MSG_TO_SOCKET;
break;
case D_MSG_TO_FILE:
g_msg_to = on_off ?
g_msg_to | D_MSG_TO_FILE :
g_msg_to & ~D_MSG_TO_FILE;
break;
case D_MSG_TO_ALL:
g_msg_to = on_off ? D_MSG_TO_ALL : 0;
break;
@ -265,6 +320,9 @@ void d_log_set_level(int to, int level)
case D_MSG_TO_SOCKET:
g_log_level_socket = level;
break;
case D_MSG_TO_FILE:
g_log_level_socket = level;
break;
case D_MSG_TO_ALL:
g_log_level_console = level;
g_log_level_stdout = level;
@ -288,6 +346,8 @@ int d_log_get_level(int to)
return g_log_level_syslog;
case D_MSG_TO_SOCKET:
return g_log_level_socket;
case D_MSG_TO_FILE:
return g_log_level_socket;
default:
break;
}
@ -311,6 +371,9 @@ void d_log_full(int to)
case D_MSG_TO_SOCKET:
g_log_level_socket = D_LOG_LEVEL_FULL;
break;
case D_MSG_TO_FILE:
g_log_level_socket = 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;
@ -338,6 +401,9 @@ void d_log_off(int to)
case D_MSG_TO_SOCKET:
g_log_level_socket = D_LOG_LEVEL_NONE;
break;
case D_MSG_TO_FILE:
g_log_level_socket = 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;
@ -436,6 +502,11 @@ int d_msg(int tp, int lv, c_time_t t, char *fn, int ln, char *fmt, ...)
sendto(g_socket_fd, fstr, n, 0,
(struct sockaddr *)&g_socket_addr, sizeof(g_socket_addr));
}
if (g_file_connected && (g_msg_to & D_MSG_TO_FILE))
{
size_t nbytes = n;
file_write(g_file, fstr, &nbytes);
}
if (g_console_connected && (g_msg_to & D_MSG_TO_CONSOLE))
{
if (fstr[n-1] == '\n')
@ -463,6 +534,11 @@ int d_msg(int tp, int lv, c_time_t t, char *fn, int ln, char *fmt, ...)
sendto(g_socket_fd, fstr, n, 0,
(struct sockaddr *)&g_socket_addr, sizeof(g_socket_addr));
}
if (g_file_connected && (g_msg_to & D_MSG_TO_FILE))
{
size_t nbytes = n;
file_write(g_file, fstr, &nbytes);
}
if (g_console_connected && (g_msg_to & D_MSG_TO_CONSOLE))
{
if (fstr[n-1] == '\n')
@ -508,6 +584,14 @@ int d_msg(int tp, int lv, c_time_t t, char *fn, int ln, char *fmt, ...)
sendto(g_socket_fd, fstr, n, 0,
(struct sockaddr *)&g_socket_addr, sizeof(g_socket_addr));
}
if (g_file_connected && (g_msg_to & D_MSG_TO_FILE))
{
size_t nbytes;
fstr[n++] = '\n';
nbytes = n;
file_write(g_file, fstr, &nbytes);
}
if (g_console_connected && (g_msg_to & D_MSG_TO_CONSOLE) &&
lv <= g_log_level_console)
{
@ -538,6 +622,14 @@ int d_msg(int tp, int lv, c_time_t t, char *fn, int ln, char *fmt, ...)
sendto(g_socket_fd, fstr, n, 0,
(struct sockaddr *)&g_socket_addr, sizeof(g_socket_addr));
}
if (g_file_connected && (g_msg_to & D_MSG_TO_FILE))
{
size_t nbytes;
fstr[n++] = '\n';
nbytes = n;
file_write(g_file, fstr, &nbytes);
}
if (g_console_connected && (g_msg_to & D_MSG_TO_CONSOLE))
{
fstr[n++] = '\r'; /* fstr[n++] = '\n'; FIXME: */

2
main.c
View File

@ -49,7 +49,7 @@ static int check_signal(int signum)
case SIGHUP:
{
d_info("SIGHUP received");
logger_restart();
app_logger_restart();
break;
}
case SIGUSR1:

View File

@ -21,7 +21,7 @@ CORE_DECLARE(void) app_did_terminate(void);
CORE_DECLARE(status_t) config_initialize(char *config_path);
CORE_DECLARE(void) config_terminate(void);
CORE_DECLARE(status_t) logger_restart(void);
CORE_DECLARE(status_t) app_logger_restart(void);
CORE_DECLARE(status_t) app_log_pid(const char *file);
CORE_DECLARE(status_t) mme_initialize();

View File

@ -11,8 +11,10 @@
#define DEFAULT_RUNTIME_DIR_PATH LOCALSTATE_DIR "run/"
#define DEFAULT_CONFIG_FILE_PATH SYSCONF_DIR PACKAGE "/nextepc.conf"
status_t app_socket_log_start();
status_t app_socket_log_stop();
static status_t app_logger_init();
static status_t app_logger_final();
static status_t app_logger_start();
static status_t app_logger_stop();
status_t app_will_initialize(char *config_path, char *log_path)
{
@ -36,6 +38,9 @@ status_t app_will_initialize(char *config_path, char *log_path)
{
d_trace_level(&_app_init, others);
}
rv = app_logger_init();
if (rv != CORE_OK) return rv;
if (context_self()->db_uri)
{
@ -48,14 +53,15 @@ status_t app_will_initialize(char *config_path, char *log_path)
status_t app_did_initialize(char *config_path, char *log_path)
{
app_socket_log_start();
status_t rv = app_logger_start();
if (rv != CORE_OK) return rv;
return CORE_OK;
}
void app_will_terminate(void)
{
app_socket_log_stop();
app_logger_stop();
}
void app_did_terminate(void)
@ -65,42 +71,11 @@ void app_did_terminate(void)
context_db_final();
}
app_logger_final();
context_final();
}
status_t app_socket_log_start()
{
if (context_self()->log.socket.file &&
context_self()->log.socket.unix_domain)
{
d_msg_register_socket(
context_self()->log.socket.unix_domain,
context_self()->log.socket.file);
d_print(" Logging '%s'\n", context_self()->log.socket.file);
}
return CORE_OK;
}
status_t app_socket_log_stop()
{
if (context_self()->log.socket.file &&
context_self()->log.socket.unix_domain)
{
d_msg_deregister_socket();
}
return CORE_OK;
}
status_t logger_restart()
{
app_socket_log_stop();
app_socket_log_start();
return CORE_OK;
}
status_t app_log_pid(const char *name)
{
file_t *pid_file = NULL;
@ -137,3 +112,120 @@ status_t app_log_pid(const char *name)
return CORE_OK;
}
status_t app_logger_restart()
{
app_logger_stop();
app_logger_final();
app_logger_init();
app_logger_start();
return CORE_OK;
}
static status_t app_logger_init()
{
status_t rv;
if (context_self()->log.console >= 0)
{
rv = d_msg_console_init(context_self()->log.console);
if (rv != CORE_OK)
{
d_error("console logger init failed : (file:%d)",
context_self()->log.console);
return rv;
}
d_print(" Console Logging '%d'\n", context_self()->log.console);
}
if (context_self()->log.syslog)
{
d_msg_syslog_init(context_self()->log.syslog);
d_print(" Syslog Logging '%s'\n", context_self()->log.syslog);
}
if (context_self()->log.socket.file &&
context_self()->log.socket.unix_domain)
{
rv = d_msg_socket_init(context_self()->log.socket.unix_domain);
if (rv != CORE_OK)
{
d_error("socket logger init failed : (unix_domain:%s, file:%s)",
context_self()->log.socket.unix_domain,
context_self()->log.socket.file);
return rv;
}
d_print(" Socket Logging '%s' on %s\n",
context_self()->log.socket.file,
context_self()->log.socket.unix_domain);
}
if (context_self()->log.file)
{
rv = d_msg_file_init(context_self()->log.file);
if (rv != CORE_OK)
{
d_error("file logger init failed : (file:%s)",
context_self()->log.file);
return rv;
}
d_print(" File Logging '%s'\n", context_self()->log.file);
}
return CORE_OK;
}
static status_t app_logger_start()
{
status_t rv;
if (context_self()->log.socket.file &&
context_self()->log.socket.unix_domain)
{
rv = d_msg_socket_start(context_self()->log.socket.file);
if (rv != CORE_OK)
{
d_error("socket logger start failed : (unix_domain:%s, file:%s)",
context_self()->log.socket.unix_domain,
context_self()->log.socket.file);
return rv;
}
}
return CORE_OK;
}
static status_t app_logger_stop()
{
if (context_self()->log.socket.file &&
context_self()->log.socket.unix_domain)
{
d_msg_socket_stop();
}
return CORE_OK;
}
static status_t app_logger_final()
{
if (context_self()->log.console >= 0)
{
d_msg_console_final();
}
if (context_self()->log.syslog)
{
d_msg_syslog_final();
}
if (context_self()->log.socket.file &&
context_self()->log.socket.unix_domain)
{
d_msg_socket_final();
}
if (context_self()->log.file)
{
d_msg_file_final();
}
return CORE_OK;
}

View File

@ -2,10 +2,11 @@
"DB_URI" : "mongodb://localhost/nextepc",
"LOG" :
{
"FILE" : "@LOCALSTATE_DIR@/log/nextepc/hss.log",
"SOCKET" :
{
"FILE" : "@LOCALSTATE_DIR@/log/nextepc/hss.log",
"UNIX_DOMAIN" : "/tmp/nextepc-hssd.sock"
"UNIX_DOMAIN" : "/tmp/nextepc-hssd.sock",
"FILE" : 0
}
},
"TRACE" :

View File

@ -1,10 +1,11 @@
{
"LOG" :
{
"FILE" : "@LOCALSTATE_DIR@/log/nextepc/mme.log",
"SOCKET" :
{
"FILE" : "@LOCALSTATE_DIR@/log/nextepc/mme.log",
"UNIX_DOMAIN" : "/tmp/nextepc-mmed.sock"
"UNIX_DOMAIN" : "/tmp/nextepc-mmed.sock",
"FILE" : 0
}
},
"TRACE" :

View File

@ -2,10 +2,11 @@
"DB_URI" : "mongodb://localhost/nextepc",
"LOG" :
{
"FILE" : "@LOCALSTATE_DIR@/log/nextepc/nextepc.log",
"SOCKET" :
{
"FILE" : "@LOCALSTATE_DIR@/log/nextepc/nextepc.log",
"UNIX_DOMAIN" : "/tmp/nextepc-epcd.sock"
"UNIX_DOMAIN" : "/tmp/nextepc-epcd.sock",
"FILE" : 0
}
},
"TRACE" :

View File

@ -2,10 +2,11 @@
"DB_URI" : "mongodb://localhost/nextepc",
"LOG" :
{
"FILE" : "@LOCALSTATE_DIR@/log/nextepc/pcrf.log",
"SOCKET" :
{
"FILE" : "@LOCALSTATE_DIR@/log/nextepc/pcrf.log",
"UNIX_DOMAIN" : "/tmp/nextepc-pcrfd.sock"
"UNIX_DOMAIN" : "/tmp/nextepc-pcrfd.sock",
"FILE" : 0
}
},
"TRACE" :

View File

@ -1,10 +1,11 @@
{
"LOG" :
{
"FILE" : "@LOCALSTATE_DIR@/log/nextepc/pgw.log",
"SOCKET" :
{
"FILE" : "@LOCALSTATE_DIR@/log/nextepc/pgw.log",
"UNIX_DOMAIN" : "/tmp/nextepc-pgwd.sock"
"UNIX_DOMAIN" : "/tmp/nextepc-pgwd.sock",
"FILE" : 0
}
},
"TRACE" :

View File

@ -1,10 +1,11 @@
{
"LOG" :
{
"FILE" : "@LOCALSTATE_DIR@/log/nextepc/sgw.log",
"SOCKET" :
{
"FILE" : "@LOCALSTATE_DIR@/log/nextepc/sgw.log",
"UNIX_DOMAIN" : "/tmp/nextepc-sgwd.sock"
"UNIX_DOMAIN" : "/tmp/nextepc-sgwd.sock",
"FILE" : 0
}
},
"TRACE" :