2017-05-08 65 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(); 
     } 

的原因是,我想知道如果有一個併發的問題怎麼回事,這樣,只有一個線程可以被記錄一次。