Ghi nhật ký và theo dõi trong ứng dụng .NET
Khi bạn tiếp tục phát triển ứng dụng của mình và ứng dụng trở nên phức tạp hơn, bạn sẽ muốn áp dụng chẩn đoán gỡ lỗi bổ sung cho ứng dụng của mình.
Theo dõi là một cách để bạn theo dõi việc thực thi ứng dụng của mình trong khi nó đang chạy. Bạn có thể thêm công cụ theo dõi và gỡ lỗi cho ứng dụng .NET của mình khi phát triển ứng dụng. Bạn có thể sử dụng công cụ đó trong khi đang phát triển ứng dụng và sau khi bạn đã triển khai nó.
Kỹ thuật đơn giản này là đáng ngạc nhiên mạnh mẽ. Bạn có thể sử dụng nó trong những trường hợp bạn cần nhiều hơn một trình gỡ lỗi:
- Các sự cố xảy ra trong thời gian dài có thể khó gỡ lỗi bằng trình gỡ lỗi truyền thống. Nhật ký cho phép xem xét chi tiết sau khi mortem kéo dài trong thời gian dài. Ngược lại, trình gỡ lỗi bị giới hạn trong phân tích thời gian thực.
- Các ứng dụng đa luồng và ứng dụng phân phối thường khó gỡ lỗi. Việc gắn trình gỡ lỗi có xu hướng sửa đổi hành vi. Bạn có thể phân tích nhật ký chi tiết khi cần để hiểu rõ các hệ thống phức tạp.
- Các vấn đề trong các ứng dụng được phân phối có thể phát sinh từ một tương tác phức tạp giữa nhiều thành phần. Có thể không hợp lý khi kết nối trình gỡ lỗi với mọi phần của hệ thống.
- Nhiều dịch vụ không nên bị đình trệ. Việc đính kèm trình gỡ lỗi thường gây ra lỗi hết thời gian chờ.
- Các vấn đề không phải lúc nào cũng được dự báo trước. Ghi nhật ký và theo dõi được thiết kế dành cho chi phí thấp để các chương trình luôn có thể ghi trong trường hợp xảy ra sự cố.
Ghi thông tin vào cửa sổ đầu ra
Cho đến thời điểm này, chúng tôi đã sử dụng bảng điều khiển để hiển thị thông tin cho người dùng ứng dụng. Có các loại ứng dụng khác được xây dựng với .NET có giao diện người dùng, chẳng hạn như ứng dụng dành cho thiết bị di động, web và máy tính để bàn, đồng thời không có bảng điều khiển hiển thị. Trong các ứng dụng này, System.Console ghi nhật ký thông báo "ở hậu trường". Những thông báo này có thể hiển thị trong cửa sổ đầu ra của Visual Studio hoặc Mã Visual Studio. Chúng cũng có thể xuất ra nhật ký hệ thống chẳng hạn như dữ liệu của Android logcat. Do đó, bạn nên cân nhắc rất nhiều khi sử dụng System.Console.WriteLine trong ứng dụng không phải bảng điều khiển.
Đây là nơi bạn có thể sử dụng System.Diagnostics.Debug và System.Diagnostics.Trace bên cạnh System.Console. Cả Debug và Trace là một phần của System.Diagnostics và sẽ chỉ ghi vào nhật ký khi một nghe thích hợp được đính kèm.
Bạn tùy theo lựa chọn API kiểu in nào để sử dụng. Những điểm khác biệt chính là:
-
System.Console
- Luôn bật và luôn ghi vào bảng điều khiển.
- Hữu ích cho thông tin mà khách hàng của bạn có thể cần xem trong bản phát hành.
- Vì đây là phương pháp đơn giản nhất nên phương pháp này thường được sử dụng để gỡ lỗi tạm thời không dự tính trước. Mã gỡ lỗi này thường không bao giờ được kiểm nhập vào điều khiển nguồn.
-
System.Diagnostics.Trace
- Chỉ được bật khi
TRACEđược xác định. - Viết cho Thính giả đính kèm, theo mặc định, DefaultTraceListener.
- Sử dụng API này khi bạn tạo nhật ký sẽ được bật trong hầu hết các bản dựng.
- Chỉ được bật khi
-
System.Diagnostics.Debug
- Chỉ được bật khi
DEBUGđược xác định (khi ở chế độ gỡ lỗi). - Viết vào trình gỡ lỗi đính kèm.
- Sử dụng API này khi bạn tạo nhật ký sẽ chỉ được bật trong bản dựng gỡ lỗi.
- Chỉ được bật khi
Console.WriteLine("This message is readable by the end user.");
Trace.WriteLine("This is a trace message when tracing the app.");
Debug.WriteLine("This is a debug message just for developers.");
Khi bạn thiết kế chiến lược theo dõi và gỡ lỗi, hãy nghĩ về cách bạn muốn kết quả đầu ra trông như thế nào. Nhiều câu lệnh Viết chứa thông tin không liên quan sẽ tạo ra một nhật ký khó đọc. Mặt khác, việc sử dụng WriteLine để đặt các câu lệnh có liên quan trên các dòng riêng biệt có thể khiến bạn khó phân biệt thông tin nào thuộc về nhau. Nói chung, hãy sử dụng nhiều câu lệnh Viết khi bạn muốn kết hợp thông tin từ nhiều nguồn để tạo ra một thư thông tin duy nhất. Sử dụng câu lệnh WriteLine khi bạn muốn tạo một thư hoàn chỉnh duy nhất.
Debug.Write("Debug - ");
Debug.WriteLine("This is a full line.");
Debug.WriteLine("This is another full line.");
Đầu ra này là từ việc ghi nhật ký trước đó với Debug:
Debug - This is a full line.
This is another full line.
Xác định hằng số TRACE và DEBUG
Theo mặc định, khi một ứng dụng đang chạy trong gỡ lỗi, hằng số DEBUG được xác định. Bạn có thể kiểm soát điều này bằng cách thêm một DefineConstants nhập trong tệp dự án trong một nhóm thuộc tính. Dưới đây là ví dụ về việc bật cài đặt TRACE cho cả cấu hình Debug và Release của bạn ngoài DEBUG cấu hình Debug cụ thể.
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DefineConstants>DEBUG;TRACE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<DefineConstants>TRACE</DefineConstants>
</PropertyGroup>
Khi bạn sử dụng Trace khi không gắn liền với trình gỡ lỗi, bạn sẽ cần phải cấu hình một trình nghe theo dõi chẳng hạn như dotnet-trace.
Theo dõi có điều kiện
Ngoài các phương pháp Write và WriteLine đơn giản, còn có khả năng thêm điều kiện với WriteIf và WriteLineIf. Ví dụ: lô-gic sau đây sẽ kiểm tra xem số đếm là không và sau đó viết thông báo gỡ lỗi:
if(count == 0)
{
Debug.WriteLine("The count is 0 and this may cause an exception.");
}
Bạn có thể viết lại dòng này trong một dòng mã:
Debug.WriteLineIf(count == 0, "The count is 0 and this may cause an exception.");
Bạn cũng có thể sử dụng các điều kiện này với Trace và với cờ mà bạn xác định trong ứng dụng của mình:
bool errorFlag = false;
System.Diagnostics.Trace.WriteIf(errorFlag, "Error in AppendData procedure.");
System.Diagnostics.Debug.WriteIf(errorFlag, "Transaction abandoned.");
System.Diagnostics.Trace.Write("Invalid value for data request");
Xác minh rằng một số điều kiện nhất định tồn tại
Một xác nhận hoặc một câu lệnh Assert, kiểm tra một điều kiện mà bạn chỉ định làm đối số cho câu lệnh Assert định. Nếu điều kiện định trị là không true, không có hành động nào xảy ra. Nếu điều kiện đánh giá là false, thì quá trình xác nhận không thành công. Nếu bạn đang chạy với bản dựng gỡ lỗi, chương trình của bạn sẽ vào chế độ ngắt.
Bạn có thể sử dụng Assert phương pháp từ Debug hoặc Trace, nằm trong không gian System.Diagnostics của bạn.
Debug phương pháp lớp học không được bao gồm trong phiên bản phát hành của chương trình của bạn, vì vậy chúng không làm tăng kích cỡ hoặc giảm tốc độ mã phát hành của bạn.
Sử dụng phương System.Diagnostics.Debug.Assert tự do để kiểm tra các điều kiện nên giữ đúng nếu mã của bạn chính xác. Ví dụ: giả sử bạn đã viết một hàm chia nguyên. Theo các quy tắc toán học, ước số không bao giờ được bằng không. Bạn có thể kiểm tra điều kiện này bằng cách sử dụng một hiển thị:
int IntegerDivide(int dividend, int divisor)
{
Debug.Assert(divisor != 0, $"{nameof(divisor)} is 0 and will cause an exception.");
return dividend / divisor;
}
Khi bạn chạy mã này dưới trình gỡ lỗi, câu lệnh hiển thị được đánh giá. Tuy nhiên, so sánh không được thực hiện trong phiên bản phát hành, vì vậy không có thêm chi phí.
Ghi
Khi bạn sử dụng System.Diagnostics.Debug.Assert, hãy đảm bảo rằng bất kỳ mã nào trong Assert sẽ không thay đổi kết quả của chương trình nếu Assert bị loại bỏ. Nếu không, bạn có thể vô tình gây ra lỗi chỉ hiển thị trong phiên bản phát hành của chương trình. Hãy đặc biệt thận trọng về các hiển thị có chứa các lệnh chức năng hoặc thủ tục.
Việc Debug và gỡ Trace từ không gian tên System.Diagnostics là một cách tuyệt vời để cung cấp ngữ cảnh bổ sung khi bạn chạy và gỡ lỗi ứng dụng của mình.