2010-02-02 30 views
5

Tôi muốn để có thể sử dụng một 'grep' hoặc 'pcregrep -M' như giải pháp mà phân tích một file bản ghi phù hợp với các thông số sau:Phân tích một file log multiline chiều dài thay đổi

  • Mỗi mục nhật ký có thể nhiều dòng dài
  • dòng đầu tiên của entry bản ghi có chìa khóa mà tôi muốn tìm kiếm
  • Mỗi phím xuất hiện trên hơn sau đó một dòng

vì vậy, trong ví dụ dưới đây tôi sẽ muốn quay trở lại mỗi dòng mà h như KEY1 trên nó và tất cả các dòng hỗ trợ bên dưới nó cho đến khi thông điệp tường trình tiếp theo.

 
Log file: 
01 Feb 2010 - 10:39:01.755, DEBUG - KEY1:randomtext 
     blah 
     blah2 T 
     blah3 T 
     blah4 F 
     blah5 F 
     blah6 
     blah7 
01 Feb 2010 - 10:39:01.757, DEBUG - KEY1:somethngelse 
01 Feb 2010 - 10:39:01.758, DEBUG - KEY2:randomtest 
this is a test 
01 Feb 2010 - 10:39:01.760, DEBUG - KEY1:more logs here 
01 Feb 2010 - 10:39:01.762, DEBUG - KEY1:eve more here 
this is another multiline log entry 
keeps on going 
but not as long as before 
01 Feb 2010 - 10:39:01.763, DEBUG - KEY2:testing 
test test test 
end of key2 
01 Feb 2010 - 10:39:01.762, DEBUG - KEY1:but key 1 is still going 
and going 
and going 
and going 
and going 
and going 
and going 
and going 
and going 
and going 
and going 
and going 
and going 
okay enough 
01 Feb 2010 - 10:39:01.762, DEBUG - KEY3:and so on 
and on 
 
Desired output of searching for KEY1: 
01 Feb 2010 - 10:39:01.755, DEBUG - KEY1:randomtext 
     blah 
     blah2 T 
     blah3 T 
     blah4 F 
     blah5 F 
     blah6 
     blah7 
01 Feb 2010 - 10:39:01.757, DEBUG - KEY1:somethngelse 

01 Feb 2010 - 10:39:01.760, DEBUG - KEY1:more logs here 
01 Feb 2010 - 10:39:01.762, DEBUG - KEY1:eve more here 
this is another multiline log entry 
keeps on going 
but not as long as before 
01 Feb 2010 - 10:39:01.762, DEBUG - KEY1:but key 1 is still going 
and going 
and going 
and going 
and going 
and going 
and going 
and going 
and going 
and going 
and going 
and going 
and going 
okay enough 

Tôi đã cố gắng để làm một cái gì đó như: '(. * \ N) key1 +'
pcregrep -M logfile
nhưng chắc chắn không hoạt động đúng.

+0

Điều gì định nghĩa kết thúc của một mục nhập? Có đảm bảo rằng các dòng trong một mục nhập sẽ không bắt đầu bằng một chữ số, nhưng một dòng xác định một mục mới sẽ? –

+0

Điều này có thể dễ dàng hơn bằng cách sử dụng một tập lệnh nhỏ chứ không phải là một regex. Có lý do nào để không làm điều đó không? –

Trả lời

-1

Thêm vào câu trả lời ghostdog74 của (thank you very much btw, nó hoạt động tốt)

Bây giờ, hãy nhập dòng lệnh dưới dạng "./parse khóa tệp" và xử lý loglevels của ERROR cũng như DEBUG

 
#!/bin/bash 
awk -vkey="$2" ' 
$0~/DEBUG|ERROR/ && $0 !~key{f=0} 
$0~key{ f=1 } 
f{print} ' $1 
+2

vì vậy hãy xem xét chấp nhận câu trả lời và bạn có thể đăng câu hỏi này cùng với câu hỏi của bạn thay vì – ghostdog74

+0

Tôi sẽ nói nhưng tôi không thể chấp nhận câu trả lời của riêng tôi trong 2 ngày – Urgo

+0

Urgo, bài đăng này chỉ chỉnh sửa câu trả lời của ghostdog74. Bạn nên đánh dấu ghostdog74 là câu trả lời và chỉnh sửa câu hỏi ban đầu của bạn để thêm tinh chỉnh này. – adam

7

nếu bạn đang ở trên * nix, bạn có thể sử dụng vỏ

#!/bin/bash 
read -p "Enter key: " key 
awk -vkey="$key" ' 
$0~/DEBUG/ && $0 !~key{f=0} 
$0~key{ f=1 } 
f{print} ' file 

đầu ra

$ cat file 
01 Feb 2010 - 10:39:01.755, DEBUG - KEY1:randomtext 
     blah          
     blah2 T          
     blah3 T          
     blah4 F          
     blah5 F          
     blah6          
     blah7          
01 Feb 2010 - 10:39:01.757, DEBUG - KEY1:somethngelse 
01 Feb 2010 - 10:39:01.758, DEBUG - KEY2:randomtest 
this is a test          
01 Feb 2010 - 10:39:01.760, DEBUG - KEY1:more logs here 
01 Feb 2010 - 10:39:01.762, DEBUG - KEY1:eve more here 
this is another multiline log entry      
keeps on going           
but not as long as before        
01 Feb 2010 - 10:39:01.763, DEBUG - KEY2:testing  
test test test           
end of key2            
01 Feb 2010 - 10:39:01.762, DEBUG - KEY1:but key 1 is still going 
and going               
and going               
and going               
and going               
and going               
and going               
and going               
and going               
and going               
and going 
and going 
and going 
okay enough 
01 Feb 2010 - 10:39:01.762, DEBUG - KEY3:and so on 
and on 

$ ./shell.sh 
Enter key: KEY1 
01 Feb 2010 - 10:39:01.755, DEBUG - KEY1:randomtext 
     blah 
     blah2 T 
     blah3 T 
     blah4 F 
     blah5 F 
     blah6 
     blah7 
01 Feb 2010 - 10:39:01.757, DEBUG - KEY1:somethngelse 
01 Feb 2010 - 10:39:01.760, DEBUG - KEY1:more logs here 
01 Feb 2010 - 10:39:01.762, DEBUG - KEY1:eve more here 
this is another multiline log entry 
keeps on going 
but not as long as before 
01 Feb 2010 - 10:39:01.762, DEBUG - KEY1:but key 1 is still going 
and going 
and going 
and going 
and going 
and going 
and going 
and going 
and going 
and going 
and going 
and going 
and going 
okay enough 
0

Tôi đã có một yêu cầu tương tự và quyết định viết mã một công cụ nhỏ (trong .net) phân tích tệp nhật ký cho tôi và ghi kết quả vào đầu ra tiêu chuẩn.

Có thể bạn thấy nó hữu ích. Hoạt động trên Windows và Linux (Mono)

Xem ở đây: https://github.com/iohn2000/ParLog

Một công cụ để lọc các tập tin cho các mục bản ghi có chứa một cụ thể (regex) mẫu đăng nhập. Hoạt động với các mục nhập nhật ký đa cấp. ví dụ: chỉ hiển thị các mục nhập nhật ký từ một phiên bản công việc nhất định. Ghi kết quả vào đầu ra tiêu chuẩn. Sử dụng '>' để chuyển hướng vào một tập tin

mặc định startPattern là:

^[0-9]{2} [\w]{3} [0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3} 

này tương ứng với định dạng ngày: ví dụ: ngày 04 tháng 2 năm 2017 15: 02: 50.778

thông số là:

f:wildcard  a file name or wildcard for multiple files 
p:pattern  the regex pattern to filter the file(s) 
s:startPattern regex pattern to define when a new log entry starts 

Ví dụ:

ParLog.exe -f=*.log -p=findMe 
Các vấn đề liên quan