From 3f5016a96eddd9fea16068a98d152b2240ef7a5d Mon Sep 17 00:00:00 2001 From: ner216 Date: Mon, 13 Jul 2026 19:07:08 -0400 Subject: [PATCH 1/5] Add 'ignore_missing_paths' config option to omit output from glob or regular scan of directories that do not exist/not found. Signed-off-by: ner216 --- plugins/in_tail/tail.c | 5 +++++ plugins/in_tail/tail_config.h | 1 + plugins/in_tail/tail_scan.c | 8 ++++---- plugins/in_tail/tail_scan_glob.c | 8 ++++++-- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/plugins/in_tail/tail.c b/plugins/in_tail/tail.c index 40373f5c184..87eaabfce0b 100644 --- a/plugins/in_tail/tail.c +++ b/plugins/in_tail/tail.c @@ -576,6 +576,11 @@ static struct flb_config_map config_map[] = { "Set one or multiple shell patterns separated by commas to exclude " "files matching a certain criteria, e.g: 'exclude_path *.gz,*.zip'" }, + { + FLB_CONFIG_MAP_BOOL, "ignore_missing_paths", "false", + 0, FLB_TRUE, offsetof(struct flb_tail_config, ignore_missing_paths), + "Do not search directories that do not exist for files." + }, { FLB_CONFIG_MAP_STR, "key", "log", 0, FLB_TRUE, offsetof(struct flb_tail_config, key), diff --git a/plugins/in_tail/tail_config.h b/plugins/in_tail/tail_config.h index d39249b93ee..14147ae6416 100644 --- a/plugins/in_tail/tail_config.h +++ b/plugins/in_tail/tail_config.h @@ -88,6 +88,7 @@ struct flb_tail_config { long refresh_interval_nsec;/* nanoseconds to re-scan */ int read_newly_discovered_files_from_head; /* read new files from head after startup */ int read_from_head; /* read new files from head */ + int ignore_missing_paths; /* Ignore directory paths that do not exist */ int rotate_wait; /* sec to wait on rotated files */ int watcher_interval; /* watcher interval */ int ignore_older; /* ignore fields older than X seconds */ diff --git a/plugins/in_tail/tail_scan.c b/plugins/in_tail/tail_scan.c index 82dcda4bffa..6eb8226284d 100644 --- a/plugins/in_tail/tail_scan.c +++ b/plugins/in_tail/tail_scan.c @@ -110,13 +110,13 @@ int flb_tail_scan(struct mk_list *path_list, struct flb_tail_config *ctx) mk_list_foreach(head, path_list) { pattern = mk_list_entry(head, struct flb_slist_entry, _head); ret = tail_scan_path(pattern->str, ctx); - if (ret == -1) { - flb_plg_warn(ctx->ins, "error scanning path: %s", pattern->str); - } - else { + if (ret != -1) { flb_plg_debug(ctx->ins, "%i new files found on path '%s'", ret, pattern->str); } + else if (!ctx->ignore_missing_paths) { + flb_plg_warn(ctx->ins, "error scanning path: %s", pattern->str); + } } return 0; diff --git a/plugins/in_tail/tail_scan_glob.c b/plugins/in_tail/tail_scan_glob.c index 25173c2c14a..f406fcb9772 100644 --- a/plugins/in_tail/tail_scan_glob.c +++ b/plugins/in_tail/tail_scan_glob.c @@ -212,12 +212,16 @@ static int tail_scan_path(const char *path, struct flb_tail_config *ctx) flb_plg_error(ctx->ins, "no memory space available"); return -1; case GLOB_ABORTED: - flb_plg_error(ctx->ins, "read error, check permissions: %s", path); + if (!ctx->ignore_missing_paths) { + flb_plg_error(ctx->ins, "read error, check permissions: %s", path); + } return -1; case GLOB_NOMATCH: ret = stat(path, &st); if (ret == -1) { - flb_plg_debug(ctx->ins, "cannot read info from: %s", path); + if (!ctx->ignore_missing_paths) { + flb_plg_debug(ctx->ins, "cannot read info from: %s", path); + } } else { ret = access(path, R_OK); From 908df3204c7c835a1770c6851983d8ede04e4930 Mon Sep 17 00:00:00 2001 From: ner216 Date: Mon, 13 Jul 2026 21:10:25 -0400 Subject: [PATCH 2/5] Rename config option ignore_missing_paths to ignore_unavailable. Update logic to retain permision errors. Signed-off-by: ner216 --- plugins/in_tail/tail.c | 4 ++-- plugins/in_tail/tail_config.h | 2 +- plugins/in_tail/tail_scan.c | 2 +- plugins/in_tail/tail_scan_glob.c | 18 ++++++++++++------ 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/plugins/in_tail/tail.c b/plugins/in_tail/tail.c index 87eaabfce0b..a75c32a3c45 100644 --- a/plugins/in_tail/tail.c +++ b/plugins/in_tail/tail.c @@ -577,8 +577,8 @@ static struct flb_config_map config_map[] = { "files matching a certain criteria, e.g: 'exclude_path *.gz,*.zip'" }, { - FLB_CONFIG_MAP_BOOL, "ignore_missing_paths", "false", - 0, FLB_TRUE, offsetof(struct flb_tail_config, ignore_missing_paths), + FLB_CONFIG_MAP_BOOL, "ignore_unavailable", "false", + 0, FLB_TRUE, offsetof(struct flb_tail_config, ignore_unavailable), "Do not search directories that do not exist for files." }, { diff --git a/plugins/in_tail/tail_config.h b/plugins/in_tail/tail_config.h index 14147ae6416..0c0f0f11acc 100644 --- a/plugins/in_tail/tail_config.h +++ b/plugins/in_tail/tail_config.h @@ -88,7 +88,7 @@ struct flb_tail_config { long refresh_interval_nsec;/* nanoseconds to re-scan */ int read_newly_discovered_files_from_head; /* read new files from head after startup */ int read_from_head; /* read new files from head */ - int ignore_missing_paths; /* Ignore directory paths that do not exist */ + int ignore_unavailable; /* Ignore directory paths that do not exist */ int rotate_wait; /* sec to wait on rotated files */ int watcher_interval; /* watcher interval */ int ignore_older; /* ignore fields older than X seconds */ diff --git a/plugins/in_tail/tail_scan.c b/plugins/in_tail/tail_scan.c index 6eb8226284d..e2109da19b9 100644 --- a/plugins/in_tail/tail_scan.c +++ b/plugins/in_tail/tail_scan.c @@ -114,7 +114,7 @@ int flb_tail_scan(struct mk_list *path_list, struct flb_tail_config *ctx) flb_plg_debug(ctx->ins, "%i new files found on path '%s'", ret, pattern->str); } - else if (!ctx->ignore_missing_paths) { + else if (!ctx->ignore_unavailable) { flb_plg_warn(ctx->ins, "error scanning path: %s", pattern->str); } } diff --git a/plugins/in_tail/tail_scan_glob.c b/plugins/in_tail/tail_scan_glob.c index f406fcb9772..a2e5019c2b9 100644 --- a/plugins/in_tail/tail_scan_glob.c +++ b/plugins/in_tail/tail_scan_glob.c @@ -183,7 +183,6 @@ static inline int do_glob(const char *pattern, int flags, return ret; } - /* Scan a path, register the entries and return how many */ static int tail_scan_path(const char *path, struct flb_tail_config *ctx) { @@ -212,16 +211,23 @@ static int tail_scan_path(const char *path, struct flb_tail_config *ctx) flb_plg_error(ctx->ins, "no memory space available"); return -1; case GLOB_ABORTED: - if (!ctx->ignore_missing_paths) { - flb_plg_error(ctx->ins, "read error, check permissions: %s", path); + if (errno == EACCES) { + flb_plg_error(ctx->ins, "NO read access for path: %s", path); + } else if (!ctx->ignore_unavailable) { + switch (errno) { + case ENOENT: + flb_plg_warn(ctx->ins, "No such file at path: %s", path); + case ENOTDIR: + flb_plg_error(ctx->ins, "Not directory at path: %s", path); + default: + flb_plg_error(ctx->ins, "Unable to read path: %s", path); + } } return -1; case GLOB_NOMATCH: ret = stat(path, &st); if (ret == -1) { - if (!ctx->ignore_missing_paths) { - flb_plg_debug(ctx->ins, "cannot read info from: %s", path); - } + flb_plg_debug(ctx->ins, "cannot read info from: %s", path); } else { ret = access(path, R_OK); From a3aa856d3dfd3a82056e957a2ac7c98d78c486cf Mon Sep 17 00:00:00 2001 From: ner216 Date: Mon, 13 Jul 2026 21:33:49 -0400 Subject: [PATCH 3/5] Add break statements to switch cases. Signed-off-by: ner216 --- plugins/in_tail/tail_scan_glob.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/in_tail/tail_scan_glob.c b/plugins/in_tail/tail_scan_glob.c index a2e5019c2b9..7d28431c966 100644 --- a/plugins/in_tail/tail_scan_glob.c +++ b/plugins/in_tail/tail_scan_glob.c @@ -217,10 +217,13 @@ static int tail_scan_path(const char *path, struct flb_tail_config *ctx) switch (errno) { case ENOENT: flb_plg_warn(ctx->ins, "No such file at path: %s", path); + break; case ENOTDIR: flb_plg_error(ctx->ins, "Not directory at path: %s", path); + break; default: flb_plg_error(ctx->ins, "Unable to read path: %s", path); + break; } } return -1; From 8b2360698871c5fd6c4bb8950efc47bb2d09cc5f Mon Sep 17 00:00:00 2001 From: ner216 Date: Tue, 14 Jul 2026 18:14:03 -0400 Subject: [PATCH 4/5] Update do_glob() error handling to not omit uintended errors. Signed-off-by: ner216 --- plugins/in_tail/tail_config.h | 2 +- plugins/in_tail/tail_scan_glob.c | 27 ++++++++++++++------------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/plugins/in_tail/tail_config.h b/plugins/in_tail/tail_config.h index 0c0f0f11acc..d359d855254 100644 --- a/plugins/in_tail/tail_config.h +++ b/plugins/in_tail/tail_config.h @@ -88,7 +88,7 @@ struct flb_tail_config { long refresh_interval_nsec;/* nanoseconds to re-scan */ int read_newly_discovered_files_from_head; /* read new files from head after startup */ int read_from_head; /* read new files from head */ - int ignore_unavailable; /* Ignore directory paths that do not exist */ + int ignore_unavailable; /* gnore unavailable paths during scanning */ int rotate_wait; /* sec to wait on rotated files */ int watcher_interval; /* watcher interval */ int ignore_older; /* ignore fields older than X seconds */ diff --git a/plugins/in_tail/tail_scan_glob.c b/plugins/in_tail/tail_scan_glob.c index 7d28431c966..b0b64802e47 100644 --- a/plugins/in_tail/tail_scan_glob.c +++ b/plugins/in_tail/tail_scan_glob.c @@ -212,25 +212,26 @@ static int tail_scan_path(const char *path, struct flb_tail_config *ctx) return -1; case GLOB_ABORTED: if (errno == EACCES) { - flb_plg_error(ctx->ins, "NO read access for path: %s", path); - } else if (!ctx->ignore_unavailable) { - switch (errno) { - case ENOENT: - flb_plg_warn(ctx->ins, "No such file at path: %s", path); - break; - case ENOTDIR: - flb_plg_error(ctx->ins, "Not directory at path: %s", path); - break; - default: - flb_plg_error(ctx->ins, "Unable to read path: %s", path); - break; + flb_plg_error(ctx->ins, "No read access for path: %s", path); + } else if (errno == ENOENT || errno == ENOTDIR) { + if (!ctx->ignore_unavailable) { + flb_plg_error(ctx->ins, "%s at path: %s", + (errno == ENOENT) ? "No such file" : "Not a directory", + path); } + } else { + flb_plg_error(ctx->ins, "Unable to scan path (system error: %s): %s", + strerror(errno), path); } return -1; case GLOB_NOMATCH: ret = stat(path, &st); if (ret == -1) { - flb_plg_debug(ctx->ins, "cannot read info from: %s", path); + if (errno == ENOTDIR && !ctx->ignore_unavailable) { + flb_plg_error(ctx->ins, "Not a directory at path: %s", path); + } else { + flb_plg_debug(ctx->ins, "cannot read info from: %s", path); + } } else { ret = access(path, R_OK); From bebe5037177387076a3b1d99f3eecb47e96a6d32 Mon Sep 17 00:00:00 2001 From: ner216 Date: Tue, 14 Jul 2026 18:24:01 -0400 Subject: [PATCH 5/5] Correct typo in comment word 'ignore' in the tail_config.h file. Signed-off-by: ner216 --- plugins/in_tail/tail_config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/in_tail/tail_config.h b/plugins/in_tail/tail_config.h index d359d855254..ca13cfebd14 100644 --- a/plugins/in_tail/tail_config.h +++ b/plugins/in_tail/tail_config.h @@ -88,7 +88,7 @@ struct flb_tail_config { long refresh_interval_nsec;/* nanoseconds to re-scan */ int read_newly_discovered_files_from_head; /* read new files from head after startup */ int read_from_head; /* read new files from head */ - int ignore_unavailable; /* gnore unavailable paths during scanning */ + int ignore_unavailable; /* ignore unavailable paths during scanning */ int rotate_wait; /* sec to wait on rotated files */ int watcher_interval; /* watcher interval */ int ignore_older; /* ignore fields older than X seconds */