Browse Source

Support configurable syslog facilities (#5792)

* Changes in libnetdata/log/log.c to append facility

* Fixing compilatioN

* Fixing compilation problem!

* Remove comments and adjust indentation inside log

* Update log.c

* Elimination of unnecessary calls to function
thiagoftsm 6 years ago
parent
commit
e77241c3cf
3 changed files with 424 additions and 3 deletions
  1. 4 0
      daemon/main.c
  2. 419 3
      libnetdata/log/log.c
  3. 1 0
      libnetdata/log/log.h

+ 4 - 0
daemon/main.c

@@ -355,6 +355,10 @@ void log_init(void) {
     snprintfz(filename, FILENAME_MAX, "%s/access.log", netdata_configured_log_dir);
     stdaccess_filename = config_get(CONFIG_SECTION_GLOBAL, "access log", filename);
 
+	char deffacility[8];
+	snprintfz(deffacility,7,"%s","daemon");
+	facility_log = config_get(CONFIG_SECTION_GLOBAL, "facility log",  deffacility);
+
     error_log_throttle_period = config_get_number(CONFIG_SECTION_GLOBAL, "errors flood protection period", error_log_throttle_period);
     error_log_errors_per_period = (unsigned long)config_get_number(CONFIG_SECTION_GLOBAL, "errors to trigger flood protection", (long long int)error_log_errors_per_period);
     error_log_errors_per_period_backup = error_log_errors_per_period;

+ 419 - 3
libnetdata/log/log.c

@@ -18,12 +18,427 @@ FILE *stdaccess = NULL;
 const char *stdaccess_filename = NULL;
 const char *stderr_filename = NULL;
 const char *stdout_filename = NULL;
+const char *facility_log = NULL;
 
-void syslog_init(void) {
+// ----------------------------------------------------------------------------
+// Log facility(https://tools.ietf.org/html/rfc5424)
+//
+// The facilities accepted in the Netdata are in according with the following
+// header files for their respective operate system:
+// 	sys/syslog.h (Linux )
+// 	sys/sys/syslog.h (FreeBSD)
+// 	bsd/sys/syslog.h (darwin-xnu)
+
+#define LOG_AUTH_KEY "auth"
+#define LOG_AUTHPRIV_KEY "authpriv"
+#ifdef __FreeBSD__
+# define LOG_CONSOLE_KEY "console"
+#endif
+#define LOG_CRON_KEY "cron"
+#define LOG_DAEMON_KEY "daemon"
+#define LOG_FTP_KEY "ftp"
+#ifdef __APPLE__
+# define LOG_INSTALL_KEY "install"
+#endif
+#define LOG_KERN_KEY "kern"
+#define LOG_LPR_KEY "lpr"
+#define LOG_MAIL_KEY "mail"
+//#define LOG_INTERNAL_MARK_KEY "mark"
+#ifdef __APPLE__
+# define LOG_NETINFO_KEY "netinfo"
+# define LOG_RAS_KEY "ras"
+# define LOG_REMOTEAUTH_KEY "remoteauth"
+#endif
+#define LOG_NEWS_KEY "news"
+#ifdef __FreeBSD__
+# define LOG_NTP_KEY "ntp"
+#endif
+#define LOG_SECURITY_KEY "security"
+#define LOG_SYSLOG_KEY "syslog"
+#define LOG_USER_KEY "user"
+#define LOG_UUCP_KEY "uucp"
+#ifdef __APPLE__
+# define LOG_LAUNCHD_KEY "launchd"
+#endif
+#define LOG_LOCAL0_KEY "local0"
+#define LOG_LOCAL1_KEY "local1"
+#define LOG_LOCAL2_KEY "local2"
+#define LOG_LOCAL3_KEY "local3"
+#define LOG_LOCAL4_KEY "local4"
+#define LOG_LOCAL5_KEY "local5"
+#define LOG_LOCAL6_KEY "local6"
+#define LOG_LOCAL7_KEY "local7"
+
+static int log_facility_id(const char *facility_name)
+{
+	static int 
+		hash_auth = 0,
+		hash_authpriv = 0,
+#ifdef __FreeBSD__
+		hash_console = 0,
+#endif
+		hash_cron = 0,
+		hash_daemon = 0,
+		hash_ftp = 0,
+#ifdef __APPLE__
+		hash_install = 0,
+#endif
+		hash_kern = 0,
+		hash_lpr = 0,
+		hash_mail = 0,
+//		hash_mark = 0,
+#ifdef __APPLE__
+		hash_netinfo = 0,
+		hash_ras = 0,
+		hash_remoteauth = 0,
+#endif
+		hash_news = 0,
+#ifdef __FreeBSD__
+		hash_ntp = 0,
+#endif
+		hash_security = 0,
+		hash_syslog = 0,
+		hash_user = 0,
+		hash_uucp = 0,
+#ifdef __APPLE__
+		hash_launchd = 0,
+#endif
+		hash_local0 = 0,
+		hash_local1 = 0,
+		hash_local2 = 0,
+		hash_local3 = 0,
+		hash_local4 = 0,
+		hash_local5 = 0,
+		hash_local6 = 0,
+		hash_local7 = 0;
+
+	if(unlikely(!hash_auth))
+	{
+		hash_auth = simple_hash(LOG_AUTH_KEY);
+		hash_authpriv = simple_hash(LOG_AUTHPRIV_KEY);
+#ifdef __FreeBSD__
+		hash_console = simple_hash(LOG_CONSOLE_KEY);
+#endif
+		hash_cron = simple_hash(LOG_CRON_KEY);
+		hash_daemon = simple_hash(LOG_DAEMON_KEY);
+		hash_ftp = simple_hash(LOG_FTP_KEY);
+#ifdef __APPLE__
+		hash_install = simple_hash(LOG_INSTALL_KEY);
+#endif
+		hash_kern = simple_hash(LOG_KERN_KEY);
+		hash_lpr = simple_hash(LOG_LPR_KEY);
+		hash_mail = simple_hash(LOG_MAIL_KEY);
+//		hash_mark = simple_uhash();
+#ifdef __APPLE__
+		hash_netinfo = simple_hash(LOG_NETINFO_KEY);
+		hash_ras = simple_hash(LOG_RAS_KEY);
+		hash_remoteauth = simple_hash(LOG_REMOTEAUTH_KEY);
+#endif
+		hash_news = simple_hash(LOG_NEWS_KEY);
+#ifdef __FreeBSD__
+		hash_ntp = simple_hash(LOG_NTP_KEY);
+#endif
+		hash_security = simple_hash(LOG_SECURITY_KEY);
+		hash_syslog = simple_hash(LOG_SYSLOG_KEY);
+		hash_user = simple_hash(LOG_USER_KEY);
+		hash_uucp = simple_hash(LOG_UUCP_KEY);
+#ifdef __APPLE__
+		hash_launchd = simple_hash(LOG_LAUNCHD_KEY);
+#endif
+		hash_local0 = simple_hash(LOG_LOCAL0_KEY);
+		hash_local1 = simple_hash(LOG_LOCAL1_KEY);
+		hash_local2 = simple_hash(LOG_LOCAL2_KEY);
+		hash_local3 = simple_hash(LOG_LOCAL3_KEY);
+		hash_local4 = simple_hash(LOG_LOCAL4_KEY);
+		hash_local5 = simple_hash(LOG_LOCAL5_KEY);
+		hash_local6 = simple_hash(LOG_LOCAL6_KEY);
+		hash_local7 = simple_hash(LOG_LOCAL7_KEY);
+	}
+
+	int hash = simple_hash(facility_name);
+	if ( hash == hash_auth )
+	{
+		return LOG_AUTH;
+	}
+	else if  ( hash == hash_authpriv )
+	{
+		return LOG_AUTHPRIV;
+	}
+#ifdef __FreeBSD__
+	else if ( hash == hash_console )
+	{
+		return LOG_CONSOLE;
+	}
+#endif
+	else if ( hash == hash_cron )
+	{
+		return LOG_CRON;
+	}
+	else if ( hash == hash_daemon )
+	{
+		return LOG_DAEMON;
+	}
+	else if ( hash == hash_ftp )
+	{
+		return LOG_FTP;
+	}
+#ifdef __APPLE__
+	else if ( hash == hash_install )
+	{
+		return LOG_INSTALL;
+	}
+#endif
+	else if ( hash == hash_kern )
+	{
+		return LOG_KERN;
+	}
+	else if ( hash == hash_lpr )
+	{
+		return LOG_LPR;
+	}
+	else if ( hash == hash_mail )
+	{
+		return LOG_MAIL;
+	}
+	/*
+	else if ( hash == hash_mark )
+	{
+		//this is internal for all OS
+		return INTERNAL_MARK;
+	}
+	*/
+#ifdef __APPLE__
+	else if ( hash == hash_netinfo )
+	{
+		return LOG_NETINFO;
+	}
+	else if ( hash == hash_ras )
+	{
+		return LOG_RAS;
+	}
+	else if ( hash == hash_remoteauth )
+	{
+		return LOG_REMOTEAUTH;
+	}
+#endif
+	else if ( hash == hash_news )
+	{
+		return LOG_NEWS;
+	}
+#ifdef __FreeBSD__
+	else if ( hash == hash_ntp )
+	{
+		return LOG_NTP;
+	}
+#endif
+	else if ( hash == hash_security )
+	{
+		//FreeBSD is the unique that does not consider
+		//this facility deprecated. We are keeping
+		//it for other OS while they are kept in their headers.
+#ifdef __FreeBSD__
+		return LOG_SECURITY;
+#else
+		return LOG_AUTH;
+#endif
+	}
+	else if ( hash == hash_syslog )
+	{
+		return LOG_SYSLOG;
+	}
+	else if ( hash == hash_user )
+	{
+		return LOG_USER;
+	}
+	else if ( hash == hash_uucp )
+	{
+		return LOG_UUCP;
+	}
+	else if ( hash == hash_local0 )
+	{
+		return LOG_LOCAL0;
+	}
+	else if ( hash == hash_local1 )
+	{
+		return LOG_LOCAL1;
+	}
+	else if ( hash == hash_local2 )
+	{
+		return LOG_LOCAL2;
+	}
+	else if ( hash == hash_local3 )
+	{
+		return LOG_LOCAL3;
+	}
+	else if ( hash == hash_local4 )
+	{
+		return LOG_LOCAL4;
+	}
+	else if ( hash == hash_local5 )
+	{
+		return LOG_LOCAL5;
+	}
+	else if ( hash == hash_local6 )
+	{
+		return LOG_LOCAL6;
+	}
+	else if ( hash == hash_local7 )
+	{
+		return LOG_LOCAL7;
+	}
+#ifdef __APPLE__
+	else if ( hash == hash_launchd )
+	{
+		return LOG_LAUNCHD;
+	}
+#endif
+
+	return LOG_DAEMON;
+}
+
+//we do not need to use this now, but I already created this function to be
+//used case necessary.
+/*
+char *log_facility_name(int code)
+{
+	char *defvalue = { "daemon" };
+	switch(code)
+	{
+		case LOG_AUTH:
+			{
+				return "auth";
+			}
+		case LOG_AUTHPRIV:
+			{
+				return "authpriv";
+			}
+#ifdef __FreeBSD__
+		case LOG_CONSOLE:
+			{
+				return "console";
+			}
+#endif
+		case LOG_CRON:
+			{
+				return "cron";
+			}
+		case LOG_DAEMON:
+			{
+				return defvalue;
+			}
+		case LOG_FTP:
+			{
+				return "ftp";
+			}
+#ifdef __APPLE__
+		case LOG_INSTALL:
+			{
+				return "install";
+			}
+#endif
+		case LOG_KERN:
+			{
+				return "kern";
+			}
+		case LOG_LPR:
+			{
+				return "lpr";
+			}
+		case LOG_MAIL:
+			{
+				return "mail";
+			}
+#ifdef __APPLE__
+		case LOG_NETINFO:
+			{
+				return "netinfo" ;
+			}
+		case LOG_RAS:
+			{
+				return "ras";
+			}
+		case LOG_REMOTEAUTH:
+			{
+				return "remoteauth";
+			}
+#endif
+		case LOG_NEWS:
+			{
+				return "news";
+			}
+#ifdef __FreeBSD__
+		case LOG_NTP:
+			{
+				return "ntp" ;
+			}
+		case LOG_SECURITY:
+			{
+				return "security";
+			}
+#endif
+		case LOG_SYSLOG:
+			{
+				return "syslog";
+			}
+		case LOG_USER:
+			{
+				return "user";
+			}
+		case LOG_UUCP:
+			{
+				return "uucp";
+			}
+		case LOG_LOCAL0:
+			{
+				return "local0";
+			}
+		case LOG_LOCAL1:
+			{
+				return "local1";
+			}
+		case LOG_LOCAL2:
+			{
+				return "local2";
+			}
+		case LOG_LOCAL3:
+			{
+				return "local3";
+			}
+		case LOG_LOCAL4:
+			{
+				return "local4" ;
+			}
+		case LOG_LOCAL5:
+			{
+				return "local5";
+			}
+		case LOG_LOCAL6:
+			{
+				return "local6";
+			}
+		case LOG_LOCAL7:
+			{
+				return "local7" ;
+			}
+#ifdef __APPLE__
+		case LOG_LAUNCHD:
+			{
+				return "launchd";
+			}
+#endif
+	}
+
+	return defvalue;
+}	
+*/
+
+// ----------------------------------------------------------------------------
+
+void syslog_init() {
     static int i = 0;
 
     if(!i) {
-        openlog(program_name, LOG_PID, LOG_DAEMON);
+        openlog(program_name, LOG_PID,log_facility_id(facility_log));
         i = 1;
     }
 }
@@ -70,7 +485,8 @@ static FILE *open_log_file(int fd, FILE *fp, const char *filename, int *enabled_
     if(!strcmp(filename, "syslog")) {
         filename = "/dev/null";
         devnull = 1;
-        syslog_init();
+
+	syslog_init();
         if(enabled_syslog) *enabled_syslog = 1;
     }
     else if(enabled_syslog) *enabled_syslog = 0;

+ 1 - 0
libnetdata/log/log.h

@@ -54,6 +54,7 @@ extern FILE *stdaccess;
 extern const char *stdaccess_filename;
 extern const char *stderr_filename;
 extern const char *stdout_filename;
+extern const char *facility_log;
 
 extern int access_log_syslog;
 extern int error_log_syslog;