为什么解析Log-stash失败,而字段类型与之前相同而没有变化?

时间:2016-09-24 11:21:13

标签: elasticsearch logstash

logstash日志文件说:

"tags"=>["_grokparsefailure"]}, "status_code"]}>, @data={"@version"=>"1", "@timestamp"=>"2016-09-24T08:00:54.894Z", "path"=>"/var/log/nginx/access.log", "host"=>"sample-com", "remote_addr"=>"127.0.0.1", "remote_user"=>"-", "date"=>"05/Sep/2016:10:03:01 +0000", "method"=>"GET", "uri_path"=>"/accounts", "version"=>"HTTP/1.1", "status_code"=>"200", "body_byte_sent"=>419, "referer"=>"-", "user_agent"=>"python-requests/2.4.3 CPython/2.7.9 Linux/3.16.0-4-amd64", "request_time"=>6.161, "auth_type"=>"Bearer", "client_id"=>"beta",  
"web_client_ip"=>"172.*.131.177", "response_json"=>{"_links"=>{"applications"=>{"href"=>"/applications"}, "menus"=>{"href"=>"/menus"}, "messages"=>{"href"=>"/messages"}, "numbers"=>{"href"=>"/numbers"}, "self"=>{"href"=>"/accounts"}}, "account_status"=>"active", "creation_date"=>"2016-06-07 09:25:18", "credit"=>{"balance"=>#<BigDecimal:367dbf49,'0.19819267E4',8(12)>, "currency"=>"usd"}, "email"=>"*@gmail.com",    
"id"=>"677756yt7557", "lastname"=>"Qurbani", "name"=>"M", "notifications"=>{"black_list"=>{"uids"=>[]}, "settings"=>{"email"=>{"low_credit"=>true, "new_feature"=>true, "receive_f"=>true, "send_f"=>true, "voice"=>true}, "language"=>"en", "push_notif"=>{"low_credit"=>true, "new_feature"=>true, "receive_f"=>true, "send_f"=>true, "voice"=>true}, "sms"=>{"low_credit"=>true, "new_feature"=>true, "receive_f"=>true, "send_f"=>true, "voice"=>true}}}, "phone"=>"+9****", "status"=>"inactive", "verification_status"=>{"email"=>"unverified", "phone"=>"verified"}}, "request_json"=>{}, "tags"=>["_grokparsefailure"]}, @metadata_accessors=#<LogStash::Util::Accessors:0x6ec6acbe @store={"path"=>"/var/log/nginx/access.log"}, @lut={"[path]"=>[{"path"=>"/var/log/nginx/access.log"}, "path"]}>,   
@cancelled=false>], :response=>{"create"=>{"_index"=>"logstash-api-2016.09.24", "_type"=>"logs", "_id"=>"AVdbNisZCijYhuqEamFy", "status"=>400, "error"=>{"type"=>"mapper_parsing_exception",   

"reason"=>"failed to parse [response_json.credit]", "caused_by"=>{"type"=>"illegal_argument_exception", "reason"=>"unknown property [balance]"}}}}, :level=>:warn}

这里我在信用部分有一个如下所示的日志:

"credit": {"balance": 0.0, "currency": "usd"}

我已从Elasticsearch删除了所有索引,但我在.sincedb*或其他地方未找到任何home来删除logstash数据库。

为什么在balance值实际上没有变化时会发生此错误?这是什么原因?

  • 重新启动Logstash后,它不会聚合日志文件中的数据!

我从since_dbs_*中移除了所有/var/lib/logstash/,并表示从Logstash配置中的起始位置开始拖尾。

现在出现以下错误:

object mapping for [response_json.credit] tried to parse field [credit] as object, but found a concrete value

似乎有时候信用是作为标量值发送的,有时也会作为具有两个字段的对象发送!

EDIT1:

在Elasticsearch中,已将2个具有不同数据的不同信用字段过帐到一个信用额度。所以我尝试重命名这些字段并从logstash中的两个配置中删除信用,所以现在我有:

add_field => {"first_credit" => "%{[response_json.credit]}"}
remove_field => ["response_json.credit"]

添加了新字段,但字面值%{[response_json.credit]}并且字段未被删除,因此错误再次发生。我想获得信贷的价值并将其置于第一信贷之内并取消信贷本身。我甚至试过以下内容:

add_field => {"first_credit" => "%{[response_json][credit]}"}
remove_field => ["response_json.credit"]

我做错了什么?

修改:2
我注意到一个文件access.log的{​​{1}}字段具有不同的值。 一个credit是数字:credit
另一个2.99是JSON:{“currency”:“usd”,“balance”:2.99}

我使用以下logstash配置来解决问题,并将其全部保存为credit中的string

ES

它给出了以下错误:

if ([response_json][credit]) {
        mutate {
            add_field => {"new_credit" => "%{[response_json][credit]}"}
            remove_field => [ "[response_json][credit]" ]
        }
    }

1 个答案:

答案 0 :(得分:0)

从查看您的日志"credit"=>{"balance"=>#<BigDecimal:367dbf49,'0.19819267E4',8(12)>,我认为this issue可能与您有关。

如果您在{elasticsearch:ip}:9200/logstash-api-2016.09.24/_mapping检查索引的Elasticsearch映射,我打赌balance字段有一个Integer映射。如果最初存在整数映射,则任何非整数值(例如,对象)都将失败。

您可以通过创建将余额指定为浮点数的index template来解决此问题。如果您选择这样做,请确保删除旧索引或创建新索引,因为无法修改现有映射。

您还可以确保余额始终与日志源中的数据类型相同。

或者您可以添加mutate filter并将余额字段转换为所需的数据类型。

查看您的地图,让我知道我的理论是否正确。 :)

修改 您刚刚发送给我的代码块与以前完全相同 - 对象信用和int信用将存储在同一个字段中。以下内容将在[{1}}相同的字段中存储credit [balance](一个int)和int credit,它应该映射到一个Integer。

new_credit