意外字符(“-”(代码 45)):预期 space 分隔根级值
Unexpected character ('-' (code 45)): Expected space separating root-level values
我正在使用 grok 的 logstash 过滤器并将日志文件导入 elasticsearch。我想将我的日志文件分成 4 个部分,它们是时间、日志级别、class(已编辑:对不起,我的错,它是线程,而不是 class)和消息。
下面是 spring-boot 使用 lob-back.xml
生成的日志文件的几行
2019-09-17 16:25:01,116 INFO [main]: org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler:initialize:Initializing ExecutorService 'taskScheduler'
2019-09-17 16:25:01,225 INFO [main]: org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor:initialize:Initializing ExecutorService 'applicationTaskExecutor'
我得到的错误如下:
[2019-09-17T16:25:01,425][ERROR][logstash.codecs.json] JSON parse error, original data now in message field {:error=>#<LogStash::Json::ParserError:
Unexpected character ('-' (code 45)): Expected space separating root-level values
"; line: 1, column: 6]>, :data=>"2019-09-17 16:25:01,043 INFO [main]: org.springframework.security.web.DefaultSecurityFilterChain:<init>:Creating filter chain: Ant [pattern='/v2/api-docs'], []\r"}
我的 logstash 配置:
input {
file {
path => "C:/data/log/*.log"
codec => "json"
type => "logback"
}
}
filter {
grok {
match => {
"message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:log-level} [%{DATA:class}]: %{GREEDYDATA:syslog_message}"
}
}
}
output {
if [type]=="logback" {
elasticsearch {
hosts => [ "localhost:9200" ]
index => "logback-%{+YYYY.MM.dd}"
}
}
}
您必须转义 [] 个字符才能将它们视为字符串的一部分,而不是特殊字符
match => {
"message" => '^%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:log_level}%{SPACE}\[%{DATA:thread}\]: %{GREEDYDATA:syslog_message}$'
}
我对你的模式进行了一些改进:
设置行锚点的开始(^)和结束($)以提高正则表达式性能,
因为失败会更快。更多信息 here.
你的日志在"log-level"和"class"之间有2个space(其实是线程,不是class)。如果它不是永久的 spaces 量(有时 Spring 填充一个日志变量达到一定长度),最好使用 %{SPACE} mask.
关注 es name convention 以获得 "log-level" 变量:
- 使用蛇形大小写(下划线) 组合单词。
我正在使用 grok 的 logstash 过滤器并将日志文件导入 elasticsearch。我想将我的日志文件分成 4 个部分,它们是时间、日志级别、class(已编辑:对不起,我的错,它是线程,而不是 class)和消息。
下面是 spring-boot 使用 lob-back.xml
生成的日志文件的几行2019-09-17 16:25:01,116 INFO [main]: org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler:initialize:Initializing ExecutorService 'taskScheduler'
2019-09-17 16:25:01,225 INFO [main]: org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor:initialize:Initializing ExecutorService 'applicationTaskExecutor'
我得到的错误如下:
[2019-09-17T16:25:01,425][ERROR][logstash.codecs.json] JSON parse error, original data now in message field {:error=>#<LogStash::Json::ParserError:
Unexpected character ('-' (code 45)): Expected space separating root-level values
"; line: 1, column: 6]>, :data=>"2019-09-17 16:25:01,043 INFO [main]: org.springframework.security.web.DefaultSecurityFilterChain:<init>:Creating filter chain: Ant [pattern='/v2/api-docs'], []\r"}
我的 logstash 配置:
input {
file {
path => "C:/data/log/*.log"
codec => "json"
type => "logback"
}
}
filter {
grok {
match => {
"message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:log-level} [%{DATA:class}]: %{GREEDYDATA:syslog_message}"
}
}
}
output {
if [type]=="logback" {
elasticsearch {
hosts => [ "localhost:9200" ]
index => "logback-%{+YYYY.MM.dd}"
}
}
}
您必须转义 [] 个字符才能将它们视为字符串的一部分,而不是特殊字符
match => {
"message" => '^%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:log_level}%{SPACE}\[%{DATA:thread}\]: %{GREEDYDATA:syslog_message}$'
}
我对你的模式进行了一些改进:
设置行锚点的开始(^)和结束($)以提高正则表达式性能, 因为失败会更快。更多信息 here.
你的日志在"log-level"和"class"之间有2个space(其实是线程,不是class)。如果它不是永久的 spaces 量(有时 Spring 填充一个日志变量达到一定长度),最好使用 %{SPACE} mask.
关注 es name convention 以获得 "log-level" 变量:
- 使用蛇形大小写(下划线) 组合单词。