parent
a57bba0aae
commit
1a234323a3
@ -407,6 +407,21 @@
|
|||||||
<para>Reloaded on reload signal.</para>
|
<para>Reloaded on reload signal.</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>log_timestamp_format</option> <replaceable>format</replaceable></term>
|
||||||
|
<listitem>
|
||||||
|
<para>Set the format of the log timestamp. If left unset,
|
||||||
|
this is the number of seconds since the Unix epoch.
|
||||||
|
This option is a free text string which will be passed
|
||||||
|
to the strftime function as the format specifier. To
|
||||||
|
get an ISO 8601 datetime, for example:</para>
|
||||||
|
<programlisting language="config">
|
||||||
|
log_timestamp_format %Y-%m-%dT%H:%M:%S
|
||||||
|
</programlisting>
|
||||||
|
<para>Reloaded on reload signal.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><option>log_type</option> <replaceable>types</replaceable></term>
|
<term><option>log_type</option> <replaceable>types</replaceable></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
|
@ -610,6 +610,13 @@
|
|||||||
# If set to true, add a timestamp value to each log message.
|
# If set to true, add a timestamp value to each log message.
|
||||||
#log_timestamp true
|
#log_timestamp true
|
||||||
|
|
||||||
|
# Set the format of the log timestamp. If left unset, this is the number of
|
||||||
|
# seconds since the Unix epoch.
|
||||||
|
# This is a free text string which will be passed to the strftime function. To
|
||||||
|
# get an ISO 8601 datetime, for example:
|
||||||
|
# log_timestamp_format %Y-%m-%dT%H:%M:%S
|
||||||
|
#log_timestamp_format
|
||||||
|
|
||||||
# =================================================================
|
# =================================================================
|
||||||
# Security
|
# Security
|
||||||
# =================================================================
|
# =================================================================
|
||||||
|
@ -213,6 +213,8 @@ static void config__init_reload(struct mosquitto_db *db, struct mosquitto__confi
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
config->log_timestamp = true;
|
config->log_timestamp = true;
|
||||||
|
mosquitto__free(config->log_timestamp_format);
|
||||||
|
config->log_timestamp_format = NULL;
|
||||||
config->max_keepalive = 65535;
|
config->max_keepalive = 65535;
|
||||||
config->max_packet_size = 0;
|
config->max_packet_size = 0;
|
||||||
config->max_inflight_messages = 20;
|
config->max_inflight_messages = 20;
|
||||||
@ -571,6 +573,9 @@ void config__copy(struct mosquitto__config *src, struct mosquitto__config *dest)
|
|||||||
dest->log_type = src->log_type;
|
dest->log_type = src->log_type;
|
||||||
dest->log_timestamp = src->log_timestamp;
|
dest->log_timestamp = src->log_timestamp;
|
||||||
|
|
||||||
|
mosquitto__free(dest->log_timestamp_format);
|
||||||
|
dest->log_timestamp_format = src->log_timestamp_format;
|
||||||
|
|
||||||
mosquitto__free(dest->log_file);
|
mosquitto__free(dest->log_file);
|
||||||
dest->log_file = src->log_file;
|
dest->log_file = src->log_file;
|
||||||
|
|
||||||
@ -1460,6 +1465,8 @@ int config__read_file_core(struct mosquitto__config *config, bool reload, struct
|
|||||||
#endif
|
#endif
|
||||||
}else if(!strcmp(token, "log_timestamp")){
|
}else if(!strcmp(token, "log_timestamp")){
|
||||||
if(conf__parse_bool(&token, token, &config->log_timestamp, saveptr)) return MOSQ_ERR_INVAL;
|
if(conf__parse_bool(&token, token, &config->log_timestamp, saveptr)) return MOSQ_ERR_INVAL;
|
||||||
|
}else if(!strcmp(token, "log_timestamp_format")){
|
||||||
|
if(conf__parse_string(&token, token, &config->log_timestamp_format, saveptr)) return MOSQ_ERR_INVAL;
|
||||||
}else if(!strcmp(token, "log_type")){
|
}else if(!strcmp(token, "log_type")){
|
||||||
token = strtok_r(NULL, " ", &saveptr);
|
token = strtok_r(NULL, " ", &saveptr);
|
||||||
if(token){
|
if(token){
|
||||||
|
@ -56,6 +56,43 @@ static int log_priorities = MOSQ_LOG_ERR | MOSQ_LOG_WARNING | MOSQ_LOG_NOTICE |
|
|||||||
static DltContext dltContext;
|
static DltContext dltContext;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static int get_time(struct tm **ti)
|
||||||
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
SYSTEMTIME st;
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
struct timeval tv;
|
||||||
|
#else
|
||||||
|
struct timespec ts;
|
||||||
|
#endif
|
||||||
|
time_t s;
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
s = time(NULL);
|
||||||
|
|
||||||
|
GetLocalTime(&st);
|
||||||
|
*ns = st.wMilliseconds*1000000L;
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
gettimeofday(&tv, NULL);
|
||||||
|
s = tv.tv_sec;
|
||||||
|
#else
|
||||||
|
if(clock_gettime(CLOCK_REALTIME, &ts) != 0){
|
||||||
|
fprintf(stderr, "Error obtaining system time.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
s = ts.tv_sec;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
*ti = localtime(&s);
|
||||||
|
if(!(*ti)){
|
||||||
|
fprintf(stderr, "Error obtaining system time.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int log__init(struct mosquitto__config *config)
|
int log__init(struct mosquitto__config *config)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
@ -149,6 +186,7 @@ int log__vprintf(int priority, const char *fmt, va_list va)
|
|||||||
int syslog_priority;
|
int syslog_priority;
|
||||||
time_t now = time(NULL);
|
time_t now = time(NULL);
|
||||||
static time_t last_flush = 0;
|
static time_t last_flush = 0;
|
||||||
|
char time_buf[50];
|
||||||
|
|
||||||
if((log_priorities & priority) && log_destinations != MQTT3_LOG_NONE){
|
if((log_priorities & priority) && log_destinations != MQTT3_LOG_NONE){
|
||||||
switch(priority){
|
switch(priority){
|
||||||
@ -233,9 +271,20 @@ int log__vprintf(int priority, const char *fmt, va_list va)
|
|||||||
vsnprintf(s, len, fmt, va);
|
vsnprintf(s, len, fmt, va);
|
||||||
s[len-1] = '\0'; /* Ensure string is null terminated. */
|
s[len-1] = '\0'; /* Ensure string is null terminated. */
|
||||||
|
|
||||||
|
if(int_db.config && int_db.config->log_timestamp && int_db.config->log_timestamp_format){
|
||||||
|
struct tm *ti = NULL;
|
||||||
|
get_time(&ti);
|
||||||
|
if(strftime(time_buf, 50, int_db.config->log_timestamp_format, ti) == 0){
|
||||||
|
snprintf(time_buf, 50, "Time error");
|
||||||
|
}
|
||||||
|
}
|
||||||
if(log_destinations & MQTT3_LOG_STDOUT){
|
if(log_destinations & MQTT3_LOG_STDOUT){
|
||||||
if(int_db.config && int_db.config->log_timestamp){
|
if(int_db.config && int_db.config->log_timestamp){
|
||||||
fprintf(stdout, "%d: %s\n", (int)now, s);
|
if(int_db.config->log_timestamp_format){
|
||||||
|
fprintf(stdout, "%s: %s\n", time_buf, s);
|
||||||
|
}else{
|
||||||
|
fprintf(stdout, "%d: %s\n", (int)now, s);
|
||||||
|
}
|
||||||
}else{
|
}else{
|
||||||
fprintf(stdout, "%s\n", s);
|
fprintf(stdout, "%s\n", s);
|
||||||
}
|
}
|
||||||
@ -243,7 +292,11 @@ int log__vprintf(int priority, const char *fmt, va_list va)
|
|||||||
}
|
}
|
||||||
if(log_destinations & MQTT3_LOG_STDERR){
|
if(log_destinations & MQTT3_LOG_STDERR){
|
||||||
if(int_db.config && int_db.config->log_timestamp){
|
if(int_db.config && int_db.config->log_timestamp){
|
||||||
fprintf(stderr, "%d: %s\n", (int)now, s);
|
if(int_db.config->log_timestamp_format){
|
||||||
|
fprintf(stderr, "%s: %s\n", time_buf, s);
|
||||||
|
}else{
|
||||||
|
fprintf(stderr, "%d: %s\n", (int)now, s);
|
||||||
|
}
|
||||||
}else{
|
}else{
|
||||||
fprintf(stderr, "%s\n", s);
|
fprintf(stderr, "%s\n", s);
|
||||||
}
|
}
|
||||||
@ -251,7 +304,11 @@ int log__vprintf(int priority, const char *fmt, va_list va)
|
|||||||
}
|
}
|
||||||
if(log_destinations & MQTT3_LOG_FILE && int_db.config->log_fptr){
|
if(log_destinations & MQTT3_LOG_FILE && int_db.config->log_fptr){
|
||||||
if(int_db.config && int_db.config->log_timestamp){
|
if(int_db.config && int_db.config->log_timestamp){
|
||||||
fprintf(int_db.config->log_fptr, "%d: %s\n", (int)now, s);
|
if(int_db.config->log_timestamp_format){
|
||||||
|
fprintf(int_db.config->log_fptr, "%s: %s\n", time_buf, s);
|
||||||
|
}else{
|
||||||
|
fprintf(int_db.config->log_fptr, "%d: %s\n", (int)now, s);
|
||||||
|
}
|
||||||
}else{
|
}else{
|
||||||
fprintf(int_db.config->log_fptr, "%s\n", s);
|
fprintf(int_db.config->log_fptr, "%s\n", s);
|
||||||
}
|
}
|
||||||
|
@ -255,6 +255,7 @@ struct mosquitto__config {
|
|||||||
int log_facility;
|
int log_facility;
|
||||||
int log_type;
|
int log_type;
|
||||||
bool log_timestamp;
|
bool log_timestamp;
|
||||||
|
char *log_timestamp_format;
|
||||||
char *log_file;
|
char *log_file;
|
||||||
FILE *log_fptr;
|
FILE *log_fptr;
|
||||||
uint16_t max_inflight_messages;
|
uint16_t max_inflight_messages;
|
||||||
|
Loading…
Reference in New Issue
Block a user