面向運維編程?我們小組里的明輝同學做到了,他對面是世偉同學,世偉是我們技術團隊的運維大哥,明輝同學每天編程都面對著世偉,
這里的運維可不是指運維同學,而是說,我們的系統在生產運行程序中的維護(System Maintenance)作業,通常理解為代碼調優、日志埋點、問題排查等作業,

今天下午,系統運營群里反映問題,我們查看生產日志排查問題時,發現有大文本日志不停在刷屏,嚴重干擾了我們對問題的定位,

大日志刷屏現(wèn)象(tí)由來已久,生產環境每天都在列印海量的log,日志檔案動輒10G或20G,這些大文本通常是一些api介面簽名串、資料加密串、圖片檔案base64串/hex串、從db或rpc介面拿到的list序列化串,
我們做任何事情,其實是要考慮成本的,生產排障尤其衡量時間成本,長時間定位不到原因,無法及時反饋和修復,小問題也可能會升(yǎn)級(biàn)為生產事故,
因此,我們在日常編碼時,不要忽視這些細節,對于記日志,有必要關注目標物件是否會輸出一大段很長很長的文本,如果是,那么,就要做處理,
舉個例子,下面兩段代碼,一個是springmvc介面,程式列印獲取到的請求引數,一個是程式在呼叫外部API時,呼叫前后列印資料報文,這兩塊的通信報文均涉及到大欄位,就要對其做處理,
@RequestMapping(value = "https://www.cnblogs.com/common.do", method = RequestMethod.POST) public void doBusiness(@RequestBody String reqJson, HttpServletRequest request, HttpServletResponse response) throws IOException { log.info("商戶API前置請求,請求引數={}", reqJson); .... }
logger.info("OCR識別請求地址:{},引數:{}", listAuthUrl , json);
Response response = FastHttpClient.
post().
addHeader("Content-Type", "application/json").
body(json).
url(listAuthUrl.get(0).getCode()).
build().
execute();
String result = response.body().string();
logger.info("OCR識別回傳:" + result);
小改動,大受益!
上面reqJson和json都是包含了長文本的json串,那么,對于這種情況,怎么處理呢?
簡單粗暴的方式,是直接利用subString截取指定長度的子串,弊端是可能會舍掉必要的資訊,反而不利于生產排障,
另一種方式,則是將其中特定的大文本進行截取,如下StringUtil方法可供參考,
/** * 截取json字串中的大文本 * @param jsonStr 含有特長value的JSON字串 * @return */ public static String cutLongJSONString(String jsonStr) { String[] split = jsonStr.split("\""); System.out.println(split.length); for (int i = 0; i < split.length; i++) { if (split[i].length() > 100) { split[i] = cutLongString(split[i], 128); } } return String.join("\"", split); } /** * 截取大文本字串, * 本方法會包含原串的長度,如果不關注,則可直接使用{@link org.apache.commons.lang3.StringUtils#abbreviate(String, int)}或其多載方法 * @param longString * @param length * @return */ public static String cutLongString(String longString, int length) { if(StringUtils.isBlank(longString)){ return ""; } StringBuilder sb=new StringBuilder(); if (longString.length()>length){ sb.append(longString, 0, length).append("...(length=").append(longString.length()).append(")"); return sb.toString(); } return longString; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/374384.html
標籤:其他
