Cập nhật: Để biết các tiện ích mở rộng cho System.Diagnostics, cung cấp một số trình nghe bị thiếu mà bạn có thể muốn, hãy xem Essential.Diagnostics trên CodePlex ( http://essentialdiagnostics.codeplex.com/ )
Khung
Q: Những khung công tác nào bạn sử dụng?
A: System.Diagnostics.TraceSource, được tích hợp sẵn trong .NET 2.0.
Nó cung cấp khả năng ghi nhật ký hiệu năng cao, linh hoạt, mạnh mẽ cho các ứng dụng, tuy nhiên nhiều nhà phát triển không nhận thức được khả năng của nó và không tận dụng hết chúng.
Có một số lĩnh vực mà chức năng bổ sung hữu ích hoặc đôi khi chức năng tồn tại nhưng không được ghi chép rõ ràng, tuy nhiên điều này không có nghĩa là toàn bộ khung ghi nhật ký (được thiết kế để có thể mở rộng) nên được loại bỏ và thay thế hoàn toàn như một số lựa chọn thay thế phổ biến (NLog, log4net, Common.Logging, và thậm chí là EntLib Logging).
Thay vì thay đổi cách bạn thêm các báo cáo ghi nhật ký vào ứng dụng của mình và phát minh lại bánh xe, chỉ cần mở rộng khung System.Diagnostics ở một vài nơi bạn cần.
Đối với tôi, các khung công tác khác, thậm chí EntLib, chỉ đơn giản là bị Hội chứng không phát minh ở đây và tôi nghĩ rằng họ đã lãng phí thời gian để phát minh lại những điều cơ bản đã hoạt động hoàn hảo trong System.Diagnostics (như cách bạn viết báo cáo nhật ký), thay vì điền vào một vài khoảng trống tồn tại. Nói tóm lại, đừng sử dụng chúng - chúng không cần thiết.
Các tính năng bạn có thể chưa biết:
- Sử dụng quá tải TraceEvent có chuỗi định dạng và đối số có thể giúp hiệu suất khi các tham số được giữ dưới dạng tham chiếu riêng cho đến khi Filter.ShouldTrace () thành công. Điều này có nghĩa là không có cuộc gọi đắt đến ToString () trên các giá trị tham số cho đến khi hệ thống đã xác nhận thông báo sẽ thực sự được ghi lại.
- Trace.CorrelationManager cho phép bạn tương quan các báo cáo nhật ký về cùng một hoạt động logic (xem bên dưới).
- VisualBasic.Logging.FileLogTraceListener rất tốt để ghi vào tệp nhật ký và hỗ trợ xoay tệp. Mặc dù trong không gian tên VisualBasic, nó có thể dễ dàng được sử dụng trong dự án C # (hoặc ngôn ngữ khác) chỉ bằng cách bao gồm DLL.
- Khi sử dụng EventLogTraceListener nếu bạn gọi TraceEvent với nhiều đối số và với chuỗi định dạng trống hoặc null, thì các đối số được chuyển trực tiếp đến EventLog.WriteEntry () nếu bạn đang sử dụng tài nguyên thông báo cục bộ.
- Công cụ Trình theo dõi dịch vụ (từ WCF) rất hữu ích để xem biểu đồ của các tệp nhật ký tương quan hoạt động (ngay cả khi bạn không sử dụng WCF). Điều này thực sự có thể giúp gỡ lỗi các vấn đề phức tạp trong đó có nhiều chủ đề / hoạt động có liên quan.
- Tránh chi phí bằng cách xóa tất cả người nghe (hoặc loại bỏ Mặc định); nếu không, Mặc định sẽ chuyển mọi thứ cho hệ thống theo dõi (và phải chịu tất cả các chi phí ToString () đó).
Các khu vực bạn có thể muốn xem xét mở rộng (nếu cần):
- Cơ sở dữ liệu theo dõi người nghe
- Bảng điều khiển theo dõi màu
- Trình nghe theo dõi MSMQ / Email / WMI (nếu cần)
- Triển khai FileSystemWatcher để gọi Trace.Refresh để thay đổi cấu hình động
Các khuyến nghị khác:
Sử dụng id của sự kiện có cấu trúc và giữ một danh sách tham chiếu (ví dụ: ghi lại chúng trong enum).
Có id sự kiện duy nhất cho mỗi sự kiện (quan trọng) trong hệ thống của bạn là rất hữu ích để tương quan và tìm kiếm các vấn đề cụ thể. Thật dễ dàng để theo dõi lại mã cụ thể ghi nhật ký / sử dụng id sự kiện và có thể giúp dễ dàng cung cấp hướng dẫn cho các lỗi phổ biến, ví dụ lỗi 5178 có nghĩa là chuỗi kết nối cơ sở dữ liệu của bạn bị sai, v.v.
Id sự kiện nên tuân theo một số loại cấu trúc (tương tự như Lý thuyết về mã trả lời được sử dụng trong email và HTTP), cho phép bạn xử lý chúng theo danh mục mà không cần biết mã cụ thể.
vd Vân vân.
Chữ số thứ hai có thể chi tiết khu vực, ví dụ 21xx cho thông tin cơ sở dữ liệu (41xx cho cảnh báo cơ sở dữ liệu, 51xx cho lỗi cơ sở dữ liệu), 22xx cho chế độ tính toán (42xx cho cảnh báo tính toán, v.v.), 23xx cho mô-đun khác, v.v.
Id sự kiện được chỉ định, có cấu trúc cũng cho phép bạn sử dụng chúng trong các bộ lọc.
Q: Nếu bạn sử dụng theo dõi, bạn có sử dụng Trace.Correlation.StartLogicalOperation không?
Trả lời: Trace.CorrelationManager rất hữu ích cho việc tương quan các báo cáo nhật ký trong bất kỳ loại môi trường đa luồng nào (gần như mọi thứ hiện nay).
Bạn cần ít nhất để thiết lập ActivityId một lần cho mỗi hoạt động logic để tương quan.
Bắt đầu / Dừng và LogicalOperationStack sau đó có thể được sử dụng cho bối cảnh dựa trên ngăn xếp đơn giản. Đối với các bối cảnh phức tạp hơn (ví dụ: các hoạt động không đồng bộ), sử dụng TraceTransfer cho ActivityId mới (trước khi thay đổi nó), cho phép tương quan.
Công cụ Trình theo dõi dịch vụ có thể hữu ích để xem biểu đồ hoạt động (ngay cả khi bạn không sử dụng WCF).
Q: Bạn có viết mã này bằng tay, hoặc bạn sử dụng một số hình thức lập trình hướng theo khía cạnh để làm điều đó? Muốn chia sẻ một đoạn mã?
Trả lời: Bạn có thể muốn tạo một lớp phạm vi, ví dụ LogicalOperationScope, rằng (a) thiết lập bối cảnh khi được tạo và (b) đặt lại bối cảnh khi xử lý.
Điều này cho phép bạn viết mã như sau để tự động bao bọc các hoạt động:
using( LogicalOperationScope operation = new LogicalOperationScope("Operation") )
{
// .. do work here
}
Khi tạo, phạm vi trước tiên có thể đặt ActivityId nếu cần, hãy gọi StartLogicalOperation và sau đó đăng nhập thông báo TraceEventType.Start. Trên Vứt bỏ, nó có thể ghi thông báo Dừng và sau đó gọi StopLogicalOperation.
Q: Bạn có cung cấp bất kỳ hình thức chi tiết nào trên các nguồn theo dõi không? Ví dụ, WPF TraceSource cho phép bạn định cấu hình chúng ở nhiều cấp độ khác nhau.
Trả lời: Có, nhiều Nguồn theo dõi rất hữu ích / quan trọng khi các hệ thống trở nên lớn hơn.
Trong khi bạn có thể muốn liên tục ghi nhật ký tất cả Cảnh báo & ở trên hoặc tất cả các thông tin & thông báo ở trên, đối với bất kỳ hệ thống có kích thước hợp lý nào, khối lượng Truy tìm hoạt động (Bắt đầu, Dừng, v.v.) và ghi nhật ký Verbose đơn giản trở nên quá nhiều.
Thay vì chỉ có một công tắc bật hoặc tắt tất cả, thật hữu ích khi có thể bật thông tin này cho một phần trong hệ thống của bạn tại một thời điểm.
Bằng cách này, bạn có thể xác định các vấn đề quan trọng từ việc ghi nhật ký thông thường (tất cả các cảnh báo, lỗi, v.v.) và sau đó "phóng to" các phần bạn muốn và đặt chúng thành các mức Truy tìm hoạt động hoặc thậm chí là Gỡ lỗi.
Số lượng nguồn theo dõi bạn cần tùy thuộc vào ứng dụng của bạn, ví dụ: bạn có thể muốn một nguồn theo dõi trên mỗi cụm hoặc trên mỗi phần chính của ứng dụng.
Nếu bạn cần điều khiển tốt hơn nữa, hãy thêm các công tắc boolean riêng lẻ để bật / tắt theo dõi âm lượng cao cụ thể, ví dụ: kết xuất tin nhắn thô. (Hoặc một nguồn theo dõi riêng biệt có thể được sử dụng, tương tự như WCF / WPF).
Bạn cũng có thể muốn xem xét các nguồn theo dõi riêng biệt để ghi nhật ký theo dõi hoạt động so với ghi nhật ký chung (khác), vì nó có thể giúp dễ dàng hơn một chút để định cấu hình các bộ lọc theo cách bạn muốn.
Lưu ý rằng tin nhắn vẫn có thể được tương quan thông qua ActivityId ngay cả khi các nguồn khác nhau được sử dụng, vì vậy hãy sử dụng bao nhiêu tùy ý.
Người nghe
Q: Bạn sử dụng kết quả đầu ra nào?
Điều này có thể phụ thuộc vào loại ứng dụng bạn đang viết và những thứ đang được ghi lại. Thông thường những thứ khác nhau đi ở những nơi khác nhau (tức là nhiều đầu ra).
Tôi thường phân loại đầu ra thành ba nhóm:
(1) Sự kiện - Nhật ký sự kiện Windows (và tệp theo dõi)
ví dụ: Nếu viết một máy chủ / dịch vụ, thì cách tốt nhất trên Windows là sử dụng Nhật ký sự kiện Windows (bạn không có UI để báo cáo).
Trong trường hợp này, tất cả các sự kiện Thông tin gây tử vong, Lỗi, Cảnh báo và (cấp độ dịch vụ) sẽ chuyển đến Nhật ký Sự kiện Windows. Cấp độ thông tin phải được dành riêng cho các loại sự kiện cấp cao này, các sự kiện mà bạn muốn truy cập trong nhật ký sự kiện, ví dụ: "Dịch vụ đã bắt đầu", "Đã dừng dịch vụ", "Đã kết nối với Xyz" và thậm chí có thể "Khởi tạo lịch biểu" , "Người dùng đã đăng nhập", v.v.
Trong một số trường hợp, bạn có thể muốn ghi vào nhật ký sự kiện một phần tích hợp trong ứng dụng của mình và không thông qua hệ thống theo dõi (tức là viết trực tiếp các mục Nhật ký sự kiện). Điều này có nghĩa là nó không thể vô tình bị tắt. (Lưu ý bạn vẫn muốn lưu ý sự kiện tương tự trong hệ thống theo dõi của mình để bạn có thể tương quan).
Ngược lại, một ứng dụng GUI của Windows thường báo cáo những điều này cho người dùng (mặc dù họ cũng có thể đăng nhập vào Nhật ký sự kiện của Windows).
Các sự kiện cũng có thể có các bộ đếm hiệu suất liên quan (ví dụ: số lỗi / giây) và điều quan trọng là phải phối hợp bất kỳ văn bản trực tiếp nào với Nhật ký sự kiện, bộ đếm hiệu suất, ghi vào hệ thống theo dõi và báo cáo cho người dùng để chúng xảy ra tại cùng lúc.
tức là nếu người dùng nhìn thấy một thông báo lỗi tại một thời điểm cụ thể, bạn sẽ có thể tìm thấy cùng một thông báo lỗi trong Nhật ký sự kiện Windows, và sau đó cùng một sự kiện với cùng dấu thời gian trong nhật ký theo dõi (cùng với các chi tiết theo dõi khác).
(2) Hoạt động - Tệp nhật ký ứng dụng hoặc bảng cơ sở dữ liệu (và tệp theo dõi)
Đây là hoạt động thường xuyên mà một hệ thống thực hiện, ví dụ trang web được phục vụ, giao dịch trên thị trường chứng khoán, đặt hàng, thực hiện tính toán, v.v.
Hoạt động theo dõi (bắt đầu, dừng lại, v.v.) rất hữu ích ở đây (ở mức độ phù hợp).
Ngoài ra, rất phổ biến để sử dụng Nhật ký ứng dụng cụ thể (đôi khi được gọi là Nhật ký kiểm toán). Thông thường đây là bảng cơ sở dữ liệu hoặc tệp nhật ký ứng dụng và chứa dữ liệu có cấu trúc (tức là một tập hợp các trường).
Mọi thứ có thể bị mờ đi một chút ở đây tùy thuộc vào ứng dụng của bạn. Một ví dụ điển hình có thể là một máy chủ web ghi từng yêu cầu vào nhật ký web; các ví dụ tương tự có thể là một hệ thống nhắn tin hoặc hệ thống tính toán trong đó mỗi thao tác được ghi lại cùng với các chi tiết dành riêng cho ứng dụng.
Một ví dụ không hay là giao dịch trên thị trường chứng khoán hoặc hệ thống đặt hàng bán hàng. Trong các hệ thống này, có lẽ bạn đã đăng nhập hoạt động vì chúng có giá trị kinh doanh quan trọng, tuy nhiên, nguyên tắc tương quan giữa chúng với các hành động khác vẫn rất quan trọng.
Cũng như nhật ký ứng dụng tùy chỉnh, các hoạt động cũng thường có các bộ đếm peformance liên quan, ví dụ như số lượng giao dịch mỗi giây.
Nói chung, bạn nên phối hợp ghi nhật ký các hoạt động trên các hệ thống khác nhau, tức là ghi vào nhật ký ứng dụng của bạn cùng lúc khi bạn tăng bộ đếm hiệu suất và đăng nhập vào hệ thống theo dõi của bạn. Nếu bạn làm tất cả cùng một lúc (hoặc nối tiếp nhau trong mã), thì các vấn đề gỡ lỗi sẽ dễ dàng hơn (nếu tất cả chúng xảy ra ở các thời điểm / vị trí khác nhau trong mã).
(3) Dấu vết gỡ lỗi - Tệp văn bản, hoặc có thể là XML hoặc cơ sở dữ liệu.
Đây là thông tin ở cấp Verbose và thấp hơn (ví dụ: các công tắc boolean tùy chỉnh để bật / tắt kết xuất dữ liệu thô). Điều này cung cấp can đảm hoặc chi tiết về những gì một hệ thống đang làm ở cấp độ hoạt động phụ.
Đây là cấp độ bạn muốn có thể bật / tắt cho các phần riêng lẻ trong ứng dụng của mình (do đó có nhiều nguồn). Bạn không muốn những thứ này làm lộn xộn Nhật ký sự kiện Windows. Đôi khi một cơ sở dữ liệu được sử dụng, nhưng nhiều khả năng là các tệp nhật ký cuộn được thanh lọc sau một thời gian nhất định.
Một sự khác biệt lớn giữa thông tin này và tệp Nhật ký ứng dụng là nó không có cấu trúc. Trong khi Nhật ký ứng dụng có thể có các trường cho Đến, Từ, Số lượng, v.v., dấu vết gỡ lỗi Verbose có thể là bất cứ thứ gì lập trình viên đưa vào, ví dụ: "kiểm tra giá trị X = {value}, Y = false" hoặc nhận xét / đánh dấu ngẫu nhiên như " Làm xong, thử lại ".
Một thực tế quan trọng là đảm bảo những thứ bạn đặt trong tệp nhật ký ứng dụng hoặc Nhật ký sự kiện Windows cũng được ghi vào hệ thống theo dõi với cùng chi tiết (ví dụ: dấu thời gian). Điều này cho phép bạn sau đó tương quan các bản ghi khác nhau khi điều tra.
Nếu bạn đang dự định sử dụng một trình xem nhật ký cụ thể vì bạn có mối tương quan phức tạp, ví dụ Trình xem theo dõi dịch vụ, thì bạn cần sử dụng một định dạng thích hợp, ví dụ như XML. Mặt khác, một tệp văn bản đơn giản thường đủ tốt - ở các cấp thấp hơn, thông tin phần lớn không có cấu trúc, vì vậy bạn có thể tìm thấy các mảng, các ngăn xếp ngăn xếp, v.v. không sao đâu.
Q: Nếu sử dụng tệp, bạn có sử dụng nhật ký cán hoặc chỉ một tệp không? Làm thế nào để bạn làm cho các bản ghi có sẵn cho mọi người để tiêu thụ?
Trả lời: Đối với các tệp, nói chung bạn muốn cuộn các tệp nhật ký từ quan điểm có thể quản lý (với System.Diagnostics chỉ cần sử dụng VisualBasic.Logging.FileLogTraceListener).
Sẵn có một lần nữa phụ thuộc vào hệ thống. Nếu bạn chỉ nói về các tệp thì đối với máy chủ / dịch vụ, các tệp cuộn chỉ có thể được truy cập khi cần thiết. (Nhật ký sự kiện Windows hoặc Nhật ký ứng dụng cơ sở dữ liệu sẽ có cơ chế truy cập riêng).
Nếu bạn không có quyền truy cập dễ dàng vào hệ thống tệp, thì việc gỡ lỗi truy tìm cơ sở dữ liệu có thể dễ dàng hơn. [tức là thực hiện cơ sở dữ liệu TraceListener].
Một giải pháp thú vị mà tôi thấy cho một ứng dụng GUI Windows là nó đã ghi thông tin truy tìm rất chi tiết vào "máy ghi chuyến bay" trong khi chạy và sau đó khi bạn tắt nó nếu không có vấn đề gì thì nó chỉ cần xóa tệp.
Tuy nhiên, nếu nó bị sập hoặc gặp sự cố thì tệp không bị xóa. Hoặc nếu nó bắt lỗi, hoặc lần sau khi nó chạy, nó sẽ thông báo tệp, và sau đó nó có thể thực hiện hành động, ví dụ: nén nó (ví dụ 7zip) và gửi email hoặc có sẵn.
Nhiều hệ thống ngày nay kết hợp báo cáo tự động về các lỗi cho máy chủ trung tâm (sau khi kiểm tra với người dùng, ví dụ: vì lý do riêng tư).
Đang xem
Q: Công cụ nào để bạn sử dụng để xem nhật ký?
Trả lời: Nếu bạn có nhiều nhật ký vì những lý do khác nhau thì bạn sẽ sử dụng nhiều người xem.
Notepad / vi / Notepad ++ hoặc bất kỳ trình soạn thảo văn bản nào khác là cơ bản cho nhật ký văn bản thuần túy.
Nếu bạn có các hoạt động phức tạp, ví dụ như các hoạt động với chuyển khoản, thì rõ ràng, bạn sẽ sử dụng một công cụ chuyên dụng như Trình xem theo dõi dịch vụ. (Nhưng nếu bạn không cần nó, thì trình soạn thảo văn bản sẽ dễ dàng hơn).
Vì tôi thường ghi thông tin cấp cao vào Nhật ký sự kiện Windows, sau đó nó cung cấp một cách nhanh chóng để có được một cái nhìn tổng quan, theo cách có cấu trúc (tìm các biểu tượng lỗi / cảnh báo đẹp). Bạn chỉ cần bắt đầu tìm kiếm thông qua các tệp văn bản nếu không có đủ trong nhật ký, mặc dù ít nhất nhật ký cung cấp cho bạn một điểm khởi đầu. (Tại thời điểm này, đảm bảo nhật ký của bạn có các mục nhập phối hợp trở nên hữu ích).
Nói chung, Nhật ký sự kiện Windows cũng cung cấp các sự kiện quan trọng này cho các công cụ giám sát như MOM hoặc OpenView.
Khác --
Nếu bạn đăng nhập vào Cơ sở dữ liệu, có thể dễ dàng lọc và sắp xếp thông tin (ví dụ: phóng to một id hoạt động cụ thể.
MS Excel (hoặc một chương trình bảng tính khác). Điều này có thể hữu ích cho việc phân tích thông tin có cấu trúc hoặc bán cấu trúc nếu bạn có thể nhập nó với các dấu phân cách phù hợp để các giá trị khác nhau đi vào các cột khác nhau.
Khi chạy một dịch vụ trong gỡ lỗi / kiểm tra, tôi thường lưu trữ nó trong một ứng dụng bảng điều khiển để đơn giản, tôi thấy một trình ghi nhật ký bảng điều khiển màu hữu ích (ví dụ: màu đỏ cho lỗi, màu vàng cho cảnh báo, v.v.). Bạn cần phải thực hiện một trình nghe theo dõi tùy chỉnh.
Lưu ý rằng khung công tác không bao gồm bộ ghi bảng điều khiển màu hoặc bộ ghi cơ sở dữ liệu, vì vậy, ngay bây giờ, bạn sẽ cần phải viết chúng nếu bạn cần chúng (nó không quá khó).
Tôi thực sự khó chịu khi một số khung công tác (log4net, EntLib, v.v.) đã lãng phí thời gian để phát minh lại bánh xe và thực hiện lại việc ghi nhật ký, lọc và ghi nhật ký cơ bản vào các tệp văn bản, Nhật ký sự kiện Windows và các tệp XML cách khác nhau (báo cáo nhật ký là khác nhau trong mỗi); mỗi người sau đó đã triển khai phiên bản riêng của họ, ví dụ, một bộ ghi cơ sở dữ liệu, khi hầu hết những thứ đó đã tồn tại và tất cả những gì cần thiết là một vài người nghe theo dõi cho System.Diagnostics. Nói về một sự lãng phí lớn của nỗ lực trùng lặp.
Q: Nếu bạn đang xây dựng một giải pháp ASP.NET, bạn cũng sử dụng ASP.NET Health Giám sát? Bạn có bao gồm đầu ra theo dõi trong các sự kiện theo dõi sức khỏe? Còn Trace.axd thì sao?
Những thứ này có thể được bật / tắt khi cần thiết. Tôi thấy Trace.axd khá hữu ích để gỡ lỗi cách máy chủ phản hồi với một số thứ nhất định, nhưng nó thường không hữu ích trong môi trường được sử dụng nhiều hoặc để theo dõi lâu dài.
Q: Điều gì về quầy hiệu suất tùy chỉnh?
Đối với một ứng dụng chuyên nghiệp, đặc biệt là máy chủ / dịch vụ, tôi hy vọng sẽ thấy nó được trang bị đầy đủ với cả bộ đếm Giám sát hiệu suất và đăng nhập vào Nhật ký sự kiện Windows. Đây là những công cụ tiêu chuẩn trong Windows và nên được sử dụng.
Bạn cần đảm bảo bạn bao gồm các trình cài đặt cho bộ đếm hiệu suất và nhật ký sự kiện mà bạn sử dụng; chúng nên được tạo khi cài đặt (khi cài đặt với tư cách quản trị viên). Khi ứng dụng của bạn chạy bình thường, nó không cần có đặc quyền quản trị (và vì vậy sẽ không thể tạo nhật ký bị thiếu).
Đây là một lý do tốt để thực hành phát triển như một người không phải là quản trị viên (có tài khoản quản trị viên riêng khi bạn cần cài đặt dịch vụ, v.v.). Nếu ghi vào Nhật ký sự kiện, .NET sẽ tự động tạo một nhật ký bị thiếu trong lần đầu tiên bạn viết vào đó; nếu bạn phát triển như một người không phải là quản trị viên, bạn sẽ nắm bắt được điều này sớm và tránh một sự ngạc nhiên khó chịu khi khách hàng cài đặt hệ thống của bạn và sau đó không thể sử dụng nó vì họ không chạy với tư cách quản trị viên.