2017-09-28 48 views
0

我有一個文件(application.log),其中的應用程序存儲其日誌。有時候我有一個異常,我想將只有這些異常存儲在另一個文件(exception.log)中。日誌中的每一行從在這種格式的時間開始:如何grep多行堆棧跟蹤?使用我的解決方案創建已禁用的線程

[2017-28-09 10:00:00,000] Text of log number 1 
[2017-28-09 10:00:05,000] Text of log number 2 
[2017-28-09 10:00:10,000] Text of Exception number 1 
at bla bla bla 
at bla bla bla  
at bla bla bla  
at bla bla bla  
[2017-28-09 10:00:15,000] Text of log number 4 

在這種siutation到exception.log應存儲:

[2017-28-09 10:00:10,000] Text of Exception number 1 
at bla bla bla 
at bla bla bla  
at bla bla bla  
at bla bla bla 

我試圖與這樣的方法:

kill $(ps -ef | grep tail | awk '{print $2}') 
tail -f /path/to/my/application.log | pcregrep -M 'Exception[^\[]+' | while read line 
do 
(echo "$line" >> /path/to/my/exception.log) 
done & 

這個解決方案成功地完成了這項工作,但它也在我的系統中創建了許多線程和總線程數量,並大幅增加。因此,我需要使用另一種解決方案或解決「不存在問題」。

你們是否有任何想法,我該如何削減,grep或複製只有異常堆棧跟蹤到另一個文件或防止不打開已停用的線程?

+1

'tail -f /path/to/my/application.log | awk'/\[.*\]/{d=0;如果($ 0〜「Exception」)d = 1} d'>>/path/to/my/exception.log'爲你工作? – CWLiu

+0

這完全是我要求的!謝謝:-) –

+0

@CWLiu嗯......現在我注意到,它也趕上最後一行(我的意思是「[2017-28-09 10:00:15,000]日誌編號4的文本」)。我如何更改此代碼以僅使用Exception編寫行,而不使用next。 –

回答

2
$ cat test.txt 
[2017-28-09 10:00:00,000] Text of log number 1 
[2017-28-09 10:00:05,000] Text of log number 2 
[2017-28-09 10:00:10,000] Text of Exception number 1 
at bla bla bla 
at bla bla bla  
at bla bla bla  
at bla bla bla  
[2017-28-09 10:00:15,000] Text of log number 4 

$ awk '/\[.*\]/{d=0; if($0 ~ "Exception")d=1}d' test.txt 
[2017-28-09 10:00:10,000] Text of Exception number 1 
at bla bla bla 
at bla bla bla  
at bla bla bla  
at bla bla bla 
+0

你說得對,現在是我的錯。一切都很好,謝謝:-) –

0

告訴grep在匹配以空格開頭的行之前打印一行。

grep -B1 '^ ' 
+0

這不是我所要求的,但感謝您嘗試支持 –

+0

對於您的問題中的示例數據,它是您所要求的。它會生成與您接受的答案完全相同的輸出。如果它不能解決您的問題,那麼您的問題與您的問題不符。 – ceving

0

下面是@CWLiu溶液和種解決方案,而 「尾-f」。容易,但可用和有沒有殭屍進程或尾-f命懸一線了:

#!/bin/bash 

# Below I checked if last.log file exists 
if [ ! -f /path/to/my/last.log ]; then 
    echo "" > /path/to/my/last.log 
fi 

# Thanks @CWLiu again for your below solution 
awk '/\[.*\]/{d=0; if($0 ~ "Exception")d=1}d' /path/to/my/application.log > /path/to/my/now.log 

# Creation differential file - now.log stores all exceptions, last.log stores all exceptions from previous check 
diff /path/to/my/now.log /path/to/my/last.log > /path/to/my/tmp.log 
diff /path/to/my/last.log /path/to/my/now.log | grep ">" | tr -d '>' >> /path/to/my/exception.log 

現在我可以在crontab中添加此文件的執行,檢查,即每分鐘,如果發生一些異常:

* * * * * /path/to/my/file.sh