跳過到頁腳內容
.NET幫助

C# 日志(對於開發者的運行原理)

記錄是軟體開發中不可或缺的一環,可讓開發人員深入瞭解應用程式的行為,並協助除錯、監控和疑難排解。 在 C# 和 SQL Server 的領域中,有效的結構化日誌 API 機制對於確保應用程式的穩健性和可靠性至關重要。 本綜合指南將探討日誌提供者的重要性、C# 中可用的各種日誌框架、實作日誌框架的最佳實務,以及可協助您掌握 C# 日誌應用程式中日誌的進階技術。 我們還將討論如何使用 IronPDF for PDF Generation 建立 PDF 日誌訊息報告。

1.記錄為何重要。

在深入探討技術細節之前,讓我們先了解為什麼記錄在軟體開發中是不可或缺的:

1.調試:日誌記錄有助於開發人員在整個開發生命週期中識別和診斷問題。 詳細的記錄檔訊息可提供有關執行流程、變量值和潛在錯誤的寶貴資訊,有助於進行有效率的除錯。 2.監控:在生產環境中,日誌記錄可用作監控工具,使維運團隊能夠追蹤應用程式行為、偵測異常情況並主動解決問題。 監控日誌有助於識別效能瓶頸、安全漏洞和關鍵事件。 3.審計和合規性:日誌記錄通常是金融和醫療保健等各行業的監管要求。 具有最低日誌層級的全面日誌可確保問責性、方便稽核,並顯示符合資料保護規定。 4.效能最佳化:透過分析日誌,開發人員可以確定效能最佳化的領域,例如效率低的資料庫查詢或緩慢的外部服務呼叫。 優化這些方面可以增強應用程式的效能和可擴展性。

2. C# 中的日誌框架

C# 提供多種記錄架構,每種架構都有其特色與功能。 讓我們配合程式碼範例來探討一些熱門的日誌提供者:

2.1.NLog

NLog 是一個高效能的日誌函式庫,具有廣泛的設定檔選項。 以下是在 C# 應用程式中使用 NLog 撰寫日誌訊息的簡單範例:

// Install-Package NLog
using NLog;

public class Program
{
    // Initialize a logger instance from NLog
    private static readonly Logger logger = LogManager.GetCurrentClassLogger();

    static void Main(string[] args)
    {
        // Log various levels of messages
        logger.Info("Info message");
        logger.Warn("Warning message");
        logger.Error("Error message");
        logger.Fatal("Fatal error message");
    }
}
// Install-Package NLog
using NLog;

public class Program
{
    // Initialize a logger instance from NLog
    private static readonly Logger logger = LogManager.GetCurrentClassLogger();

    static void Main(string[] args)
    {
        // Log various levels of messages
        logger.Info("Info message");
        logger.Warn("Warning message");
        logger.Error("Error message");
        logger.Fatal("Fatal error message");
    }
}
' Install-Package NLog
Imports NLog

Public Class Program
	' Initialize a logger instance from NLog
	Private Shared ReadOnly logger As Logger = LogManager.GetCurrentClassLogger()

	Shared Sub Main(ByVal args() As String)
		' Log various levels of messages
		logger.Info("Info message")
		logger.Warn("Warning message")
		logger.Error("Error message")
		logger.Fatal("Fatal error message")
	End Sub
End Class
$vbLabelText   $csharpLabel

C# Log (How It Works For Developers):圖 1 - 日誌訊息輸出

2.2.Serilog

Serilog 著重於結構化的日誌 API,以及與現代日誌後端的無縫整合。 以下是如何在 C# 應用程式中使用 Serilog:

// Install-Package Serilog
// Install-Package Serilog.Sinks.Console
using Serilog;

public class Program
{
    static void Main(string[] args)
    {
        // Configure Serilog to write log messages to the console
        Log.Logger = new LoggerConfiguration()
            .WriteTo.Console()
            .CreateLogger();

        // Log messages at various levels
        Log.Debug("Debug message");
        Log.Information("Info message");
        Log.Warning("Warning message");
        Log.Error("Error message");
        Log.Fatal("Fatal error message");
    }
}
// Install-Package Serilog
// Install-Package Serilog.Sinks.Console
using Serilog;

public class Program
{
    static void Main(string[] args)
    {
        // Configure Serilog to write log messages to the console
        Log.Logger = new LoggerConfiguration()
            .WriteTo.Console()
            .CreateLogger();

        // Log messages at various levels
        Log.Debug("Debug message");
        Log.Information("Info message");
        Log.Warning("Warning message");
        Log.Error("Error message");
        Log.Fatal("Fatal error message");
    }
}
' Install-Package Serilog
' Install-Package Serilog.Sinks.Console
Imports Serilog

Public Class Program
	Shared Sub Main(ByVal args() As String)
		' Configure Serilog to write log messages to the console
		Log.Logger = (New LoggerConfiguration()).WriteTo.Console().CreateLogger()

		' Log messages at various levels
		Log.Debug("Debug message")
		Log.Information("Info message")
		Log.Warning("Warning message")
		Log.Error("Error message")
		Log.Fatal("Fatal error message")
	End Sub
End Class
$vbLabelText   $csharpLabel

C# Log (How It Works For Developers):圖 2 - 配置檔案日誌輸出

2.3.Microsoft.Extensions.Logging

Microsoft.Extensions.Logging 是 .NET Core 生態系統中包含的輕量級日誌抽象。 以下是一個基本的使用範例:

// Install-Package Microsoft.Extensions.Logging
using Microsoft.Extensions.Logging;

public class Program
{
    static void Main(string[] args)
    {
        // Create a logger factory with console output
        ILoggerFactory loggerFactory = LoggerFactory.Create(builder =>
        {
            builder.AddConsole(); // Add console logger
        });

        // Create a logger from the factory
        ILogger logger = loggerFactory.CreateLogger<Program>();

        // Log messages at various levels
        logger.LogDebug("Debug message");
        logger.LogInformation("Info message");
        logger.LogWarning("Warning message");
        logger.LogError("Error message");
        logger.LogCritical("Critical error message");
    }
}
// Install-Package Microsoft.Extensions.Logging
using Microsoft.Extensions.Logging;

public class Program
{
    static void Main(string[] args)
    {
        // Create a logger factory with console output
        ILoggerFactory loggerFactory = LoggerFactory.Create(builder =>
        {
            builder.AddConsole(); // Add console logger
        });

        // Create a logger from the factory
        ILogger logger = loggerFactory.CreateLogger<Program>();

        // Log messages at various levels
        logger.LogDebug("Debug message");
        logger.LogInformation("Info message");
        logger.LogWarning("Warning message");
        logger.LogError("Error message");
        logger.LogCritical("Critical error message");
    }
}
' Install-Package Microsoft.Extensions.Logging
Imports Microsoft.Extensions.Logging

Public Class Program
	Shared Sub Main(ByVal args() As String)
		' Create a logger factory with console output
		Dim loggerFactory As ILoggerFactory = LoggerFactory.Create(Sub(builder)
			builder.AddConsole() ' Add console logger
		End Sub)

		' Create a logger from the factory
		Dim logger As ILogger = loggerFactory.CreateLogger(Of Program)()

		' Log messages at various levels
		logger.LogDebug("Debug message")
		logger.LogInformation("Info message")
		logger.LogWarning("Warning message")
		logger.LogError("Error message")
		logger.LogCritical("Critical error message")
	End Sub
End Class
$vbLabelText   $csharpLabel

C# Log (How It Works For Developers):圖 3 - Microsoft.Extensions.Logging 輸出

3. C# 日誌記錄的最佳實務

為了確保在您的 C# 應用程式中有效記錄,請考慮下列最佳實務:

1.使用描述性日誌訊息:編寫能夠提供有關所記錄事件的有意義的上下文的日誌訊息。 包含相關資訊,例如時間戳記、錯誤代碼、使用者 ID 和作業細節,以協助排除故障。 2.選擇適當的日誌等級:根據記錄事件的嚴重程度,使用不同的日誌等級(例如,DEBUG、INFO、WARN、ERROR、FATAL)。 保留較低的日誌層級 (例如 DEBUG) 以提供詳盡的除錯資訊,保留較高的層級 (例如 ERROR、FATAL) 以提供需要立即處理的重要錯誤。 3.實施日誌輪替:透過實施日誌輪替機制,防止日誌檔案無限增長。 設定最大檔案大小或基於時間的輪換,以歸檔舊日誌並維持可管理的日誌大小。 4.保護敏感資訊:避免記錄敏感資訊,例如密碼、API 金鑰和個人識別資訊 (PII)。 實施適當的刪除或混淆技術,以保護日誌中的敏感資料。 5.集中式日誌管理:考慮使用 Elasticsearch、Splunk 或 Azure Application Insights 等集中式日誌解決方案來聚合和分析來自多個來源的日誌。 集中式日誌有助於日誌搜尋、分析及視覺化,增強故障排除能力。 6.啟用結構化日誌記錄:採用 JSON 或鍵值對等結構化日誌記錄格式,以機器可讀格式表示日誌事件。 相較於純文字日誌,結構化日誌更容易進行解析、過濾和分析。 7.監控日誌健康狀況:監控日誌基礎設施的健康狀況和可用性,以確保不間斷地收集和分析日誌。 針對磁碟空間耗盡、網路連線問題或服務停機等關鍵日誌問題實施警示。

4.進階記錄技術

除了基本知識之外,幾種進階的日誌記錄技術可以進一步增強您在 C# 中的日誌記錄能力:

1.上下文日誌記錄:使用 HTTP 請求標頭、會話 ID 或關聯 ID 等上下文資訊豐富日誌事件,以追蹤分散式系統中的執行流程。 2.非同步日誌記錄:透過將日誌記錄操作卸載到後台執行緒或非同步任務來提高應用程式效能。 異步記錄可防止阻塞主執行線程,並將對應用程式回應能力的影響降至最低。 3.異常日誌記錄和處理:實現結構化異常日誌記錄,以捕獲有關異常的詳細信息,包括堆疊追蹤、內部異常和異常上下文。 優雅地處理異常,並在適當的日誌層級記錄異常,以協助故障排除和錯誤復原。 4.效能日誌記錄:對關鍵程式碼路徑進行效能日誌記錄,以測量和分析應用程式效能指標,例如回應時間、吞吐量和資源利用率。 效能日誌有助於找出效能瓶頸並最佳化應用程式效率。 5.日誌關聯和聚合:透過在日誌訊息中包含唯一識別碼或追蹤 ID,關聯分散式元件或微服務中的相關日誌事件。 彙集相關的日誌,以整體檢視分散式系統的行為和疑難排解。

5.IronPDF:建立日誌報表的最佳 C# 函式庫。

IronPDF for .NET 是一個全面的 C# 函式庫,可讓開發人員在其 .NET 應用程式中無縫地建立、編輯和處理 PDF 文件。 無論您是需要產生 PDF 報表、將 HTML 轉換成 PDF,或是從 PDF 檔案中抽取文字,IronPDF 都能提供豐富的功能來滿足您的需求。 IronPDF 具有直觀的 API 和強大的功能,可簡化 PDF 生成和操作任務,使開發人員能夠利用高品質的 PDF 文件功能增強其應用程式。

5.1.使用 IronPDF 創建日誌報表。

從日誌資料產生 PDF 報告是許多應用程式的共同需求,可讓利害關係人深入瞭解應用程式的行為和效能。 在本範例中,我們將示範如何使用 IronPDF 建立日誌報告,包括日誌項目和相關的元資料。

步驟 1:安裝 IronPDF 套件

首先,確保您的專案已安裝 IronPDF 套件。 您可以透過 NuGet Package Manager 或 NuGet Package Console 安裝:

Install-Package IronPdf

步驟 2:建立日誌資料

為了進行示範,讓我們在應用程式中建立一些日誌資料範例。 您可以使用您偏好的記錄框架,或直接手動記錄項目:

using System;
using System.Collections.Generic;

public class LogEntry
{
    public DateTime Timestamp { get; set; }
    public string Message { get; set; }
    public LogLevel Level { get; set; }
}

public enum LogLevel
{
    Info,
    Warning,
    Error
}

public class LogService
{
    public List<LogEntry> GetLogEntries()
    {
        // Sample log entries
        var logEntries = new List<LogEntry>
        {
            new LogEntry { Timestamp = DateTime.Now, Message = "Application started.", Level = LogLevel.Info },
            new LogEntry { Timestamp = DateTime.Now, Message = "Warning: Disk space low.", Level = LogLevel.Warning },
            new LogEntry { Timestamp = DateTime.Now, Message = "Error: Database connection failed.", Level = LogLevel.Error }
        };
        return logEntries;
    }
}
using System;
using System.Collections.Generic;

public class LogEntry
{
    public DateTime Timestamp { get; set; }
    public string Message { get; set; }
    public LogLevel Level { get; set; }
}

public enum LogLevel
{
    Info,
    Warning,
    Error
}

public class LogService
{
    public List<LogEntry> GetLogEntries()
    {
        // Sample log entries
        var logEntries = new List<LogEntry>
        {
            new LogEntry { Timestamp = DateTime.Now, Message = "Application started.", Level = LogLevel.Info },
            new LogEntry { Timestamp = DateTime.Now, Message = "Warning: Disk space low.", Level = LogLevel.Warning },
            new LogEntry { Timestamp = DateTime.Now, Message = "Error: Database connection failed.", Level = LogLevel.Error }
        };
        return logEntries;
    }
}
Imports System
Imports System.Collections.Generic

Public Class LogEntry
	Public Property Timestamp() As DateTime
	Public Property Message() As String
	Public Property Level() As LogLevel
End Class

Public Enum LogLevel
	Info
	Warning
	[Error]
End Enum

Public Class LogService
	Public Function GetLogEntries() As List(Of LogEntry)
		' Sample log entries
		Dim logEntries = New List(Of LogEntry) From {
			New LogEntry With {
				.Timestamp = DateTime.Now,
				.Message = "Application started.",
				.Level = LogLevel.Info
			},
			New LogEntry With {
				.Timestamp = DateTime.Now,
				.Message = "Warning: Disk space low.",
				.Level = LogLevel.Warning
			},
			New LogEntry With {
				.Timestamp = DateTime.Now,
				.Message = "Error: Database connection failed.",
				.Level = LogLevel.Error
			}
		}
		Return logEntries
	End Function
End Class
$vbLabelText   $csharpLabel

步驟 3:產生 PDF 報告

現在,讓我們使用 IronPDF 從日誌資料產生 PDF 報告。

using IronPdf;
using System.Collections.Generic;

public class PdfReportGenerator
{
    public void GenerateLogReport(List<LogEntry> logEntries)
    {
        var renderer = new ChromePdfRenderer();
        var htmlContent = "<h1>Log Report</h1><hr/><ul>";

        // Format log entries into an HTML list
        foreach (var entry in logEntries)
        {
            htmlContent += $"<li><strong>{entry.Timestamp}</strong> - [{entry.Level}] {entry.Message}</li>";
        }
        htmlContent += "</ul>";

        // Render the HTML content to a PDF
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);

        // Save the PDF to a file
        var outputPath = "LogReport.pdf";
        pdf.SaveAs(outputPath);
    }
}
using IronPdf;
using System.Collections.Generic;

public class PdfReportGenerator
{
    public void GenerateLogReport(List<LogEntry> logEntries)
    {
        var renderer = new ChromePdfRenderer();
        var htmlContent = "<h1>Log Report</h1><hr/><ul>";

        // Format log entries into an HTML list
        foreach (var entry in logEntries)
        {
            htmlContent += $"<li><strong>{entry.Timestamp}</strong> - [{entry.Level}] {entry.Message}</li>";
        }
        htmlContent += "</ul>";

        // Render the HTML content to a PDF
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);

        // Save the PDF to a file
        var outputPath = "LogReport.pdf";
        pdf.SaveAs(outputPath);
    }
}
Imports IronPdf
Imports System.Collections.Generic

Public Class PdfReportGenerator
	Public Sub GenerateLogReport(ByVal logEntries As List(Of LogEntry))
		Dim renderer = New ChromePdfRenderer()
		Dim htmlContent = "<h1>Log Report</h1><hr/><ul>"

		' Format log entries into an HTML list
		For Each entry In logEntries
			htmlContent &= $"<li><strong>{entry.Timestamp}</strong> - [{entry.Level}] {entry.Message}</li>"
		Next entry
		htmlContent &= "</ul>"

		' Render the HTML content to a PDF
		Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)

		' Save the PDF to a file
		Dim outputPath = "LogReport.pdf"
		pdf.SaveAs(outputPath)
	End Sub
End Class
$vbLabelText   $csharpLabel

步驟 4:產生並檢視日誌報告

最後,讓我們建立 LogService 的實體,以取得日誌資料並產生 PDF 報告。

class Program
{
    static void Main(string[] args)
    {
        var logService = new LogService();
        var logEntries = logService.GetLogEntries();
        var pdfGenerator = new PdfReportGenerator();
        pdfGenerator.GenerateLogReport(logEntries);
    }
}
class Program
{
    static void Main(string[] args)
    {
        var logService = new LogService();
        var logEntries = logService.GetLogEntries();
        var pdfGenerator = new PdfReportGenerator();
        pdfGenerator.GenerateLogReport(logEntries);
    }
}
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim logService As New LogService()
		Dim logEntries = logService.GetLogEntries()
		Dim pdfGenerator = New PdfReportGenerator()
		pdfGenerator.GenerateLogReport(logEntries)
	End Sub
End Class
$vbLabelText   $csharpLabel

本代碼使用 LogService 取得範例日誌資料,產生日誌報告的 HTML 表示形式,使用 IronPDF 的 ChromePdfRenderer 將其轉換為 PDF,將 PDF 儲存為檔案,並開啟檢視。

C# Log (How It Works For Developers):圖 4 - 日誌報告輸出

6.結論

日誌是現代軟體開發的重要組成部分,可讓開發人員深入瞭解應用程式的行為和效能。 無論是在開發過程中除錯程式碼,或是在生產環境中監控應用程式的健康狀況,日誌都能提供系統作業的重要可見性。 C# 中有大量的日誌框架可供使用,開發人員可以靈活地根據自己的需求選擇最合適的工具,無論是追求性能的 NLog、追求結構化日誌功能的 Serilog,還是追求輕量級抽象的 Microsoft.Extensions.Logging。

IronPDF C# PDF Library 是在 C# 應用程式中無縫產生 PDF 記錄報告的強大工具。 其直觀的 API 簡化了將日誌資料轉換為視覺上吸引人且可操作的 PDF 文件的過程。 透過將 IronPDF 整合到應用程式中,開發人員可以增強日誌功能,並讓利害關係人全面瞭解應用程式的行為。 從建立詳細的稽核日誌到產生效能報告,IronPDF 可讓開發人員在 C# 應用程式中充分發揮 PDF 文件產生的潛力,進一步豐富開發與維護的經驗。

若要瞭解 IronPDF 及其功能的更多資訊,請造訪官方 IronPDF授權文件,並探索如何將其轉換為生產版本。

常見問題解答

如何將記錄資料轉換為 C# 中的 PDF 報告?

您可以使用 IronPDF 將記錄資料轉換為 PDF 報告。首先,將您的記錄資料格式化為 HTML 結構,然後利用 IronPDF 的渲染功能將 HTML 轉換為 PDF 文件。

C# 中有哪些流行的記錄框架?

C# 中一些流行的記錄框架包括 NLog、Serilog 和 Microsoft.Extensions.Logging,每個框架都提供獨特的功能,如結構化記錄和高性能。

在 C# 中使用結構化記錄有什麼優勢?

結構化記錄透過以 JSON 或鍵值對格式儲存記錄資料,使其比傳統文字記錄更易於解析和分析。

非同步記錄可以如何惠及 C# 應用程式?

非同步記錄可以透過將記錄操作卸載到背景任務中來提高性能,防止阻塞主執行緒並改善應用程式的回應能力。

為什麼記錄對軟體開發被認為是至關重要的?

記錄對於調試、監控應用程式性能、審計、合規性和優化性能非常重要,因為它可提供應用程式行為的洞察。

在 C# 應用程式中實現記錄的最佳實踐是什麼?

最佳實踐包括使用描述性的記錄訊息、選擇合適的記錄層級、實施記錄輪換、保護敏感資料和集中管理記錄。

如何使用 IronPDF 將記錄條目轉換為 PDF 文件?

IronPDF 允許您將記錄條目轉換成 PDF 文件,首先將記錄格式化為 HTML,然後使用 IronPDF 的 RenderHtmlAsPdf 方法生成 PDF。

上下文記錄在 C# 應用程式中扮演什麼角色?

上下文記錄為記錄訊息添加額外資料,如 HTTP 請求標頭或工作階段 ID,這有助於追蹤執行流程並簡化調試和故障排除。

記錄關聯和聚合如何改善分散式系統中的調試?

記錄關聯和聚合透過在記錄訊息中使用唯一識別碼或追蹤 ID 改善調試,有助於從分散式系統中追蹤相關事件以進行徹底分析。

使用 IronPDF 建立 PDF 記錄報告的過程是什麼?

該過程包括安裝 IronPDF、準備成 HTML 格式的記錄資料,並使用 IronPDF 的渲染功能將 HTML 內容轉換為 PDF 文件,然後可以儲存和共享。

Jacob Mellor, Team Iron 首席技術官
首席技術官

Jacob Mellor是Iron Software的首席技術官,也是開創C# PDF技術的前瞻性工程師。作為Iron Software核心代碼庫的原始開發者,他自公司成立以來就塑造了公司的產品架構,並與CEO Cameron Rimington將公司轉型為服務NASA、Tesla以及全球政府機構的50多人公司。

Jacob擁有曼徹斯特大學土木工程一級榮譽學士學位(1998年–2001年)。他於1999年在倫敦開立首家軟體公司,並於2005年建立了他的第一個.NET組件,專注於解決Microsoft生態系統中的複雜問題。

他的旗艦作品IronPDF和Iron Suite .NET程式庫全球已獲得超過3000萬次NuGet安裝,他的基礎代碼不斷在全球各地驅動開發者工具。擁有25年以上的商業經驗和41年的編碼專業知識,Jacob仍然專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我