mirror of
https://dev.iopsys.eu/feed/iopsys.git
synced 2025-12-10 07:44:50 +01:00
103 lines
2.8 KiB
Diff
103 lines
2.8 KiB
Diff
diff --git a/plugins/in_kmsg/in_kmsg.c b/plugins/in_kmsg/in_kmsg.c
|
|
index 15f10545..481d162b 100644
|
|
--- a/plugins/in_kmsg/in_kmsg.c
|
|
+++ b/plugins/in_kmsg/in_kmsg.c
|
|
@@ -104,6 +104,32 @@ static int boot_time(struct timeval *boot_time)
|
|
return 0;
|
|
}
|
|
|
|
+static void load_last_sequence(struct flb_in_kmsg_config *ctx)
|
|
+{
|
|
+ FILE *f = fopen(FLB_KMSG_SEQ_MARKER, "r");
|
|
+ if (!f) {
|
|
+ ctx->last_sequence = 0;
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ if (fscanf(f, "%llu", &ctx->last_sequence) != 1) {
|
|
+ ctx->last_sequence = 0;
|
|
+ }
|
|
+
|
|
+ fclose(f);
|
|
+}
|
|
+
|
|
+static void save_last_sequence(struct flb_in_kmsg_config *ctx)
|
|
+{
|
|
+ FILE *f = fopen(FLB_KMSG_SEQ_MARKER, "w");
|
|
+ if (!f) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ fprintf(f, "%llu\n", (unsigned long long)ctx->last_sequence);
|
|
+ fclose(f);
|
|
+}
|
|
+
|
|
static inline int process_line(const char *line,
|
|
struct flb_input_instance *i_ins,
|
|
struct flb_in_kmsg_config *ctx)
|
|
@@ -161,6 +187,11 @@ static inline int process_line(const char *line,
|
|
}
|
|
|
|
sequence = val;
|
|
+ /* skip lines we have already seen */
|
|
+ if (sequence <= ctx->last_sequence) {
|
|
+ return 0; /* skip old message */
|
|
+ }
|
|
+
|
|
p = ++end;
|
|
|
|
/* Timestamp */
|
|
@@ -225,6 +256,7 @@ static inline int process_line(const char *line,
|
|
ctx->log_encoder.output_buffer,
|
|
ctx->log_encoder.output_length);
|
|
|
|
+ ctx->last_sequence = sequence;
|
|
ret = 0;
|
|
}
|
|
else {
|
|
@@ -363,6 +395,10 @@ static int in_kmsg_init(struct flb_input_instance *ins,
|
|
return -1;
|
|
}
|
|
|
|
+ load_last_sequence(ctx);
|
|
+ flb_plg_debug(ctx->ins, "restored last_sequence=%llu",
|
|
+ (unsigned long long)ctx->last_sequence);
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
@@ -373,6 +409,12 @@ static int in_kmsg_exit(void *data, struct flb_config *config)
|
|
|
|
flb_log_event_encoder_destroy(&ctx->log_encoder);
|
|
|
|
+ /*
|
|
+ * save the last read sequence number in a file,
|
|
+ * so that we know where to start next time
|
|
+ */
|
|
+ save_last_sequence(ctx);
|
|
+
|
|
if (ctx->fd >= 0) {
|
|
close(ctx->fd);
|
|
}
|
|
diff --git a/plugins/in_kmsg/in_kmsg.h b/plugins/in_kmsg/in_kmsg.h
|
|
index 0ea2e97a..4b9d98fd 100644
|
|
--- a/plugins/in_kmsg/in_kmsg.h
|
|
+++ b/plugins/in_kmsg/in_kmsg.h
|
|
@@ -27,6 +27,7 @@
|
|
#include <stdint.h>
|
|
|
|
#define FLB_KMSG_DEV "/dev/kmsg"
|
|
+#define FLB_KMSG_SEQ_MARKER "/tmp/fluent_bit_kmsg_last_seq"
|
|
#define FLB_KMSG_BUF_SIZE 4096
|
|
|
|
/* Alert levels, taken from util-linux sources */
|
|
@@ -60,6 +61,9 @@ struct flb_in_kmsg_config {
|
|
size_t buf_size;
|
|
struct flb_log_event_encoder log_encoder;
|
|
struct flb_input_instance *ins;
|
|
+
|
|
+ uint64_t last_sequence; /* last saved sequence */
|
|
+ const char *seq_file; /* path to seq file */
|
|
};
|
|
|
|
|