Làm thế nào tôi nên xử lý các lỗi logger?


12

Trong một số ứng dụng của công ty chúng tôi, chúng tôi sử dụng bộ ghi nhật ký tùy chỉnh. Nó khá mạnh mẽ, mặc dù chúng tôi có thể thay thế nó bằng một cái gì đó như NLog trong tương lai. Một trong những nhiệm vụ của logger là ghi nhật ký mọi trường hợp ngoại lệ gặp phải trong ứng dụng.

Một mối quan tâm tôi luôn có là việc xử lý ngoại lệ trong bộ ghi chép cho phép thất bại thầm lặng. Đó là, nếu nhật ký không được viết cho một ngoại lệ nhất định (do lỗi trong trình ghi nhật ký), tôi nên xử lý như thế nào và (bằng cách nào đó) ghi nhật ký ngoại lệ đó vào chính trình ghi nhật ký ?

Giả sử hàm WriteLog đưa ra một ngoại lệ. Tôi có nên thử gọi hàm số lần hay cho đến khi ngoại lệ không được ném? Tôi có nên cố gắng viết ngoại lệ ném với logger (điều này có thể sẽ dẫn đến ngoại lệ trong suốt quá trình ..)? Tôi đã may mắn không gặp phải tình huống này trừ khi chúng tôi lần đầu tiên thực hiện bộ ghi nhật ký tùy chỉnh. Mặt khác, hiện tại tôi không có cách nào để biết nếu trình ghi nhật ký không ghi nhật ký ngoại lệ của ứng dụng (do ngoại lệ của chính nó).

Tôi đã thử tìm kiếm trực tuyến và trên một số trang SE, nhưng cho đến nay tất cả đều không có kết quả vì tất cả các bài đăng đều xử lý lỗi trong một logger (nhưng không phải là ngoại lệ tiềm năng và cách đăng nhập chúng) hoặc ngoại lệ bên ngoài logger.



5
Đăng nhập vào stderrđó phương tiện đầu ra của bạn đã thất bại hoặc điều "không thể" xảy ra.
Doval

1
Gửi email cho nhà phát triển hoặc chỉ hiển thị lỗi với địa chỉ email và cho phép người dùng sao chép và dán lỗi.
Chloe

Câu trả lời:


17

Khi bạn gặp ngoại lệ trong chính logger, bạn không nên sử dụng logger để ghi lại các ngoại lệ của chính nó. Lý do cho điều đó là:

  • Bạn có thể bị mắc kẹt trong một vòng lặp vô hạn. Hãy tưởng tượng rằng trong logger của bạn, bạn có một nhánh có điều kiện chưa được kiểm tra (và tạo ra một ngoại lệ). Hãy tưởng tượng rằng một khi điều kiện được đáp ứng, bất kỳ ngoại lệ được báo cáo nào khác sẽ được xử lý bởi cùng một chi nhánh. Điều này có nghĩa là từ thời điểm nhánh được thực thi, bạn đang ở trong một vòng lặp vô hạn.

  • Bạn có thể bị mắc kẹt trong một vòng lặp tạm thời, tạo ra hàng ngàn ngoại lệ mỗi giây. Hãy tưởng tượng bạn đang báo cáo ngoại lệ cho một máy chủ từ xa. Một vấn đề với máy chủ gây ra một ngoại lệ khác, gây ra một ngoại lệ khác, v.v., cho đến khi kết nối trở lại.

Thay vào đó, những gì bạn nên làm là chuyển sang một cách an toàn hơn để ghi lại các ngoại lệ. Ví dụ: nếu logger của bạn gửi ngoại lệ đến một máy chủ từ xa, hãy gửi ngoại lệ trong logger để syslogthay thế. Nếu logger của bạn ghi lại các trường hợp ngoại lệ trong Windows Events và hành động này không thành công, hãy lưu trữ ngoại lệ lỗi trong một tệp văn bản đơn giản.

Khi bạn đã có điều đó, câu hỏi tiếp theo là làm sao bạn biết rằng những ngoại lệ đó đã xảy ra: nếu bạn có hàng tá ứng dụng chạy trên hàng ngàn máy chủ, bạn không thể SSH từng ứng dụng đó một cách thường xuyên để kiểm tra xem chúng có đang đăng nhập một cái gì đó cục bộ không .

Một cách là có một công việc định kỳ để kiểm tra các bản ghi đặc biệt đó, và đẩy chúng đến vị trí lưu trữ các ngoại lệ khác (cuối cùng sử dụng bộ ghi chép của bạn, nhưng hãy cẩn thận với các vòng lặp vô hạn hoặc tạm thời!).


Tôi gặp vấn đề tương tự với bộ ghi ngoại lệ của tôi đã đi đến e-mail. Nếu không kết nối được với máy chủ, nó sẽ rơi vào một vòng lặp vô hạn khủng khiếp. Vì vậy, thay vào đó, tôi đặt một kiểm tra tại chỗ để chuyển hướng đến Nhật ký sự kiện và ngăn các e-mail mới được gửi đi cho đến khi có thể thực hiện kết nối mới.
mgw854

Tôi nghĩ rằng chúng tôi sẽ cố gắng thực hiện một dự phòng như bạn đề xuất. Đề nghị của Jon Raynor dừng ứng dụng (trong tình huống đăng nhập quan trọng) cũng là một trong những điều chúng tôi có thể theo đuổi mà chúng tôi đã không xem xét.
Zairja

Điều gì xảy ra nếu bạn kết thúc với thời gian chờ gửi đến syslog hoặc lỗi I / O ghi vào tệp? Bạn vẫn có thể làm cho vấn đề trở nên tồi tệ hơn, nếu các lỗi là do mạng bị nghẽn hoặc hết dung lượng đĩa. Đây không hẳn là một giải pháp tổng thể; bạn cần xem xét khả năng có thể không có cách ghi nhật ký lỗi an toàn. Không có gì nguy hiểm khi đăng nhập vào trình ghi nhật ký của riêng bạn miễn là bạn kết hợp phát hiện chu kỳ, sao lưu theo cấp số nhân, v.v.
Aaronaught

11

Nếu đăng nhập là quan trọng đối với ứng dụng của bạn, thì người ta nên dừng ứng dụng nếu đăng nhập thất bại.

Nếu không quan trọng, thì việc phòng thủ phần nào có thể có một thành phần thứ cấp để xử lý các lỗi ghi nhật ký ghi nhật ký / cảnh báo vào nguồn thứ cấp. Nhưng ngay cả đó không phải là bằng chứng ngu ngốc và bạn sẽ phải xem xét điều gì sẽ xảy ra nếu bộ ghi thứ cấp bị lỗi trong khi nó đang theo dõi bộ ghi chép chính.

Một chiến lược tốt là ghi nhật ký vào tệp cục bộ và nếu thất bại, có thể ghi nhật ký thất bại đó vào nhật ký sự kiện, tạo thông báo email, lưu vào cơ sở dữ liệu, v.v ... Với các khung ghi nhật ký khả dụng, điều này sẽ không thể kiểm soát được trừ khi máy chạy ra khỏi không gian đĩa hoặc một số điều kiện hiếm gặp khác.

Tốt nhất là bạn nên thất bại trong âm thầm vì điều đó sẽ làm cho ứng dụng bớt phức tạp hơn.

Quan trọng hơn, để xử lý các lỗi đăng nhập, người ta phải theo dõi nhật ký từ bên thứ 3. Theo thời gian, bạn sẽ có thể nhận ra có bao nhiêu sự kiện mà một ứng dụng lành mạnh đang đăng nhập. Nếu nó bắt đầu đăng nhập thấp hoặc không có sự kiện, thì thông qua giám sát, bạn có thể thấy sự cố xảy ra và có khả năng cảnh báo thông qua cơ chế bên thứ 3 đó.


1
+1 để phân biệt giữa ghi nhật ký quan trọng và không quan trọng, cũng như lưu ý tầm quan trọng của số lượng nhật ký mỗi lần trôi qua. Tôi thất vọng vì tôi đã không nghĩ về hai khía cạnh đó, trong khi tôi đã sử dụng đăng nhập dự phòng trong nhiều năm.
Arseni Mourzenko
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.