如何将每个请求记录到 csv 文件
How to log each request to a csv file
我正在开发 REST API,我想将所有调用写入一个 csv 文件。所以我使用 opencsv 库并编写了以下代码:
CSVWriter writer;
Map<String, Object> resultMap = new HashMap<String, Object>();
@RequestMapping(value="/data",produces={MediaType.APPLICATION_JSON_VALUE},method=RequestMethod.GET)
public ResponseEntity<Map<String, Object>> getdata(@RequestParam("id")int id,@RequestParam("user")String user) throws IOException{
String[] log = new String[1];
log[0]=id+","+"+user+","+new Timestamp(System.currentTimeMillis())+",";
writer.writeNext(log);
writer.flushQuietly();
//....rest code here
return new ResponseEntity<Map<String, Object>>(resultMap,HttpStatus.OK);
}
但这只打印了一些,并没有打印所有对 csv.Why 的请求,这会发生吗?感谢任何帮助。
我建议的第一件事就是将 CSVWriter 替换为 FileWriter,看看您是否遇到同样的问题。这应该不是问题,因为您并不是真正记录为 csv 文件,而是一个包含一列逗号的 csv 文件。
你们的服务是多线程的吗?如果是这样,请更改您的代码,以便 csv 日志记录部分在同步块中完成:
synchronize(this) {
String[] log = new String[3];
log[0] = id;
log[1] = user;
log[2] = new Timestamp(System.currentTimeMillis());
writer.writeNext(log);
writer.flushQuietly();
}
原因是我想知道是否存在并发问题,这样一次只能记录一个线程。
我正在开发 REST API,我想将所有调用写入一个 csv 文件。所以我使用 opencsv 库并编写了以下代码:
CSVWriter writer;
Map<String, Object> resultMap = new HashMap<String, Object>();
@RequestMapping(value="/data",produces={MediaType.APPLICATION_JSON_VALUE},method=RequestMethod.GET)
public ResponseEntity<Map<String, Object>> getdata(@RequestParam("id")int id,@RequestParam("user")String user) throws IOException{
String[] log = new String[1];
log[0]=id+","+"+user+","+new Timestamp(System.currentTimeMillis())+",";
writer.writeNext(log);
writer.flushQuietly();
//....rest code here
return new ResponseEntity<Map<String, Object>>(resultMap,HttpStatus.OK);
}
但这只打印了一些,并没有打印所有对 csv.Why 的请求,这会发生吗?感谢任何帮助。
我建议的第一件事就是将 CSVWriter 替换为 FileWriter,看看您是否遇到同样的问题。这应该不是问题,因为您并不是真正记录为 csv 文件,而是一个包含一列逗号的 csv 文件。
你们的服务是多线程的吗?如果是这样,请更改您的代码,以便 csv 日志记录部分在同步块中完成:
synchronize(this) {
String[] log = new String[3];
log[0] = id;
log[1] = user;
log[2] = new Timestamp(System.currentTimeMillis());
writer.writeNext(log);
writer.flushQuietly();
}
原因是我想知道是否存在并发问题,这样一次只能记录一个线程。