为日志格式化 protobuf
Formatting protobuf for logs
给定一个带有一个字符串字段的简单 protobuf 消息:
message Sample{
required string msg = 1;
}
和打印它的示例代码:
Sample message = Sample.newBuilder()
.setMsg("some text")
.build();
System.out.println(message);
System.out.println(message);
System.out.println(message);
此输出的结果将是:
msg: "some text"
msg: "some text"
msg: "some text"
每条消息(实际上是每个字段)都有'\n'换行符。
这显然对记录器不利。
用 Gson 序列化这个更糟糕,因为 gson 会序列化生成的许多其他字段...
{"bitField0_":1,"msg_":"some text","memoizedIsInitialized":1,"unknownFields":{"fields":{}},"memoizedSize":-1,"memoizedHashCode":0}
我们如何将 protobuf 消息转换为没有换行符的单个字符串?
消息上的 toString()
在每条消息后生成一个空行,以使 reading/separation 更容易。
为了记录整条消息,您应该使用 TextFormat.shortDebugString(message)
。如果您只想记录特定字段,请使用 message.get...()
方法。
给定一个带有一个字符串字段的简单 protobuf 消息:
message Sample{
required string msg = 1;
}
和打印它的示例代码:
Sample message = Sample.newBuilder()
.setMsg("some text")
.build();
System.out.println(message);
System.out.println(message);
System.out.println(message);
此输出的结果将是:
msg: "some text"
msg: "some text"
msg: "some text"
每条消息(实际上是每个字段)都有'\n'换行符。 这显然对记录器不利。
用 Gson 序列化这个更糟糕,因为 gson 会序列化生成的许多其他字段...
{"bitField0_":1,"msg_":"some text","memoizedIsInitialized":1,"unknownFields":{"fields":{}},"memoizedSize":-1,"memoizedHashCode":0}
我们如何将 protobuf 消息转换为没有换行符的单个字符串?
消息上的 toString()
在每条消息后生成一个空行,以使 reading/separation 更容易。
为了记录整条消息,您应该使用 TextFormat.shortDebugString(message)
。如果您只想记录特定字段,请使用 message.get...()
方法。