diff --git a/ChangeLog.txt b/ChangeLog.txt
index 050ca919..146cf713 100644
--- a/ChangeLog.txt
+++ b/ChangeLog.txt
@@ -46,6 +46,8 @@ Broker:
- When "require_certificate" was false, the broker was incorrectly asking for
a certificate (but not checking it). This caused problems with some clients
and has been fixed so the broker no longer asks.
+- When using syslog logging on non-Windows OSs, it is now possible to specify
+ the logging facility to one of local0-7 instead of the default "daemon".
Clients:
- Both clients can now load default configuration options from a file.
diff --git a/man/mosquitto.conf.5.xml b/man/mosquitto.conf.5.xml
index 871618ca..5422b708 100644
--- a/man/mosquitto.conf.5.xml
+++ b/man/mosquitto.conf.5.xml
@@ -300,6 +300,17 @@
Reloaded on reload signal.
+
+ local facility
+
+ If using syslog logging (not on Windows), messages
+ will be logged to the "daemon" facility by default. Use
+ the option to choose
+ which of local0 to local7 to log to instead. The option
+ value should be an integer value, e.g. "log_facility 5"
+ to use local5.
+
+
[ true | false ]
diff --git a/mosquitto.conf b/mosquitto.conf
index c50011d4..5523883c 100644
--- a/mosquitto.conf
+++ b/mosquitto.conf
@@ -461,6 +461,12 @@
# Use "log_dest none" if you wish to disable logging.
#log_dest stderr
+# If using syslog logging (not on Windows), messages will be logged to the
+# "daemon" facility by default. Use the log_facility option to choose which of
+# local0 to local7 to log to instead. The option value should be an integer
+# value, e.g. "log_facility 5" to use local5.
+#log_facility
+
# Types of messages to log. Use multiple log_type lines for logging
# multiple types of messages.
# Possible types are: debug, error, warning, notice, information,
diff --git a/src/conf.c b/src/conf.c
index d90bcb9e..c0943a11 100644
--- a/src/conf.c
+++ b/src/conf.c
@@ -35,6 +35,10 @@ Contributors:
# include
#endif
+#if !defined(WIN32) && !defined(__CYGWIN__)
+# include
+#endif
+
#include
#include
#include "tls_mosq.h"
@@ -130,6 +134,7 @@ static void _config_init_reload(struct mqtt3_config *config)
config->log_dest = MQTT3_LOG_STDERR;
}
#else
+ config->log_facility = LOG_DAEMON;
config->log_dest = MQTT3_LOG_STDERR;
if(config->verbose){
config->log_type = INT_MAX;
@@ -534,7 +539,7 @@ int _config_read_file_core(struct mqtt3_config *config, bool reload, const char
int rc;
char buf[1024];
char *token;
- int port_tmp;
+ int tmp_int;
char *saveptr = NULL;
#ifdef WITH_BRIDGE
struct _mqtt3_bridge *cur_bridge = NULL;
@@ -598,12 +603,12 @@ int _config_read_file_core(struct mqtt3_config *config, bool reload, const char
if(address){
token = strtok_r(NULL, ":", &saveptr);
if(token){
- port_tmp = atoi(token);
- if(port_tmp < 1 || port_tmp > 65535){
- _mosquitto_log_printf(NULL, MOSQ_LOG_ERR, "Error: Invalid port value (%d).", port_tmp);
+ tmp_int = atoi(token);
+ if(tmp_int < 1 || tmp_int > 65535){
+ _mosquitto_log_printf(NULL, MOSQ_LOG_ERR, "Error: Invalid port value (%d).", tmp_int);
return MOSQ_ERR_INVAL;
}
- cur_bridge->addresses[i].port = port_tmp;
+ cur_bridge->addresses[i].port = tmp_int;
}else{
cur_bridge->addresses[i].port = 1883;
}
@@ -1139,15 +1144,15 @@ int _config_read_file_core(struct mqtt3_config *config, bool reload, const char
_mosquitto_log_printf(NULL, MOSQ_LOG_ERR, "Error: Out of memory.");
return MOSQ_ERR_NOMEM;
}
- port_tmp = atoi(token);
- if(port_tmp < 1 || port_tmp > 65535){
- _mosquitto_log_printf(NULL, MOSQ_LOG_ERR, "Error: Invalid port value (%d).", port_tmp);
+ tmp_int = atoi(token);
+ if(tmp_int < 1 || tmp_int > 65535){
+ _mosquitto_log_printf(NULL, MOSQ_LOG_ERR, "Error: Invalid port value (%d).", tmp_int);
return MOSQ_ERR_INVAL;
}
cur_listener = &config->listeners[config->listener_count-1];
memset(cur_listener, 0, sizeof(struct _mqtt3_listener));
cur_listener->protocol = mp_mqtt;
- cur_listener->port = port_tmp;
+ cur_listener->port = tmp_int;
token = strtok_r(NULL, " ", &saveptr);
if(token){
cur_listener->host = _mosquitto_strdup(token);
@@ -1286,6 +1291,41 @@ int _config_read_file_core(struct mqtt3_config *config, bool reload, const char
_mosquitto_log_printf(NULL, MOSQ_LOG_ERR, "Error: Empty log_dest value in configuration.");
return MOSQ_ERR_INVAL;
}
+ }else if(!strcmp(token, "log_facility")){
+#if defined(WIN32) || defined(__CYGWIN__)
+ _mosquitto_log_printf(NULL, MOSQ_LOG_WARNING, "Warning: log_facility not supported on Windows.");
+#else
+ if(_conf_parse_int(&token, "log_facility", &tmp_int, saveptr)) return MOSQ_ERR_INVAL;
+ switch(tmp_int){
+ case 0:
+ config->log_facility = LOG_LOCAL0;
+ break;
+ case 1:
+ config->log_facility = LOG_LOCAL1;
+ break;
+ case 2:
+ config->log_facility = LOG_LOCAL2;
+ break;
+ case 3:
+ config->log_facility = LOG_LOCAL3;
+ break;
+ case 4:
+ config->log_facility = LOG_LOCAL4;
+ break;
+ case 5:
+ config->log_facility = LOG_LOCAL5;
+ break;
+ case 6:
+ config->log_facility = LOG_LOCAL6;
+ break;
+ case 7:
+ config->log_facility = LOG_LOCAL7;
+ break;
+ default:
+ _mosquitto_log_printf(NULL, MOSQ_LOG_ERR, "Error: Invalid log_facility value (%d).", tmp_int);
+ return MOSQ_ERR_INVAL;
+ }
+#endif
}else if(!strcmp(token, "log_timestamp")){
if(_conf_parse_bool(&token, token, &config->log_timestamp, saveptr)) return MOSQ_ERR_INVAL;
}else if(!strcmp(token, "log_type")){
@@ -1459,12 +1499,12 @@ int _config_read_file_core(struct mqtt3_config *config, bool reload, const char
if(config->default_listener.port){
_mosquitto_log_printf(NULL, MOSQ_LOG_WARNING, "Warning: Default listener port specified multiple times. Only the latest will be used.");
}
- if(_conf_parse_int(&token, "port", &port_tmp, saveptr)) return MOSQ_ERR_INVAL;
- if(port_tmp < 1 || port_tmp > 65535){
- _mosquitto_log_printf(NULL, MOSQ_LOG_ERR, "Error: Invalid port value (%d).", port_tmp);
+ if(_conf_parse_int(&token, "port", &tmp_int, saveptr)) return MOSQ_ERR_INVAL;
+ if(tmp_int < 1 || tmp_int > 65535){
+ _mosquitto_log_printf(NULL, MOSQ_LOG_ERR, "Error: Invalid port value (%d).", tmp_int);
return MOSQ_ERR_INVAL;
}
- config->default_listener.port = port_tmp;
+ config->default_listener.port = tmp_int;
}else if(!strcmp(token, "protocol")){
token = strtok_r(NULL, " ", &saveptr);
if(token){
diff --git a/src/logging.c b/src/logging.c
index c4f92ac7..26de0993 100644
--- a/src/logging.c
+++ b/src/logging.c
@@ -49,7 +49,7 @@ HANDLE syslog_h;
static int log_destinations = MQTT3_LOG_STDERR;
static int log_priorities = MOSQ_LOG_ERR | MOSQ_LOG_WARNING | MOSQ_LOG_NOTICE | MOSQ_LOG_INFO;
-int mqtt3_log_init(int priorities, int destinations)
+int mqtt3_log_init(int priorities, int destinations, int facility)
{
int rc = 0;
@@ -58,7 +58,7 @@ int mqtt3_log_init(int priorities, int destinations)
if(log_destinations & MQTT3_LOG_SYSLOG){
#ifndef WIN32
- openlog("mosquitto", LOG_PID, LOG_DAEMON);
+ openlog("mosquitto", LOG_PID|LOG_CONS, facility);
#else
syslog_h = OpenEventLog(NULL, "mosquitto");
#endif
diff --git a/src/loop.c b/src/loop.c
index 3331b7d3..cb331f42 100644
--- a/src/loop.c
+++ b/src/loop.c
@@ -314,7 +314,7 @@ int mosquitto_main_loop(struct mosquitto_db *db, int *listensock, int listensock
mosquitto_security_cleanup(db, true);
mosquitto_security_init(db, true);
mosquitto_security_apply(db);
- mqtt3_log_init(db->config->log_type, db->config->log_dest);
+ mqtt3_log_init(db->config->log_type, db->config->log_dest, db->config->log_facility);
flag_reload = false;
}
if(flag_tree_print){
diff --git a/src/mosquitto.c b/src/mosquitto.c
index 5e7e0747..5f8bc21a 100644
--- a/src/mosquitto.c
+++ b/src/mosquitto.c
@@ -239,7 +239,7 @@ int main(int argc, char *argv[])
/* Initialise logging only after initialising the database in case we're
* logging to topics */
- mqtt3_log_init(config.log_type, config.log_dest);
+ mqtt3_log_init(config.log_type, config.log_dest, config.log_facility);
_mosquitto_log_printf(NULL, MOSQ_LOG_INFO, "mosquitto version %s (build date %s) starting", VERSION, TIMESTAMP);
if(config.config_file){
_mosquitto_log_printf(NULL, MOSQ_LOG_INFO, "Config loaded from %s.", config.config_file);
diff --git a/src/mosquitto_broker.h b/src/mosquitto_broker.h
index 2799314f..830f592d 100644
--- a/src/mosquitto_broker.h
+++ b/src/mosquitto_broker.h
@@ -97,6 +97,7 @@ struct mqtt3_config {
struct _mqtt3_listener *listeners;
int listener_count;
int log_dest;
+ int log_facility;
int log_type;
bool log_timestamp;
char *log_file;
@@ -404,7 +405,7 @@ void mosquitto__free_disused_contexts(struct mosquitto_db *db);
/* ============================================================
* Logging functions
* ============================================================ */
-int mqtt3_log_init(int level, int destinations);
+int mqtt3_log_init(int level, int destinations, int facility);
int mqtt3_log_close(void);
int _mosquitto_log_printf(struct mosquitto *mosq, int level, const char *fmt, ...) __attribute__((format(printf, 3, 4)));