l_file->rotate_size_kbytes = DEFAULT_ROTATE_SIZE_KB;
l_file->max_rotated = DEFAULT_ROTATE_NUM_FILES;
l_file->format = log_format_new();
+ l_file->prev_sec = INT_MIN;
+ l_file->prev_nsec = INT_MIN;
return l_file->format != NULL ? 0 : -1;
}
logfile_open_internal(file);
}
+static void logfile_add_timestamp(struct log_file *file, const struct logger_entry *p)
+{
+ file->prev_sec = p->sec;
+ file->prev_nsec = p->nsec;
+}
+
/**
* @brief Write with rotation
* @details Writes the entry to given file, automatically handling file rotation
{
if (!log_should_print_line(file->format, e))
return 1;
- int written_bytes = log_print_log_line(file->format, file->fd, e);
+ int written_bytes = 0;
+
+ if (e->sec < file->prev_sec || (e->sec == file->prev_sec && e->nsec < file->prev_nsec)) {
+ char buffer[512];
+ int r = snprintf(buffer, sizeof buffer, "INFO: Following log entry could not be sorted and is out of order.\n");
+ written_bytes = write(file->fd, buffer, r);
+
+ if (written_bytes < 0) {
+ ERR("unable to write out-of-order message %m");
+ written_bytes = 0;
+ }
+ }
+
+ written_bytes += log_print_log_line(file->format, file->fd, e);
if (written_bytes <= 0)
return 1;
file->size += written_bytes;
+ logfile_add_timestamp(file, e);
+
if (logfile_rotate_needed(file))
logfile_do_rotate(file);
return 0;