2010-09-28 28 views
9

Tôi đang làm việc với ứng dụng Java kế thừa không có ghi nhật ký và chỉ in tất cả thông tin vào bảng điều khiển. Hầu hết các trường hợp ngoại lệ cũng được "xử lý" bằng cách thực hiện lệnh gọi printStackTrace().Cụm từ thông dụng để phân tích cú pháp tệp nhật ký và tìm stacktraces

Tóm lại, tôi vừa chuyển hướng các luồng System.out và System.error thành tệp nhật ký và bây giờ tôi cần phải phân tích cú pháp tệp nhật ký đó. Cho đến nay tất cả đều tốt, nhưng tôi đang gặp sự cố khi phân tích tệp nhật ký cho các dấu vết ngăn xếp.

Một số mã bị che khuất là tốt, vì vậy tôi cần chạy stacktraces thông qua một ứng dụng tiện ích để loại bỏ chúng. Tôi đang cố gắng tự động hóa tất cả điều này.

Gần nhất tôi đã đi cho đến nay là để có được dòng ngoại lệ ban đầu sử dụng này:

.+Exception[^\n]+ 

Và việc tìm kiếm "ở .. (..)" dòng sử dụng:

(\t+\Qat \E.+\s+)+ 

Nhưng tôi không thể tìm ra cách để đặt chúng lại với nhau để có được stacktrace đầy đủ.

Về cơ bản, tệp nhật ký trông giống như sau. Không có kết cấu cố định và các đường trước và sau khi chồng dấu vết là hoàn toàn ngẫu nhiên:

Modem ERROR (AT 
Owner: CoreTalk 
) - TIMEOUT 
IN [] 
Try Open: COM3 


javax.comm.PortInUseException: Port currently owned by CoreTalk 
    at javax.comm.CommPortIdentifier.open(CommPortIdentifier.java:337) 
... 
    at UniPort.modemService.run(modemService.java:103) 
Handling file: C:\Program Files\BackBone Technologies\CoreTalk 2006\InputXML\notify 
java.io.FileNotFoundException: C:\Program Files\BackBone Technologies\CoreTalk 2006\InputXML\notify (The system cannot find the file specified) 
    at java.io.FileInputStream.open(Native Method) 
... 
    at com.gobackbone.Store.a.a.handle(Unknown Source) 
    at com.jniwrapper.win32.io.FileSystemWatcher.fireFileSystemEvent(FileSystemWatcher.java:223) 
... 
    at java.lang.Thread.run(Unknown Source) 
Load Additional Ports 
... Lots of random stuff 
IN [] 

[Fatal Error] .xml:6:114: The entity name must immediately follow the '&' in the entity reference. 
org.xml.sax.SAXParseException: The entity name must immediately follow the '&' in the entity reference. 
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source) 
... 
    at com.gobackbone.Store.a.a.run(Unknown Source) 

Trả lời

8

Hình như bạn chỉ cần dán chúng lại với nhau (và sử dụng một dòng mới như keo):

.+Exception[^\n]+\n(\t+\Qat \E.+\s+)+ 

Nhưng tôi sẽ thay đổi regex của bạn một chút:

^.+Exception[^\n]++(\s+at .++)+ 

này kết hợp các khoảng trắng giữa các dòng at... và sử dụng các định lượng sở hữu để tránh lùi lại.

+0

Điều đó sẽ chỉ tìm thấy dòng "đầu tiên" đầu tiên chứ không phải tất cả chúng. –

+0

Bạn đã thử chưa? Đó là những gì cuối cùng '+' là cho. Hoặc có thể có một cái gì đó giữa các "tại" dòng (là những '...' hiện diện trong các tập tin đăng nhập thực tế)? Ngoài ra, trong văn bản ví dụ của bạn (ít nhất là được đăng ở đây), các dòng "tại" bắt đầu bằng dấu cách, không phải các tab. Regex thứ hai của tôi nên đã xử lý này, mặc dù. –

+0

Xin lỗi, tôi không thấy dòng thứ hai vì lý do nào đó ... Sử dụng: ^. + Ngoại lệ [^ \ n] ++ (\ s + tại. ++) + Tôi không nhận được bất kỳ kết quả phù hợp nào. .. ++ làm gì? Đó có phải là cách viết tắt của: (^. + Ngoại lệ [^ \ n] +) + ((\ s + tại. +) +) + –

3

Chúng tôi đã được sử dụng ANTLR để giải quyết những phân tích của log (trong một khu vực ứng dụng khác nhau). Nó không phải là tầm thường nhưng nếu đây là một nhiệm vụ quan trọng cho bạn nó sẽ tốt hơn so với sử dụng regexes.

+0

Nó không phải là đặc biệt quan trọng, chỉ là một cái gì đó tôi đang làm trong thời gian rảnh của tôi để làm cho nó dễ dàng hơn cho chúng tôi để đọc các tập tin đăng nhập khi chúng ta cần phải hỗ trợ khách hàng. ANTLR có vẻ như quá mức cần thiết. –

+0

@ peter.murray.rust có lẽ bạn có một ví dụ làm thế nào để phân tích cú pháp stacktraces từ log wile sử dụng ANTLR? – kuldarim

0

tôi nhận được kết quả tốt bằng

perl -n -e 'm/(Exception)|(\tat)/ && print' /var/log/jboss4.2/debian/server.log 

Nó bãi tất cả các dòng có ngoại lệ hay \ tat trong đó. Kể từ khi trận đấu là trong cùng một thời gian thứ tự được giữ.

Các vấn đề liên quan