diff --git a/src/log_format.cc b/src/log_format.cc index 1b3e7fb8..392883d4 100644 --- a/src/log_format.cc +++ b/src/log_format.cc @@ -3022,6 +3022,16 @@ external_log_format::build(std::vector& errors) errors.emplace_back(um); } + } else if (!ts_cap) { + errors.emplace_back( + lnav::console::user_message::error( + attr_line_t("invalid sample log message: ") + .append(lnav::to_json(elf_sample.s_line.pp_value))) + .with_reason(attr_line_t("timestamp was not captured")) + .with_snippet(elf_sample.s_line.to_snippet()) + .with_help(attr_line_t( + "A timestamp needs to be captured in order for a " + "line to be recognized as a log message"))); } else { attr_line_t notes; diff --git a/src/time_formats.am b/src/time_formats.am index 7147a0c8..a3fa7ccc 100644 --- a/src/time_formats.am +++ b/src/time_formats.am @@ -17,6 +17,8 @@ TIME_FORMATS = \ "%Y-%m-%d %H:%M:%S:%L" \ "%Y-%m-%d %H:%M:%S" \ "%Y-%m-%d %H:%M" \ + "%Y-%m-%dT%H:%M:%S.%N%z" \ + "%y-%m-%dT%H:%M:%S.%N%z" \ "%Y-%m-%dT%H:%M:%S.%f%z" \ "%y-%m-%dT%H:%M:%S.%f%z" \ "%Y-%m-%dT%H:%M:%S.%L%z" \ diff --git a/test/Makefile.am b/test/Makefile.am index f7d249d8..38d7c88f 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -231,6 +231,8 @@ dist_noinst_DATA = \ ansi-colors.0.in \ bad-config/formats/invalid-file-format/format.json \ bad-config/formats/invalid-json-format/format.json \ + bad-config/formats/invalid-name/format.json \ + bad-config/formats/invalid-no-tscap/format.json \ bad-config/formats/invalid-properties/format.json \ bad-config/formats/invalid-regex/format.json \ bad-config/formats/invalid-sample/format.json \ diff --git a/test/bad-config/formats/invalid-no-tscap/format.json b/test/bad-config/formats/invalid-no-tscap/format.json new file mode 100644 index 00000000..5e8eb14d --- /dev/null +++ b/test/bad-config/formats/invalid-no-tscap/format.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://lnav.org/schemas/format-v1.schema.json", + "no_tscap_log": { + "title": "Sample with no captured timestamp", + "multiline": true, + "ordered-by-time": false, + "regex": { + "std": { + "pattern": "^(?[\\w-]+)\\s+\\|( (?\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{9}[+-]\\d{2}:\\d{2}))?( (?.*))?$" + } + }, + "level-field": "timestamp", + "module-field": "container", + "value": { + "container": { + "kind": "string", + "identifier": true + } + }, + "sample": [ + { + "line": "gitea | 2023-09-24T22:15:55.346526305+02:00 2023/09/24 22:15:55 cmd/web.go:223:runWeb() [I] Starting Gitea on PID: 7" + }, + { + "line": "gitea | 2023/09/24 22:15:55 cmd/web.go:223:runWeb() [I] Starting Gitea on PID: 7" + }, + { + "line": "gitea-db-1 | 2023-09-24T22:15:37.981051393+02:00 [migrations] started" + } + ] + } +} \ No newline at end of file diff --git a/test/expected/test_format_loader.sh_5992e2695b7e6cf1f3520dbb87af8fc2b8f27088.err b/test/expected/test_format_loader.sh_5992e2695b7e6cf1f3520dbb87af8fc2b8f27088.err index a2a93ff7..578c06f7 100644 --- a/test/expected/test_format_loader.sh_5992e2695b7e6cf1f3520dbb87af8fc2b8f27088.err +++ b/test/expected/test_format_loader.sh_5992e2695b7e6cf1f3520dbb87af8fc2b8f27088.err @@ -209,6 +209,10 @@ ✘ error: “no_sample_log” is not a valid log format reason: log message samples must be included in a format definition  --> {test_dir}/bad-config/formats/no-samples/format.json:4 +✘ error: invalid sample log message: "gitea | 2023/09/24 22:15:55 cmd/web.go:223:runWeb() [I] Starting Gitea on PID: 7" + reason: timestamp was not captured + --> {test_dir}/bad-config/formats/invalid-no-tscap/format.json:25 + = help: A timestamp needs to be captured in order for a line to be recognized as a log message ✘ error: failed to compile SQL statement reason: near "TALE": syntax error  --> {test_dir}/bad-config/formats/invalid-sql/init.sql:4