ElKstack-解决nginx日志url链接包含中文logstash报错问题

logstash报错现象

Trouble parsing json {:source=>"message", :raw=>"{\"@timestamp\":\"2016-05-30T14:51:27+08:00\",\"host\":\"10.139.48.166\",\"clientip\":\"180.109.110.203\",\"request_method\":\"GET\",\"size\":4286,\"responsetime\":0.000,\"upstreamtime\":\"-\",\"upstreamhost\":\"-\",\"http_host\":\"www.xxxx.com\",\"url\":\"/favicon.ico\",\"complete_url\":\"http://www.xxxx.com/favicon.ico\",\"referer\":\"-\",\"agent\":\"\\xE7\\x99\\xBE\\xE5\\xBA\\xA6HD 4.4.1 rv:4.4.1.2 (iPad; iPhone OS 8.3; zh_CN)\",\"status\":\"200\"}", :exception=>#<LogStash::Json::ParserError: Unrecognized character escape ‘x‘ (code 120)报错信息说明:Unrecognized character escape ‘x‘

意思:无法识别的字符转义 ‘x‘

搜索这条信息:\"agent\":\"\\xE7\\x99\\xBE\\xE5\\xBA\\x

发现是URL链接包含中文后,json的时候对于字符串\\xE7,把x当做需要转义的字符,问题是,\\不是双重转义么,奇怪!

问题解决过程

交代环境

centos 6.7

logstash 1.5

nginx日志数据定义

log_format json ‘{"@timestamp":"$time_iso8601",‘

‘"host":"$server_addr",‘

‘"clientip":"$remote_addr",‘

‘"request_method":"$request_method",‘

‘"size":$body_bytes_sent,‘

‘"responsetime":$request_time,‘

‘"upstreamtime":"$upstream_response_time",‘

‘"upstreamhost":"$upstream_addr",‘

‘"http_host":"$host",‘

‘"url":"$uri",‘

‘"complete_url":"$scheme://$host$request_uri",‘

‘"referer":"$http_referer",‘

‘"agent":"$http_user_agent",‘

‘"status":"$status"}‘;

logstash定义

input {

syslog {

port => "12210"

}

}

filter {

json {

source => "message"

}

geoip {

source => "clientip"

}

}

output{

elasticsearch { host => "127.0.0.1"

index => "nginx-logs-%{+YYYY.MM.dd}"

index_type => "logs"

}

}

解决无法识别的字符转义 ‘x‘方法

使用mutte对\\x字符串进行替换,在json化之前

抽取logstash配置文件中filter片段

filter {

mutate {

gsub => ["message", "\\x", "\\\x"]

}

json {

source => "message"

}

geoip {

source => "clientip"

}

}

解释

gsub => ["message", "\\x", "\\\x"]

将message字段中,"\\x"字符串替换为"\\\x"

结果展示

logstash不再输出错误信息,complete_url展示的url链接中中文正常,url没有解析出来

分析为使用mutte处理前相同url日志

Trouble parsing json {:source=>"message", :raw=>"{\"@timestamp\":\"2016-05-30T18:21:35+08:00\",\"host\":\"10.139.48.166\",\"clientip\":\"58.250.164.208\",\"request_method\":\"GET\",\"size\":1338,\"responsetime\":0.008,\"upstreamtime\":\"0.008\",\"upstreamhost\":\"10.139.39.45:8801\",\"http_host\":\"www.qhfax.com\",\"url\":\"/aaa/\\xE6\\x88\\x91\\xE6\\x98\\xAF\\xE4\\xB8\\x80\\xE4\\xB8\\xAA\\xE4\\xBA\\xBA\",\"complete_url\":\"https://www.qhfax.com/aaa/%E6%88%91%E6%98%AF%E4%B8%80%E4%B8%AA%E4%BA%BA\",\"referer\":\"-\",\"agent\":\"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36\",\"status\":\"404\"}", :exception=>#<LogStash::Json::ParserError: Unrecognized character escape ‘x‘ (code 120)

发现:

\"complete_url\":\"https://www.qhfax.com/aaa/%E6%88%91%E6%98%AF%E4%B8%80%E4%B8%AA%E4%BA%BA\"

\"url\":\"/aaa/\\xE6\\x88\\x91\\xE6\\x98\\xAF\\xE4\\xB8\\x80\\xE4\\xB8\\xAA\\xE4\\xBA\\xBA\"

居然两条语句输出的结果都是不一致

分析nginx配置片段

‘"url":"$uri",‘

‘"complete_url":"$scheme://$host$request_uri",‘

解释:

$uri请求中的当前URI(不带请求参数,参数位于$args),不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改。不包括协议和主机名,例如/foo/bar.html

$request_uri 这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI。

也就是说:$request_uri是原始请求URL,$uri则是经过nginx处理请求后剔除参数的URL,所以会将汉字表现为union。

坑点:

使用$uri 可以在nginx对URL进行更改或重写,但是用于日志输出可以使用$request_uri代替,如无特殊业务需求,完全可以替换

时间: 2024-11-03 03:37:51

ElKstack-解决nginx日志url链接包含中文logstash报错问题的相关文章

解决nginx环境网站css文件加载报错

生产环境为LNMP,部署后网站所有的CSS样式失效.在浏览器中启用开发者工具查到以下报错信息: 样式表单:xxxxxx.css未载入,因为它的MIME类型"text/plain"不是"text/css". 解决方法: 1.修改nginx配置文件nginx.conf. 在nginx.conf文件中添加一行代码include mime.types; 2.重启nginx 3.清除缓存 经以上步骤后即可使网站正常加载css文件.

记一次 Hibernate 插入数据中文乱码报错解决

错误描述 程序运行,向表中插入数据(包含中文)报错:\xE6\xB2\x88\xE9\x9B\xAA... 但是自己另外新建一个数据库手动插入数据中文正常,同样修改数据库,表的编码之后同样不行.而且 MySQL5.7下也会出现这种情况无法解决. 问题解决 在 Hibernate 主配置文件中,我们会配置数据库方言,一般配置如下: <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect<

Ajax的底层实现--使用Ajax实现无刷新登录实例--解决ajax中URl参数带中文的乱码问题

  1.jsp代码 第一部分(html代码):前端页面 <div id="login"> 用户名: <input type="text" id="userName"/> <!--用户名--> 密码: <input type="password" id="psw"/> <!--密码--> <input type="submit&quo

解决mysql插入中文字符报错的问题ERROR 1366 (HY000): Incorrect string value: ‘\xE5\xB0\x8F\xE6\x98\x8E‘ for column ‘name‘ at row 1

原文:解决mysql插入中文字符报错的问题ERROR 1366 (HY000): Incorrect string value: '\xE5\xB0\x8F\xE6\x98\x8E' for column 'name' at row 1 报错内容: mysql> insert into person values (1,22,'小明');ERROR 1366 (HY000): Incorrect string value: '\xE5\xB0\x8F\xE6\x98\x8E' for colum

python中文注释报错问题

错误信息: SyntaxError: Non-ASCII character '\xe4' in file... 解决办法: 在文件第一行或第二行添加:# -*- coding: utf-8 -*- 参考:http://blog.csdn.net/chen861201/article/details/7706535 python中文注释报错问题,布布扣,bubuko.com

MySQL 中文insert报错Incorrect string value: &#39;\xCC\xEC\xB2\xC5&#39;

    序言:中文录入失败,报错:Incorrect string value: '\xCC\xEC\xB2\xC5',如下所示:mysql> set names utf8;Query OK, 0 rows affected (0.00 sec) mysql> insert into t select 2 as a ,'天才' as b;ERROR 1366 (HY000): Incorrect string value: '\xCC\xEC\xB2\xC5' for column 'b' a

Python中文转换报错 &#39;ascii&#39; codec can&#39;t decode byte 0xe8 in position

脚本报错: 脚本代码: 报错原因: 因为默认情况下,Python采用的是ascii编码方式,如下所示: ?? python -c "import sys; print sys.getdefaultencoding()" ascii ?? 而Python在进行编码方式之间的转换时,会将 unicode 作为“中间编码”,但 unicode 最大只有 128 那么长,所以这里当尝试将 ascii 编码字符串转换成"中间编码" unicode 时由于超出了其范围,就报出了

解决《利用python进行数据分析》P139报错问题 index must be monotonic increasing or decreasing

解决<利用python进行数据分析>P139报错问题 index must be monotonic increasing or decreasingframe.reindex(index=['a','b','c','d'],method='ffill',columns=states)报错:index must be monotonic increasing or decreasing 修改代码:把method=‘ffill’拿出来注意,是method的方法,参数ffill后面加"(

Control character in cookie value, consider BASE64 encoding your value , java操作cookie遇到中文会报错的解决方案

项目当中用到cookie保存中文,但是会报如下错误: Control character in cookie value, consider BASE64 encoding your value 大概意思是保存到cookie当中的值存在控制字符,无法保存.但实际上数据是不存在这种问题的.再看后面的那句话,好像是将要保存的值进行了base64编码,可能是因为中文在编码时出现乱码导致一些控制字符的出现.看来setCookie方法不支持保存中文(GBK)编码的样子. 解决方案:将要保存的值进行URLE