Troubleshooting時,常常會遇到一種情況,問題的發生點一開始就已經確立了,但是光從單一log中無法看出明確的root cause,需要把OS或是與其他的應用程式的log來做時序上的對比。
例如以下的HW log:
log的順序是由新到舊,這裡我們想了解當按下Power button後到HW watchdog timeout發生之間,
system firmware有什麼異常log,但是打開system firmware log後,log的順序上卻是由舊到新。
而且timestamp的格式也不太相同。
這裡善用notepad++內建的功能可以幫我們優化很多觀看與比對log的體驗。
log reverse
log的記錄通常都是以時間順序來排序,但是不同的工具或是軟體紀錄的順序卻時常會不同。
有些偏好最新的log在上方,有些則偏好最舊的log在上方。
這裡我們讓原來的HW log變成跟system firmware log一致,方便比對。
在notepad++的"Edit"選單中,點入"Line Operations"可以看到"Reverse Line Order"。
點選之後便會將整份文件的上下順序顛倒
timestamp一致化
不同的log之間,timestamp的記錄方式也會大有不同,從影響最小的月份用Mar代表3月,年/月/日順序不同開始,甚至是像linux中使用1970年起算的總秒數表示法,或是不同系統間因為UTC設定不同而需要加減時數的情況都有。
這裡只使用notepadd++ 進行相對單純的文字置換與格式順序對調,表示法不同或是需要加減時數的情況我還是建議先將log以linux中的date指令做格式轉換後再觀看,比較直覺。
我們的目標是將Mar/31/2019這樣的格式,透過notepad++改為和system firmware log一樣的2019-03-31
首先按下"CTRL+H",叫出搜尋與取代的選單
這裡由於使用的是條件式的搜尋與取代的功能,需要從一般的搜尋模式切換成下方"Search Mode"中的,"Regular expression"模式
Regular expression又叫做正規表示式是一個很多語言或是工具中都有支援的表示方式,其語法通常也是共用的。這裡只簡單提一下我們會使用到的表示方法,相關的網路資源很多,就不在這裡佔篇幅了。
我們搜尋的對象(Mar/31/2019)以正規表示法來表示的話就是(\w\w\w)/(\d\d)/(\d\d\d\d)
\w: matches any word character (equivalent to [a-zA-Z0-9_])
\d: matches a digit (equivalent to [0-9])
/: matches a / (屬於特殊符號,因此使用時需要在前方加上跳脫字元以識別)
(): Capturing Group (對於match的對象做grouping,可使用多個grouping時,依使用先後從1開始編號)
不確定的人可以到以下的網站測試你的正規表示式:
https://regex101.com/
先在下方輸入你要match的字串
接著在上頭打上剛剛的正規表示法
如果語法的使用上有不了解的地方,網頁的右方還有語法詳細的解說。
也提供了搜尋的功能,讓你根據語法的說明來挑選使用對象。
在網頁上確認語法正確後,將它填入notepad++的"find what",
replace的地方則需要填入grouping的變數名稱。
以日期Mar/31/2019為例,月的部分就是第1個變數
日的部分就是第2個變數
年的部分就是第3個變數
填入時只要記得變數的表示方式為${},再來依想要的順序以及分隔符號做結合就可以了。
因此,replace with的部分寫成${3}-${1}-${2},就會成為我們想要的(年-月-日)的格式。
最後按下右方的"Replace All"
可以看到下方提示,一共有392個內容已經變更。
文件並列比對
再來只剩下版面的調整,首先在兩個log同時已經在notepad++中開啟的情況下,針對其中一個檔案的分頁標籤按滑鼠右鍵,在"Move document"的選單下,點選"Move to other view"
可以看到notepad++的視窗多出了一個中央分隔線,如果要將被分隔出去的文件再結合回去的話,只要再操作一次"Move to other view"就可以恢復了。
再來便是將左右兩份log,依據timestamp將想比對的第一筆log在自己的視窗置頂,這裡以HW log的2019-03-31的3點17分為例:
左方的HW log便要將第307筆log置頂,而右方的system firmware log因為在同一時間沒有對應的記錄,因此我選擇對應的行號為8314,是最接近這個時間的log
再來從notepad++選單,打開"View"裡頭有一個"Synchronize Vertical Scrolling"的功能
兩邊的視窗便會一起捲動,如此一來就能在log時間順序與格式都一致的情況下觀看兩者的關連性了。