想用graylog存系统的登陆日志,java代码如下:
private static void send(String host, int port, Map<String, Object> params) throws Exception {
if (SOCKET == null) {
SOCKET = new DatagramSocket();
}
InetAddress address = InetAddress.getByName(host);
String content = JSON.toJSONString(params);
DatagramPacket packet = new DatagramPacket(content.getBytes("UTF-8"), content.length(), address, port);
SOCKET.send(packet);
}
其中content
字符串如下:
{
"version":"1.1",
"host":"test.com",
"short_message":"loginLog",
"full_message":"loginLog",
"_name":"测试",
"_result":"SUCCESS:登陆成功",
"_user_id":"f69cf0a3-ad33-4b7f-b770-ea18d615f6a1",
"_username":"test",
"_ip":"192.168.1.33"
}
经过反复测试,发下一旦字段中包含了中文,就无法存储成功,但是Graylog的文档中关于GELF的描述如下:
- _[additional field] string (UTF-8) or number
every field you send and prefix with an underscore (_) will be treated as an additional field. Allowed characters in field names are any word character (letter, number, underscore), dashes and dots. The verifying regular expression is: ^[w.-]*$. Libraries SHOULD not allow to send id as additional field (_id). Graylog server nodes omit this field automatically.
即使用utf-8
编码即可。
反复尝试仍然解决不了,前来求助。
望各路大佬给点建议,万分感谢!
解决了。。 非常蠢的错误,只需把java代码改为如下:
所以问题就在于包含中文的
byte[]
长度和之前的字符串并不相同。。