服務宕機,修復數(shù)據(jù)?一招搞定,讓你快速批量處理!

場景:線上服務因為某些原因宕機了n小時,導致一大堆的數(shù)據(jù)有問題,日志中有把關鍵信息打出來,問如何修復數(shù)據(jù)?

思路:把日志中所有的關鍵信息都找出來,然后重新處理消息,比如消費者重新消費。那么問題就是:怎么把所有的消息都找出來?下面根據(jù)日志的存儲介質分兩種情況講解。

一、日志在服務器的log文件中

1. 根據(jù)關鍵字定位某條日志
16:10:16.909 [ERROR] [Thread: http-nio-9530-exec-6340] com.xxx.xxx.xxx.xx.web.controller.PayController:165 
- PAY refundOrderV3 fail, dbId = 11111, refundReq={"orderid":1111,"refundid":0,"refundFee":540,"reason":
"xxxx","payway":null,"mchid":null,"appid":null,"orderidPrefix":null}, responseMap = {"refundFee":"540",
"orderid":"1111","refundorderid":"1111","transactionid":"1111"}

假如我們根據(jù)相關的id定位到了這樣一段日志,現(xiàn)在我們要找出所有報這個錯的日志,并且把 refundReq=后面那串json給截取下來,有了這串json,我們就可以重新去請求 refundOrderV3方法。

2. 找出所有報這個錯的日志
cat xxx-error.log.xxx | grep  'PayController:165 - PAY refundOrderV3 fail'

我們直接cat對應日期的日志文件,然后grep關鍵字即可,這樣就會列出所有報這個錯的日志。

3. 截取日志

但其實我們要的不是這一整段日志,而是要refundReq=之后,responseMap之前的那一串json,所以要對日志進行截取。那么可以使用 awksed命令。

方式一:cat xxx-error.log.xxx  | grep 'PayController:165 - PAY refundOrderV3 fail' | awk -F 'refundReq=' '{print $2}' | sed 's/, responseMap.*//'
方式二:cat xxx-error.log.xxx | grep 'PayController:165 - PAY refundOrderV3 fail' | awk -F 'refundReq=' '{print $2}' | awk -F ', responseMap' '{print $1}'

這里解釋一下這條命令的意思,先grep命令拿到所有報這個錯的日志,用 awk -F '分割標志' '{print $需要分割的第幾段}'命令進行分割,這里就是根據(jù)refundReq=分割,在它之前的是1,之后的是2,我們要取之后的,因此是{print $2},拿到的結果就是:

{"orderid":1111,"refundid":0,"refundFee":540,"reason":"xxxx","payway":null,"mchid":null,"appid":null,"orderidPrefix":null}, 
responseMap = {"refundFee":"540","orderid":"1111","refundorderid":"1111","transactionid":"1111"}

我們還想把, responseMap之后的內容去掉,兩種思路:

  • , responseMap之后的內容替換成空白字符,即用sed命令實現(xiàn)。sed 's/內容/新內容/',要替換的是 , responseMap之后的所有內容,那就用, responseMap.*,新內容是空白字符,所以直接空著就行,因此就是:sed 's/, responseMap.*//'
  • 針對第一次awk拿到的內容,再awk分割一下,根據(jù), responseMap分割,這次我們要取它之前的內容,因此是awk -F ', responseMap' '{print $1}'
    這樣就可以輕松拿到所有所需要的json串了。
4. 輸出到文件

直接用 > xxx.log命令,將剛才命令的執(zhí)行結果輸出到xxx.log文件中。

cat xxx-error.log.xxx  | grep 'PayController:165 - PAY refundOrderV3 fail' | awk -F 'refundReq=' '{print $2}' | sed 's/, responseMap.*//' > xxx.log

拿到這個文件,就好處理了,可以用notepad++之類的工具,根據(jù)需要進行操作,比如在每一行的前面加 curl 之類的命令,然后文件名改成 xxx.sh,回傳到服務器執(zhí)行就好了。

二、日志在clickhouse中

有人可能要問了,日志在clickhouse中,用不了 linux 的命令,咋整?別慌,問題不大。

1. 查找日志,導出到文件
image.png

比如根據(jù)關鍵字找到的日志如上圖所示,我們要截取 msg=后面的那一串,首先點擊左上角的雙箭頭,進入如下頁面:

image.png

點擊搜索,就會出現(xiàn)一個表格,然后點左上角第四個圖標,就會導出一個文件。導出之后,其實我們只要message那一列即可,所以我們復制那一列到一個新的excel中。
所有的message

這個時候,我要截取 msg=之后,,errMsg之前的內容,那么可以用excel的midfind函數(shù)實現(xiàn),mid函數(shù)語法:=MID(①在哪列截取,②從第幾個開始,③截取的長度);find函數(shù)語法:find("查找的內容", 查找的列)。直接在第二列輸入=MID(A1, FIND("msg=", A1) + LEN("msg="), FIND(", erroMsg:", A1) - FIND("msg=", A1) - LEN("msg=")),這個意思就是對A1列的內容做截取操作,FIND("msg=", A1) + LEN("msg=")表示從msg=后面開始截取,FIND(", erroMsg:", A1) - FIND("msg=", A1) - LEN("msg=")表示截取的長度就是:從開始到, erroMsg:的長度減去從開始到msg=的長度,最后還要減去msg=本身的長度。這樣就截取到了需要的內容了,接下來的操作就和上面一樣了。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 文章轉發(fā)自專業(yè)的Laravel開發(fā)者社區(qū),原始鏈接:https://learnku.com/laravel/t/3...
    summerbluet閱讀 1,108評論 0 10
  • 前言 這兩天自己挽起袖子處理日志,終于把AWK給入門了。其實AWK的基本使用,學起來也就半天的時間,之前總是靠同事...
    classtag閱讀 2,458評論 0 3
  • 【腳本1】打印形狀 打印等腰三角形、直角三角形、倒直角三角形、菱形 【腳本2】截取字符串 現(xiàn)有一個字符串如下: h...
    學無止境_9b65閱讀 554評論 0 1
  • KICKSTART無人值守安裝 導言 作為中小公司的運維,經(jīng)常會遇到一些機械式的重復工作,例如:有時公司同時上線幾...
    學無止境_9b65閱讀 700評論 1 1
  • 一、涉及命令及知識分析 1.1解題思想探討 拿到一個題,或者接手一項任務,我們首先應該怎么做? PMP學習舉例,辦...
    溫東閱讀 3,525評論 2 4

友情鏈接更多精彩內容