r = get_display_realtime(j, &usec);
if (IN_SET(r, -EBADMSG, -EADDRNOTAVAIL)) {
- log_debug_errno(r, "Skipping message we can't read: %m");
+ log_debug_errno(r, "Unable to read realtime timestamp from entry, assuming bad or partially written entry: %m");
return 0;
}
if (r < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "No valid realtime timestamp available");
r = sd_journal_get_cursor(j, &cursor);
+ if (r == -EBADMSG) {
+ log_debug_errno(r, "Unable to determine cursor for entry, assuming bad or partially written entry: %m");
+ return 0;
+ }
if (r < 0)
return log_error_errno(r, "Failed to get cursor: %m");
size_t fieldlen, valuelen;
c = memchr(data, '=', length);
- if (!c)
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid field.");
+ if (!c) {
+ log_debug("Encountered field without '=', assuming bad or partially written entry, leaving.");
+ break;
+ }
fieldlen = c - (const char*) data;
- if (!journal_field_valid(data, fieldlen, true))
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid field.");
+ if (!journal_field_valid(data, fieldlen, /* allow_protected= */ true)) {
+ log_debug("Encountered invalid field, assuming bad or partially written entry, leaving.");
+ break;
+ }
r = field_set_test(output_fields, data, fieldlen);
if (r < 0)
(void) sd_journal_set_data_threshold(j, 0);
r = sd_journal_get_cursor(j, &cursor);
+ if (IN_SET(r, -EBADMSG, -EADDRNOTAVAIL)) {
+ log_debug_errno(r, "Unable to determine cursor of entry, assuming bad or partially written entry: %m");
+ return 0;
+ }
if (r < 0)
return log_error_errno(r, "Failed to get cursor: %m");
r = sd_journal_get_realtime_usec(j, &realtime);
+ if (r == -EBADMSG) {
+ log_debug_errno(r, "Unable to read realtime timestamp of entry, assuming bad or partially written entry: %m");
+ return 0;
+ }
if (r < 0)
return log_error_errno(r, "Failed to get realtime timestamp: %m");
r = sd_journal_get_monotonic_usec(j, &monotonic, &journal_boot_id);
+ if (r == -EBADMSG) {
+ log_debug_errno(r, "Unable to read monotonic timestamp of entry, assuming bad or partially written entry: %m");
+ return 0;
+ }
if (r < 0)
return log_error_errno(r, "Failed to get monotonic timestamp: %m");
r = sd_journal_get_seqnum(j, &seqnum, &seqnum_id);
+ if (r == -EBADMSG) {
+ log_debug_errno(r, "Unable to read sequence number of entry, assuming bad or partially written entry: %m");
+ return 0;
+ }
if (r < 0)
return log_error_errno(r, "Failed to get seqnum: %m");
continue;
c = memchr(data, '=', length);
- if (!c)
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid field.");
+ if (!c) {
+ log_debug("Encountered data field without '=', assuming bad or partially written entry, leaving.");
+ break;
+ }
fieldlen = c - (const char*) data;
- if (!journal_field_valid(data, fieldlen, true))
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid field.");
+ if (!journal_field_valid(data, fieldlen, /* allow_protected= */ true)) {
+ log_debug("Encountered invalid field, assuming bad or partially written entry, leaving.");
+ break;
+ }
r = field_set_test(output_fields, data, fieldlen);
if (r < 0)
return 0;
fieldlen = eq - (const char*) data;
- if (!journal_field_valid(data, fieldlen, true))
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid field.");
+ if (!journal_field_valid(data, fieldlen, /* allow_protected= */ true)) {
+ log_debug("Encountered invalid field, assuming bad or incompletely written field, leaving.");
+ return 0;
+ }
name = strndupa_safe(data, fieldlen);
if (output_fields && !set_contains(output_fields, name))
(void) sd_journal_set_data_threshold(j, flags & OUTPUT_SHOW_ALL ? 0 : JSON_THRESHOLD);
r = sd_journal_get_cursor(j, &cursor);
+ if (IN_SET(r, -EBADMSG, -EADDRNOTAVAIL)) {
+ log_debug_errno(r, "Unable to determine cursor of entry, assuming bad or partially written entry: %m");
+ return 0;
+ }
if (r < 0)
return log_error_errno(r, "Failed to get cursor: %m");
r = sd_journal_get_realtime_usec(j, &realtime);
+ if (r == -EBADMSG) {
+ log_debug_errno(r, "Unable to read realtime timestamp of entry, assuming bad or partially written entry: %m");
+ return 0;
+ }
if (r < 0)
return log_error_errno(r, "Failed to get realtime timestamp: %m");
r = sd_journal_get_monotonic_usec(j, &monotonic, &journal_boot_id);
+ if (r == -EBADMSG) {
+ log_debug_errno(r, "Unable to read monotonic timestamp of entry, assuming bad or partially written entry: %m");
+ return 0;
+ }
if (r < 0)
return log_error_errno(r, "Failed to get monotonic timestamp: %m");
r = sd_journal_get_seqnum(j, &seqnum, &seqnum_id);
+ if (r == -EBADMSG) {
+ log_debug_errno(r, "Unable to read sequence number of entry, assuming bad or partially written entry: %m");
+ return 0;
+ }
if (r < 0)
return log_error_errno(r, "Failed to get seqnum: %m");
if (need_seek) {
r = sd_journal_next(j);
+ if (r == -EBADMSG) {
+ log_debug_errno(r, "Bad or partially written entry, leaving.");
+ break;
+ }
if (r < 0)
return log_error_errno(r, "Failed to iterate through journal: %m");
}