上下文 - 每天为外部 REST 调用生成应用程序日志文件。我正在尝试解析日志文件并提取与外部 REST 调用相关的信息。提取的信息包括 Rest Call 的 StartTime、收到响应时的 EndTime、有效负载等。这些信息是为瀑布图中的特定会话收集和整理的,以便可视化每次调用花费了多少时间。
问题 - 对于其中一个日志文件,特定会话的整理信息超过 16MB,因此我必须使用 GridFS。 REST 调用信息收集在自定义对象中。我序列化对象并上传到 GridFS。在 jupyter notebook 上,我正在提取数据,但是数据有一些额外的字符。在下面的示例中,我已将对象转换为字符串(想法是在 python 中使用 json.loads),但是当我在 python 中提取时,我得到以下 -
提取-
import javaobj.v2 as javaobj
pObj = javaobj.loads(fs.get(record['calls']).read())
pObj.dump()
转储指令的输出是-
'[String 7e0000: \'[{"tokenId":"a6fc52b3-0c60-4332-b866-09f3fe8b243f","responseTime":540.2587,"requestPayload":null,"responsePayload":"{\\\\"Identifiers\\\\":[{\\\\"Name\\\\":\\\\"XXXX MANAGEMENT LLC-CISA\\\\",\\\\"Number\\\\":\\\\"0012345\\\\",\\\\"SubNumber\\\\":\\\\"00099\\\\",\\\\"Sourceode\\\\":null,\\\\"SourceGroups\\\\":null,\\\\"IsPrimary\\\\":false}],\\\\"serviceConsumerId\\\\":\\\\"YYY\\\\",\\\\"serviceConsumerSystemId\\\\":\\\\"001\\\\",\\\\"service ....
字符串作为转义字符的斜线太多,然后以文本“String 7e0000”开头。显然 json.loads 在 python 中会失败。
下面是我用来序列化对象和存储的代码-
自定义对象转String的方法
public static String convertToString(ArrayList<LogStructure> logs){
StringBuilder sBuilder = new StringBuilder();
sBuilder.append("[");
for (LogStructure log: logs){
sBuilder.append(getString(log));
sBuilder.append(",");
}
return sBuilder.toString();
}
public static String getString(LogStructure log){
StringBuilder sBuilder = new StringBuilder();
sBuilder.append("{logLevel:");
sBuilder.append(log.logLevel);
sBuilder.append(",logInjestionDateTime:");
sBuilder.append(log.logInjestionDateTime);
sBuilder.append(",serverName:");
sBuilder.append(log.serverName);
sBuilder.append(",serviceName:");
sBuilder.append(log.serviceName);
sBuilder.append(",serviceEndPoint:");
sBuilder.append(log.serviceEndPoint);
sBuilder.append(",startTime:");
sBuilder.append(log.startTime);
sBuilder.append(",endTime:");
sBuilder.append(log.endTime);
sBuilder.append(",responseTime:");
sBuilder.append(log.responseTime);
sBuilder.append(",message:");
sBuilder.append(log.message);
sBuilder.append(",endTime:");
sBuilder.append(log.endTime);
sBuilder.append(",requestId:");
sBuilder.append(log.requestId);
sBuilder.append(",tokenId:");
sBuilder.append(log.tokenId);
sBuilder.append(",userId:");
sBuilder.append(log.userId);
sBuilder.append(",requestPayload:");
sBuilder.append(log.requestPayload);
sBuilder.append(",responsePayload:");
sBuilder.append(log.responsePayload);
sBuilder.append(",payloadType:");
sBuilder.append(log.payloadType);
sBuilder.append("}");
return sBuilder.toString();
}
在 App.java 中上传到 GridFs
JSONArray list = new JSONArray();
for(LogStructure temp: tempObject){
totalCalls++;
JSONObject obj = new JSONObject();
//BasicDBObject basicDBObject = new BasicDBObject();
obj.put("logLevel", temp.logLevel);
obj.put("logInjestionDateTime", temp.logInjestionDateTime);
obj.put("serverName", temp.serverName);
obj.put("serviceName", temp.serviceName);
obj.put("serviceEndPoint", temp.serviceEndPoint);
obj.put("startTime", temp.startTime);
obj.put("endTime", temp.endTime);
obj.put("responseTime", temp.responseTime);
obj.put("message", temp.message);
obj.put("requestId", temp.requestId);
obj.put("tokenId", temp.tokenId);
obj.put("requestPayload", temp.requestPayload);
obj.put("responsePayload", temp.responsePayload);
obj.put("payloadType", temp.payloadType);
list.add(obj);
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos;
try {
oos = new ObjectOutputStream(baos);
oos.writeObject(list.toJSONString());
oos.flush();
oos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
InputStream is = new ByteArrayInputStream(baos.toByteArray());
// ObjectOutputStream is = new ObjectOutputStream(null);
GridFSBucket gridFSBucket = mongo.getGridFsBucket(mDb, "Logs");
ObjectId objectId = mongo.uploadToGrid(is, gridFSBucket);
doc.append("totalCalls", totalCalls);
doc.append("calls", objectId);
mongo.insertDocument(mCollection, doc);
我参考了以下链接来了解 GridFs 和对象的序列化。
https://mongodb.github.io/mongo-java-driver/3.5/driver/tutorials/gridfs/ https://howtodoinjava.com/java/serialization/custom-serialization-readobject-writeobject/ https://www.baeldung.com/java-serialization
目前Java在Mongo中存储和提取的方式,有一些与Java相关的特定文本。例如,第一次尝试是按原样序列化 ArrayList 对象,但是当我在 python 中提取数据时,字符串具有“System.*.ArrayList”。然后我尝试使用 simple.json 库将数据存储为 JsonObject。默认序列化具有对象的内存地址。然后我使用 toJsonString 方法并尝试保存为字符串,期望最终字符串为 pattern
"{"key": [{"key1":value},{"key2":value}]}"
这将允许我使用 json.loads 函数并获取字典。