log: add support for logging to syslog

This commit is contained in:
Charles Foster 2021-01-17 11:44:55 +01:00 committed by Sukru Senli
parent 08ec6f5c18
commit 4a4a8a4844
4 changed files with 61 additions and 8 deletions

View file

@ -283,6 +283,13 @@ int get_global_config(struct config *conf)
} else {
return error;
}
if ((error = uci_get_value(UCI_CPE_ENABLE_SYSLOG, &value)) == CWMP_OK) {
if (value != NULL) {
log_set_on_syslog(value);
free(value);
value = NULL;
}
}
if ((error = uci_get_value(UCI_CPE_PORT_PATH, &value)) == CWMP_OK) {
int a = 0;

View file

@ -42,6 +42,7 @@
#define UCI_CPE_LOG_MAX_SIZE "cwmp.cpe.log_max_size"
#define UCI_CPE_ENABLE_STDOUT_LOG "cwmp.cpe.log_to_console"
#define UCI_CPE_ENABLE_FILE_LOG "cwmp.cpe.log_to_file"
#define UCI_CPE_ENABLE_SYSLOG "cwmp.cpe.log_to_syslog"
#define UCI_CPE_AMD_VERSION "cwmp.cpe.amd_version"
#define UCI_CPE_INSTANCE_MODE "cwmp.cpe.instance_mode"
#define UCI_CPE_SESSION_TIMEOUT "cwmp.cpe.session_timeout"

View file

@ -37,6 +37,7 @@ int log_set_log_file_name(char *value);
int log_set_file_max_size(char *value);
int log_set_on_console(char *value);
int log_set_on_file(char *value);
int log_set_on_syslog(char *value);
int log_set_severity_idx(char *value);
#define DEFAULT_LOG_FILE_SIZE 10240
#define DEFAULT_LOG_FILE_NAME "/var/log/icwmpd.log"

60
log.c
View file

@ -12,6 +12,9 @@
#include <sys/stat.h>
#include <stdarg.h>
#include <syslog.h>
#include <sys/types.h>
#include <unistd.h>
#include "common.h"
#include "log.h"
@ -21,6 +24,7 @@ static long int log_max_size = DEFAULT_LOG_FILE_SIZE;
static char log_file_name[256];
static bool enable_log_file = true;
static bool enable_log_stdout = false;
static bool enable_log_syslog = true;
static pthread_mutex_t mutex_log = PTHREAD_MUTEX_INITIALIZER;
int log_set_severity_idx(char *value)
@ -72,6 +76,27 @@ int log_set_on_file(char *value)
return 1;
}
extern char *__progname;
int log_set_on_syslog(char *value)
{
if (strcmp(value, "enable") == 0) {
char ident[256];
enable_log_syslog = true;
setlogmask(LOG_UPTO(log_severity));
snprintf(ident, sizeof(ident), "%s[%d]", __progname, getpid());
ident[sizeof(ident) - 1] = '\0';
openlog(ident, LOG_NDELAY, LOG_LOCAL1);
}
if (strcmp(value, "disable") == 0) {
enable_log_syslog = false;
}
return 1;
}
void puts_log(int severity, const char *fmt, ...)
{
va_list args;
@ -85,12 +110,12 @@ void puts_log(int severity, const char *fmt, ...)
char buf[1024];
char buf_file[1024];
if (severity > log_severity) {
return;
}
pthread_mutex_lock(&mutex_log);
if (severity > log_severity) {
goto syslog;
}
gettimeofday(&tv, 0);
Tm = localtime(&tv.tv_sec);
i = sprintf(buf, "%02d-%02d-%4d, %02d:%02d:%02d %s ", Tm->tm_mday, Tm->tm_mon + 1, Tm->tm_year + 1900, Tm->tm_hour, Tm->tm_min, Tm->tm_sec, SEVERITY_NAMES[severity]);
@ -123,6 +148,17 @@ void puts_log(int severity, const char *fmt, ...)
if (enable_log_stdout) {
puts(buf);
}
syslog:
if (enable_log_syslog) {
va_start(args, fmt);
vsnprintf(buf, sizeof(buf), fmt, args);
buf[sizeof(buf) - 1] = '\0';
va_end(args);
syslog(severity, "%s", buf);
}
pthread_mutex_unlock(&mutex_log);
}
@ -137,12 +173,12 @@ void puts_log_xmlmsg(int severity, char *msg, int msgtype)
char buf[1024];
char *description, *separator;
if (severity > log_severity) {
return;
}
pthread_mutex_lock(&mutex_log);
if (severity > log_severity) {
goto xml_syslog;
}
gettimeofday(&tv, 0);
Tm = localtime(&tv.tv_sec);
sprintf(buf, "%02d-%02d-%4d, %02d:%02d:%02d %s ", Tm->tm_mday, Tm->tm_mon + 1, Tm->tm_year + 1900, Tm->tm_hour, Tm->tm_min, Tm->tm_sec, SEVERITY_NAMES[severity]);
@ -185,5 +221,13 @@ void puts_log_xmlmsg(int severity, char *msg, int msgtype)
puts("\n");
puts(separator);
}
xml_syslog:
if (enable_log_syslog) {
syslog(severity, "%s: %s", ((msgtype == XML_MSG_IN) ? "IN" : "OUT"), msg);
if (sizeof(buf) < strlen(msg))
syslog(severity, "Truncated message at %d characters", strlen(msg));
}
pthread_mutex_unlock(&mutex_log);
}