2017-05-08 63 views
0

我正在开发一个REST API,并且我想将所有调用写入一个csv文件。所以,我用的是opencsv库,我写了下面的代码:如何将每个请求记录到csv文件

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会发生这种情况?任何帮助表示赞赏。

+1

如果将它们记录在单独的日志文件中会更好。检查记录器集成。 – cody123

+0

但是由于请求更多,文件的数量会更多。最后,如果它是一个文件,那么如果需要,将一个文件作为csv导入数据库会很容易。 – Ricky

+0

@Ricky - 但如果你的API接收到很多调用,并且每个调用都需要等待写入CSV文件,那么它可能会成为一个严重的瓶颈。 cody123是正确的,请检查如何进行正确的日志记录。 –

回答

1

我建议的第一件事就是用FileWriter替换CSVWriter,看看你是否有同样的问题。这不应该成为一个问题,因为您并不是真的将日志记录为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(); 
     } 

的原因是,我想知道如果有一个并发的问题怎么回事,这样,只有一个线程可以被记录一次。