{"id":667,"date":"2026-04-15T14:23:02","date_gmt":"2026-04-15T06:23:02","guid":{"rendered":"https:\/\/www.17ci.com\/?p=667"},"modified":"2026-04-15T14:23:07","modified_gmt":"2026-04-15T06:23:07","slug":"slug-netcore31-nlog-advanced-logging-api-tracing","status":"publish","type":"post","link":"https:\/\/www.17ci.com\/index.php\/slug-netcore31-nlog-advanced-logging-api-tracing\/","title":{"rendered":".NET Core 3.1 \u4e2d NLog \u9ad8\u7ea7\u65e5\u5fd7\u914d\u7f6e\uff1a\u5b9e\u73b0\u63a5\u53e3\u4ea4\u4e92\u8ffd\u8e2a\u4e0e\u65e5\u5fd7\u5206\u79bb"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">\u6982\u8ff0<\/h1>\n\n\n\n<p>\u5728\u73b0\u4ee3 .NET Core \u5e94\u7528\u7a0b\u5e8f\u4e2d\uff0c\u4e00\u4e2a\u5f3a\u5927\u4e14\u7075\u6d3b\u7684\u65e5\u5fd7\u7cfb\u7edf\u662f\u4fdd\u969c\u7cfb\u7edf\u7a33\u5b9a\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u7684\u57fa\u77f3\u3002\u672c\u6587\u5c06\u6df1\u5165\u63a2\u8ba8\u5982\u4f55\u5728 <a href=\"https:\/\/docs.microsoft.com\/en-us\/aspnet\/core\/fundamentals\/middleware\/?view=aspnetcore-3.1\" target=\"_blank\"  rel=\"nofollow\" >.NET Core 3.1<\/a> \u9879\u76ee\u4e2d\uff0c\u901a\u8fc7 <a href=\"https:\/\/nlog-project.org\/\" target=\"_blank\"  rel=\"nofollow\" >NLog<\/a> \u5b9e\u73b0\u4f01\u4e1a\u7ea7\u65e5\u5fd7\u89e3\u51b3\u65b9\u6848\uff0c\u91cd\u70b9\u89e3\u51b3\u4e09\u4e2a\u6838\u5fc3\u95ee\u9898\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><mark>\u2705 \u7269\u7406\u9694\u79bb<\/mark><\/strong>\uff1a\u5c06\u63a5\u53e3\u4ea4\u4e92\u65e5\u5fd7\u4e0e\u7cfb\u7edf\u8fd0\u884c\u65e5\u5fd7\u5206\u79bb\u5b58\u50a8\uff0c\u63d0\u9ad8\u65e5\u5fd7\u67e5\u8be2\u6548\u7387<\/li>\n\n\n\n<li><strong><mark>\u2705 \u683c\u5f0f\u7cbe\u7b80\u5316<\/mark><\/strong>\uff1a\u81ea\u5b9a\u4e49\u5e03\u5c40\u6a21\u677f\uff0c\u5b9e\u73b0\u6e05\u6670\u3001\u7ed3\u6784\u5316\u7684\u65e5\u5fd7\u8f93\u51fa<\/li>\n\n\n\n<li><strong><mark>\u2705 \u667a\u80fd\u8bb0\u5f55<\/mark><\/strong>\uff1a\u57fa\u4e8e\u81ea\u5b9a\u4e49\u7279\u6027\uff08Attribute\uff09\u548c\u4e2d\u95f4\u4ef6\uff0c\u7cbe\u51c6\u6355\u83b7 API \u8bf7\u6c42\/\u54cd\u5e94\u6570\u636e<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u73af\u5883\u51c6\u5907\u4e0e NuGet \u5305\u5b89\u88c5<\/h2>\n\n\n\n<p>\u5728\u5f00\u59cb\u4e4b\u524d\uff0c\u8bf7\u786e\u4fdd\u60a8\u7684\u5f00\u53d1\u73af\u5883\u6ee1\u8db3\u4ee5\u4e0b\u8981\u6c42\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/docs.microsoft.com\/en-us\/aspnet\/core\/fundamentals\/logging\/?view=aspnetcore-3.1\" target=\"_blank\"  rel=\"nofollow\" >.NET Core 3.1 SDK<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/visualstudio.microsoft.com\/zh-hans\/vs\/community\/\" target=\"_blank\"  rel=\"nofollow\" >Visual Studio 2019 \u6216\u66f4\u9ad8\u7248\u672c<\/a><\/li>\n\n\n\n<li>\u9879\u76ee\u7c7b\u578b\u4e3a ASP.NET Core Web \u5e94\u7528\u7a0b\u5e8f<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u5fc5\u9700\u7684 NuGet \u5305<\/h3>\n\n\n\n<p>\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\u5b89\u88c5\u6240\u9700\u7684 NuGet \u5305\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Install-Package NLog.Web.AspNetCore -Version 4.14.0\nInstall-Package NLog -Version 4.7.15<\/code><\/pre>\n\n\n\n<p>\u6ce8\u610f\uff1a\u5982\u679c\u60a8\u4f7f\u7528 Autofac \u4f5c\u4e3a\u4f9d\u8d56\u6ce8\u5165\u5bb9\u5668\uff0c\u8fd8\u9700\u5b89\u88c5\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Install-Package Autofac.Extensions.DependencyInjection -Version 8.0.0<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u6838\u5fc3\u914d\u7f6e\uff1aNLog.config<\/h2>\n\n\n\n<p>\u5728\u9879\u76ee\u6839\u76ee\u5f55\u521b\u5efa <a href=\"https:\/\/github.com\/NLog\/NLog.Web\" target=\"_blank\"  rel=\"nofollow\" >NLog.config<\/a> \u6587\u4ef6\uff0c\u5e76\u8bbe\u7f6e\u6587\u4ef6\u5c5e\u6027\u4e3a <strong>\"\u59cb\u7ec8\u590d\u5236\u5230\u8f93\u51fa\u76ee\u5f55\"<\/strong> \uff08\u5728 Visual Studio \u4e2d\u53f3\u952e\u6587\u4ef6 \u2192 \u5c5e\u6027 \u2192 \u590d\u5236\u5230\u8f93\u51fa\u76ee\u5f55\uff09\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u5b8c\u6574\u914d\u7f6e\u6587\u4ef6<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"utf-8\" ?&gt;\n&lt;nlog xmlns=\"http:\/\/www.nlog-project.org\/schemas\/NLog.xsd\"\n      xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n      autoReload=\"true\"\n      internalLogLevel=\"Error\"\n      internalLogFile=\"c:\\temp\\internal-nlog.txt\"&gt;\n\n    &lt;!-- \u6269\u5c55 NLog.Web.AspNetCore \u529f\u80fd --&gt;\n    &lt;extensions&gt;\n        &lt;add assembly=\"NLog.Web.AspNetCore\"\/&gt;\n    &lt;\/extensions&gt;\n\n    &lt;!-- \u5168\u5c40\u5e03\u5c40\u53d8\u91cf\u5b9a\u4e49 --&gt;\n    &lt;variable name=\"commonLayout\" value=\"----- $ {newline}\u3010 $ {level:upperCase=true}\u3011 $ {newline}\u65f6\u95f4\uff1a $ {longdate} $ {newline}IP  \uff1a $ {aspnet-request-ip:CheckForwardedForHeader=true} $ {newline}\u4f4d\u7f6e\uff1a $ {logger} -&gt;  $ {aspnet-mvc-action} $ {newline}URL \uff1a $ {aspnet-request-url:IncludeQueryString=true} $ {newline}\u6d88\u606f\uff1a $ {message} $ {onexception: $ {newline}\u5f02\u5e38\uff1a $ {exception:format=tostring}} $ {newline}-----\" \/&gt;\n\n    &lt;variable name=\"apiExchangeLayout\" value=\"-----$ {newline}\u3010\u63a5\u53e3\u4ea4\u4e92\u3011 $ {newline}\u65f6\u95f4\uff1a $ {longdate} $ {newline}IP  \uff1a $ {aspnet-request-ip:CheckForwardedForHeader=true} $ {newline}\u4f4d\u7f6e\uff1a $ {logger} -&gt;  $ {aspnet-mvc-action} $ {newline}URL \uff1a $ {aspnet-request-url:IncludeQueryString=true} $ {newline}\u8be6\u60c5\uff1a $ {newline} $ {message} $ {onexception: $ {newline}\u5f02\u5e38\uff1a $ {exception:format=tostring}} $ {newline}-----\" \/&gt;\n\n    &lt;!-- \u65e5\u5fd7\u76ee\u6807\u914d\u7f6e --&gt;\n    &lt;targets&gt;\n        &lt;!-- \u7cfb\u7edf\u8fd0\u884c\u65e5\u5fd7 --&gt;\n        &lt;target xsi:type=\"File\" name=\"own_file\" fileName=\"log\/ $ {shortdate}\/system_ $ {shortdate}.log\" encoding=\"utf-8\" layout=\" $ {commonLayout}\" \/&gt;\n\n        &lt;!-- \u9519\u8bef\u65e5\u5fd7 --&gt;\n        &lt;target xsi:type=\"File\" name=\"error_file\" fileName=\"log\/ $ {shortdate}\/error_ $ {shortdate}.log\" encoding=\"utf-8\" layout=\" $ {commonLayout}\" \/&gt;\n\n        &lt;!-- API\u63a5\u53e3\u4ea4\u4e92\u65e5\u5fd7 --&gt;\n        &lt;target xsi:type=\"File\" name=\"api_exchange_file\" fileName=\"log\/ $ {shortdate}\/api_exchange_ $ {shortdate}.log\" encoding=\"utf-8\" layout=\" $ {apiExchangeLayout}\" \/&gt;\n\n        &lt;!-- \u9ed1\u6d1e\u76ee\u6807\uff0c\u7528\u4e8e\u8fc7\u6ee4\u4e0d\u9700\u8981\u7684\u65e5\u5fd7 --&gt;\n        &lt;target xsi:type=\"Null\" name=\"blackhole\" \/&gt;\n    &lt;\/targets&gt;\n\n    &lt;!-- \u65e5\u5fd7\u8def\u7531\u89c4\u5219 --&gt;\n    &lt;rules&gt;\n        &lt;!-- \u4f18\u5148\u5904\u7406API\u4ea4\u4e92\u65e5\u5fd7 --&gt;\n        &lt;logger name=\"ApiExchangeLogger\" minlevel=\"Trace\" writeTo=\"api_exchange_file\" final=\"true\" \/&gt;\n\n        &lt;!-- \u8fc7\u6ee4Microsoft\u6846\u67b6\u65e5\u5fd7 --&gt;\n        &lt;logger name=\"Microsoft.*\" maxlevel=\"Info\" writeTo=\"blackhole\" final=\"true\" \/&gt;\n\n        &lt;!-- \u9519\u8bef\u65e5\u5fd7\u5355\u72ec\u8bb0\u5f55 --&gt;\n        &lt;logger name=\"*\" minlevel=\"Error\" writeTo=\"error_file\" \/&gt;\n\n        &lt;!-- \u5176\u4ed6\u65e5\u5fd7\u8bb0\u5f55\u5230\u7cfb\u7edf\u65e5\u5fd7 --&gt;\n        &lt;logger name=\"*\" minlevel=\"Trace\" writeTo=\"own_file\" \/&gt;\n    &lt;\/rules&gt;\n&lt;\/nlog&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u57fa\u7840\u8bbe\u65bd\u96c6\u6210<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Program.cs\uff1aNLog \u5168\u5c40\u521d\u59cb\u5316<\/h3>\n\n\n\n<p>\u5728 .NET Core 3.1 \u4e2d\uff0c\u63a8\u8350\u5728 Program.cs \u4e2d\u8fdb\u884c NLog \u7684\u5168\u5c40\u521d\u59cb\u5316\uff0c\u8fd9\u6837\u53ef\u4ee5\u786e\u4fdd\u6355\u83b7\u5e94\u7528\u7a0b\u5e8f\u542f\u52a8\u548c\u5173\u95ed\u65f6\u7684\u5173\u952e\u65e5\u5fd7\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>using NLog;\nusing NLog.Web;\n\npublic class Program\n{\n    public static void Main(string&#91;] args)\n    {\n        \/\/ \u521d\u59cb\u5316 NLog\n        var logger = NLogBuilder.ConfigureNLog(\"nlog.config\").GetCurrentClassLogger();\n        try\n        {\n            logger.Info(\"\u5e94\u7528\u7a0b\u5e8f\u542f\u52a8\u4e2d...\");\n            CreateHostBuilder(args).Build().Run();\n        }\n        catch (Exception ex)\n        {\n            \/\/ \u6355\u83b7\u542f\u52a8\u5f02\u5e38\n            logger.Error(ex, \"\u5e94\u7528\u7a0b\u5e8f\u542f\u52a8\u5931\u8d25\");\n            throw;\n        }\n        finally\n        {\n            \/\/ \u786e\u4fdd\u65e5\u5fd7\u6b63\u786e\u5173\u95ed\n            NLog.LogManager.Shutdown();\n        }\n    }\n\n    public static IHostBuilder CreateHostBuilder(string&#91;] args) =>\n        Host.CreateDefaultBuilder(args)\n            .ConfigureWebHostDefaults(webBuilder =>\n            {\n                webBuilder.UseStartup();\n            })\n            .ConfigureLogging(logging =>\n            {\n                logging.ClearProviders(); \/\/ \u6e05\u9664\u9ed8\u8ba4\u65e5\u5fd7\u63d0\u4f9b\u7a0b\u5e8f\n                logging.SetMinimumLevel(LogLevel.Trace); \/\/ \u8bbe\u7f6e\u6700\u4f4e\u65e5\u5fd7\u7ea7\u522b\n            })\n            .UseNLog(); \/\/ \u6ce8\u518c NLog\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Startup.cs\uff1a\u8bf7\u6c42\u7ba1\u9053\u914d\u7f6e<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>using Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.DependencyInjection;\n\npublic class Startup\n{\n    public void ConfigureServices(IServiceCollection services)\n    {\n        \/\/ \u5fc5\u987b\u6ce8\u5165 HttpContextAccessor \u4ee5\u652f\u6301 NLog \u7684 ASP.NET Core \u5e03\u5c40\u6e32\u67d3\u5668\n        services.AddHttpContextAccessor();\n\n        \/\/ \u6dfb\u52a0\u63a7\u5236\u5668\n        services.AddControllers();\n\n        \/\/ \u5176\u4ed6\u670d\u52a1\u6ce8\u518c...\n    }\n\n    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)\n    {\n        \/\/ \u5904\u7406\u53cd\u5411\u4ee3\u7406\uff08\u5982 Nginx\u3001IIS\uff09\u7684\u771f\u5b9e\u5ba2\u6237\u7aef IP\n        app.UseForwardedHeaders(new ForwardedHeadersOptions\n        {\n            ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto\n        });\n\n        app.UseRouting();\n\n        \/\/ \u81ea\u5b9a\u4e49\u65e5\u5fd7\u4e2d\u95f4\u4ef6\uff08\u5fc5\u987b\u5728 UseRouting \u4e4b\u540e\uff09\n        app.UseMiddleware();\n\n        app.UseEndpoints(endpoints =>\n        {\n            endpoints.MapControllers();\n        });\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u9ad8\u7ea7\u529f\u80fd\uff1aAPI \u4ea4\u4e92\u65e5\u5fd7\u8ffd\u8e2a<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u81ea\u5b9a\u4e49\u6807\u8bb0\u7279\u6027 [Log]<\/h3>\n\n\n\n<p>\u521b\u5efa\u4e00\u4e2a\u81ea\u5b9a\u4e49\u7279\u6027\uff0c\u7528\u4e8e\u6807\u8bb0\u9700\u8981\u8bb0\u5f55\u4ea4\u4e92\u65e5\u5fd7\u7684\u63a7\u5236\u5668\u6216\u65b9\u6cd5\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>using System;\n\n&#91;AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]\npublic class LogAttribute : Attribute\n{\n    \/\/\/ \n    \/\/\/ \u662f\u5426\u8bb0\u5f55\u54cd\u5e94\u4f53\uff08\u9ed8\u8ba4\u4ec5\u8bb0\u5f55\u975e200\u72b6\u6001\u7684\u54cd\u5e94\uff09\n    \/\/\/ \n    public bool LogResponseBody { get; set; } = false;\n\n    \/\/\/ \n    \/\/\/ \u6784\u9020\u51fd\u6570\n    \/\/\/ \n    \/\/\/ \u662f\u5426\u5f3a\u5236\u8bb0\u5f55\u6240\u6709\u54cd\u5e94\u4f53\n    public LogAttribute(bool logResponseBody = false)\n    {\n        LogResponseBody = logResponseBody;\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6838\u5fc3\u4e2d\u95f4\u4ef6\u5b9e\u73b0<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>using System.IO;\nusing System.Text;\nusing System.Threading.Tasks;\nusing Microsoft.AspNetCore.Http;\nusing Microsoft.Extensions.Logging;\nusing Microsoft.AspNetCore.Routing;\n\npublic class HttpLoggingMiddleware\n{\n    private readonly RequestDelegate _next;\n    private readonly ILogger _apiLogger;\n    private const string newline = \"rn\";\n\n    public HttpLoggingMiddleware(RequestDelegate next, ILoggerFactory loggerFactory)\n    {\n        _next = next;\n        \/\/ \u4f7f\u7528\u5728 NLog.config \u4e2d\u5b9a\u4e49\u7684\u7279\u5b9a\u65e5\u5fd7\u8bb0\u5f55\u5668\n        _apiLogger = loggerFactory.CreateLogger(\"ApiExchangeLogger\");\n    }\n\n    public async Task Invoke(HttpContext context)\n    {\n        \/\/ \u83b7\u53d6\u7aef\u70b9\u5143\u6570\u636e\n        var endpoint = context.GetEndpoint();\n        var logAttr = endpoint?.Metadata.GetMetadata();\n\n        \/\/ \u4ec5\u5904\u7406\u6807\u8bb0\u4e86 &#91;Log] \u7279\u6027\u7684\u8bf7\u6c42\n        if (logAttr == null)\n        {\n            await _next(context);\n            return;\n        }\n\n        \/\/ 1. \u8bfb\u53d6\u8bf7\u6c42\u6570\u636e\n        var (queryString, requestBody) = await ReadRequestData(context);\n\n        \/\/ 2. \u66ff\u6362\u54cd\u5e94\u6d41\u4ee5\u4fbf\u6355\u83b7\u54cd\u5e94\u5185\u5bb9\n        var originalBody = context.Response.Body;\n        await using var responseBody = new MemoryStream();\n        context.Response.Body = responseBody;\n\n        try\n        {\n            await _next(context);\n\n            \/\/ 3. \u8bfb\u53d6\u54cd\u5e94\u6570\u636e\uff08\u6839\u636e\u7b56\u7565\u51b3\u5b9a\u662f\u5426\u8bb0\u5f55\uff09\n            string responseText = await ReadResponseData(context, logAttr, responseBody);\n\n            \/\/ 4. \u8bb0\u5f55\u65e5\u5fd7\n            LogApiExchange(context, queryString, requestBody, responseText, logAttr);\n\n            \/\/ 5. \u6062\u590d\u539f\u59cb\u54cd\u5e94\u6d41\n            await WriteResponseToClient(context, responseBody, originalBody);\n        }\n        finally\n        {\n            context.Response.Body = originalBody;\n        }\n    }\n\n    private async Task ReadRequestData(HttpContext context)\n    {\n        var queryString = context.Request.QueryString.Value ?? string.Empty;\n        string requestBody = \"&#91;\u65e0\u8bf7\u6c42\u4f53]\";\n\n        \/\/ \u8df3\u8fc7\u6587\u4ef6\u4e0a\u4f20\u8bf7\u6c42\u7684\u8bfb\u53d6\n        bool isUpload = context.Request.HasFormContentType &amp;&amp; \n                       context.Request.ContentType?.Contains(\"multipart\/form-data\", StringComparison.OrdinalIgnoreCase);\n\n        if (!isUpload &amp;&amp; context.Request.ContentLength > 0)\n        {\n            context.Request.EnableBuffering();\n            requestBody = await ReadStreamContent(context.Request.Body);\n        }\n\n        return (queryString, requestBody);\n    }\n\n    private async Task ReadResponseData(HttpContext context, LogAttribute logAttr, Stream responseBody)\n    {\n        if (context.Response.StatusCode == 200 &amp;&amp; !logAttr.LogResponseBody)\n        {\n            return \"&#91;\u72b6\u6001200\uff0c\u672a\u8bb0\u5f55\u54cd\u5e94\u4f53]\";\n        }\n\n        return await ReadStreamContent(responseBody);\n    }\n\n    private void LogApiExchange(HttpContext context, string queryString, string requestBody, string responseText, LogAttribute logAttr)\n    {\n        var logMessage = new StringBuilder();\n        logMessage.AppendLine(\"&#91;\u8bf7\u6c42]: Query:{queryString} | Body:{requestBody}\");\n        logMessage.AppendLine(\"&#91;\u54cd\u5e94]: {responseText}\");\n        logMessage.AppendLine(\"&#91;\u72b6\u6001]: {context.Response.StatusCode}\");\n\n        \/\/ \u6839\u636e\u72b6\u6001\u7801\u51b3\u5b9a\u65e5\u5fd7\u7ea7\u522b\n        if (context.Response.StatusCode >= 500)\n        {\n            _apiLogger.LogError(logMessage.ToString());\n        }\n        else if (context.Response.StatusCode >= 400)\n        {\n            _apiLogger.LogWarning(logMessage.ToString());\n        }\n        else\n        {\n            _apiLogger.LogInformation(logMessage.ToString());\n        }\n    }\n\n    private async Task WriteResponseToClient(HttpContext context, Stream responseBody, Stream originalBody)\n    {\n        responseBody.Seek(0, SeekOrigin.Begin);\n        await responseBody.CopyToAsync(originalBody);\n    }\n\n    private async Task ReadStreamContent(Stream stream)\n    {\n        if (stream == null || !stream.CanRead)\n            return \"&#91;\u4e0d\u53ef\u8bfb\u53d6\u7684\u6d41]\";\n\n        stream.Seek(0, SeekOrigin.Begin);\n        using var reader = new StreamReader(stream, Encoding.UTF8, detectEncodingFromByteOrderMarks: true, bufferSize: 1024, leaveOpen: true);\n        var content = await reader.ReadToEndAsync();\n        stream.Seek(0, SeekOrigin.Begin);\n        return content.Length > 1000 ? content.Substring(0, 1000) + \"...\" : content;\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u793a\u4f8b<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;HttpPost]\n&#91;Log] \/\/ \u53ea\u6709\u8fd9\u4e2a\u63a5\u53e3\u4f1a\u4ea7\u751f\u4ea4\u4e92\u65e5\u5fd7\npublic IActionResult PushData(&#91;FromBody] MyData data)\n{\n    return Ok(\"Success\");\n}\n\n&#91;HttpGet]\npublic IActionResult Heartbeat() \/\/ \u8fd9\u4e2a\u63a5\u53e3\u518d\u4e5f\u4e0d\u4f1a\u51fa\u73b0\u5728\u65e5\u5fd7\u91cc\n{\n    return Ok(\"Alive\");\n}\n\n&#91;Log(true)] \/\/ \u5373\u4f7f\u72b6\u6001\u7801\u662f 200\uff0c\u4e5f\u4f1a\u8bb0\u5f55\u51fa\u53c2\npublic IActionResult GetImportantInfo() { ... }\n\n&#91;Route(\"api\/&#91;controller]\")]\n&#91;Log] \/\/ \u8be5\u63a7\u5236\u5668\u4e0b\u7684\u6240\u6709 Action \u90fd\u4f1a\u8bb0\u5f55\u65e5\u5fd7\npublic class OrderController : ControllerBase { ... }<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u6700\u4f73\u5b9e\u8df5\u4e0e\u6ce8\u610f\u4e8b\u9879<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u5173\u952e\u914d\u7f6e\u8981\u70b9<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong><mark>\u2705 \u5355\u70b9\u96c6\u6210\u539f\u5219<\/mark><\/strong>\uff1a<br>\u4e25\u683c\u9075\u5faa\u5728<code>Program.cs<\/code>\u4e2d\u901a\u8fc7<code>.UseNLog()<\/code>\u8fdb\u884c\u96c6\u6210\uff0c\u907f\u514d\u5728<code>Startup.cs<\/code>\u4e2d\u91cd\u590d\u8c03\u7528<code>AddNLog()<\/code>\uff0c\u8fd9\u53ef\u80fd\u5bfc\u81f4\u65e5\u5fd7\u91cd\u590d\u6216\u4e22\u5931\u3002<\/li>\n\n\n\n<li><strong><mark>\u2705 \u6d41\u5904\u7406\u5b89\u5168<\/mark><\/strong>\uff1a<br>\u6bcf\u6b21\u8bfb\u53d6\u8bf7\u6c42\/\u54cd\u5e94\u6d41\u540e\uff0c\u5fc5\u987b\u8c03\u7528<code>stream.Seek(0, SeekOrigin.Begin)<\/code>\u91cd\u7f6e\u6d41\u4f4d\u7f6e\uff0c\u5426\u5219\u5ba2\u6237\u7aef\u5c06\u6536\u5230\u7a7a\u54cd\u5e94\u3002\u4e2d\u95f4\u4ef6\u4e2d\u4f7f\u7528<code>try-finally<\/code>\u786e\u4fdd\u6d41\u7684\u6b63\u786e\u6062\u590d\u3002<\/li>\n\n\n\n<li><strong><mark>\u2705 \u65e5\u5fd7\u5206\u6d41\u673a\u5236<\/mark><\/strong>\uff1a<br>\u5728<code>NLog.config<\/code>\u7684\u89c4\u5219\u914d\u7f6e\u4e2d\uff0c\u5173\u952e\u5c5e\u6027<code>final=\"true\"<\/code>\u7528\u4e8e\u963b\u6b62\u65e5\u5fd7\"\u5192\u6ce1\"\u5230\u540e\u7eed\u89c4\u5219\uff0c\u8fd9\u662f\u5b9e\u73b0\u65e5\u5fd7\u7cbe\u51c6\u5206\u6d41\u7684\u6838\u5fc3\u673a\u5236\u3002<\/li>\n\n\n\n<li><strong><mark>\u2705 \u751f\u4ea7\u73af\u5883\u4f18\u5316<\/mark><\/strong>\uff1a<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5c06<code>internalLogLevel<\/code>\u4ece \"Error\" \u8c03\u6574\u4e3a \"Warn\" \u4ee5\u51cf\u5c11\u5185\u90e8\u65e5\u5fd7<\/li>\n\n\n\n<li>\u6dfb\u52a0\u6587\u4ef6\u5f52\u6863\u7b56\u7565\uff1a<code>&lt;target xsi:type=\"File\" ... archiveEvery=\"Day\" maxArchiveFiles=\"30\" \/><\/code><\/li>\n\n\n\n<li>\u8003\u8651\u4f7f\u7528\u5f02\u6b65\u5305\u88c5\u5668\u63d0\u5347\u6027\u80fd\uff1a<code>&lt;targets async=\"true\"><\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u6027\u80fd\u8003\u91cf<\/h3>\n\n\n\n<p>\u26a1 \u907f\u514d\u5927\u578b\u8bf7\u6c42\u4f53\u8bb0\u5f55\uff1a\u4e2d\u95f4\u4ef6\u5df2\u81ea\u52a8\u8df3\u8fc7<code>multipart\/form-data<\/code>\u8bf7\u6c42\u7684\u8bfb\u53d6\uff0c\u9632\u6b62\u6587\u4ef6\u4e0a\u4f20\u5bfc\u81f4\u7684\u5185\u5b58\u6ea2\u51fa<br>\u26a1 \u54cd\u5e94\u4f53\u622a\u65ad\uff1a\u8d85\u8fc71000\u5b57\u7b26\u7684\u54cd\u5e94\u4f53\u4f1a\u88ab\u622a\u65ad\uff0c\u5e73\u8861\u65e5\u5fd7\u8be6\u7ec6\u5ea6\u4e0e\u6027\u80fd<br>\u26a1 \u5f02\u6b65\u65e5\u5fd7\u5199\u5165\uff1aNLog \u9ed8\u8ba4\u4f7f\u7528\u5f02\u6b65\u5199\u5165\uff0c\u4f46\u53ef\u901a\u8fc7<code>&lt;targets async=\"true\"&gt;<\/code>\u8fdb\u4e00\u6b65\u4f18\u5316<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u603b\u7ed3<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u901a\u8fc7\u672c\u6587\u4ecb\u7ecd\u7684 NLog \u9ad8\u7ea7\u914d\u7f6e\u65b9\u6848\uff0c\u60a8\u53ef\u4ee5\u6784\u5efa\u4e00\u4e2a\u4f01\u4e1a\u7ea7\u7684\u65e5\u5fd7\u7cfb\u7edf\uff0c\u5b9e\u73b0\uff1a<\/li>\n\n\n\n<li>\u7cbe\u51c6\u7684\u95ee\u9898\u5b9a\u4f4d\uff1a\u901a\u8fc7\u63a5\u53e3\u4ea4\u4e92\u65e5\u5fd7\u5feb\u901f\u5b9a\u4f4d API \u5c42\u95ee\u9898<\/li>\n\n\n\n<li>\u9ad8\u6548\u7684\u65e5\u5fd7\u7ba1\u7406\uff1a\u7269\u7406\u9694\u79bb\u4e0d\u540c\u7c7b\u578b\u7684\u65e5\u5fd7\uff0c\u63d0\u9ad8\u67e5\u8be2\u6548\u7387<\/li>\n\n\n\n<li>\u7075\u6d3b\u7684\u6269\u5c55\u6027\uff1a\u57fa\u4e8e\u7279\u6027\u6807\u8bb0\u7684\u673a\u5236\uff0c\u53ef\u4ee5\u8f7b\u677e\u6269\u5c55\u5230\u5176\u4ed6\u76d1\u63a7\u573a\u666f<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\ud83d\udca1 \u6269\u5c55\u5efa\u8bae\uff1a\u8003\u8651\u5c06\u6b64\u65b9\u6848\u4e0e<a href=\"https:\/\/owasp.org\/www-project-cheat-sheets\/\" target=\"_blank\"  rel=\"nofollow\" >ELK Stack\uff08Elasticsearch, Logstash, Kibana\uff09\u6216 Application Insights<\/a> \u96c6\u6210\uff0c\u5b9e\u73b0\u65e5\u5fd7\u7684\u96c6\u4e2d\u5316\u7ba1\u7406\u548c\u53ef\u89c6\u5316\u5206\u6790\u3002<\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>\u6982\u8ff0 \u5728\u73b0\u4ee3 .NET Core \u5e94\u7528\u7a0b\u5e8f\u4e2d\uff0c\u4e00\u4e2a\u5f3a\u5927\u4e14\u7075\u6d3b\u7684\u65e5\u5fd7\u7cfb\u7edf\u662f\u4fdd\u969c\u7cfb\u7edf\u7a33\u5b9a\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u7684\u57fa\u77f3\u3002\u672c\u6587\u5c06\u6df1\u5165\u63a2\u8ba8\u5982\u4f55\u5728 .N &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"emotion":"","emotion_color":"","title_style":"","license":"","footnotes":""},"categories":[7,6],"tags":[50,52,51],"class_list":["post-667","post","type-post","status-publish","format-standard","hentry","category-c","category-code","tag-c","tag-log","tag-nlog"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>.NET Core 3.1 \u4e2d NLog \u9ad8\u7ea7\u65e5\u5fd7\u914d\u7f6e\uff1a\u5b9e\u73b0\u63a5\u53e3\u4ea4\u4e92\u8ffd\u8e2a\u4e0e\u65e5\u5fd7\u5206\u79bb - \u4ed6\u7684\u65e5\u5e38\u65f6\u5149<\/title>\n<meta name=\"description\" content=\"\u6df1\u5165\u5b66\u4e60.NET Core 3.1\u4e2dNLog\u9ad8\u7ea7\u914d\u7f6e\uff0c\u5b9e\u73b0API\u63a5\u53e3\u65e5\u5fd7\u8ffd\u8e2a\u3001\u9519\u8bef\u5206\u79bb\u4e0e\u81ea\u5b9a\u4e49\u683c\u5f0f\u5316\u3002\u5305\u542b\u5b8c\u6574\u4ee3\u7801\u793a\u4f8b\u548c\u6700\u4f73\u5b9e\u8df5\uff0c\u63d0\u5347\u7cfb\u7edf\u53ef\u89c2\u6d4b\u6027\u3002\u7acb\u5373\u638c\u63e1\u4f01\u4e1a\u7ea7\u65e5\u5fd7\u89e3\u51b3\u65b9\u6848\uff01\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.17ci.com\/index.php\/slug-netcore31-nlog-advanced-logging-api-tracing\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\".NET Core 3.1 \u4e2d NLog \u9ad8\u7ea7\u65e5\u5fd7\u914d\u7f6e\uff1a\u5b9e\u73b0\u63a5\u53e3\u4ea4\u4e92\u8ffd\u8e2a\u4e0e\u65e5\u5fd7\u5206\u79bb - \u4ed6\u7684\u65e5\u5e38\u65f6\u5149\" \/>\n<meta property=\"og:description\" content=\"\u6df1\u5165\u5b66\u4e60.NET Core 3.1\u4e2dNLog\u9ad8\u7ea7\u914d\u7f6e\uff0c\u5b9e\u73b0API\u63a5\u53e3\u65e5\u5fd7\u8ffd\u8e2a\u3001\u9519\u8bef\u5206\u79bb\u4e0e\u81ea\u5b9a\u4e49\u683c\u5f0f\u5316\u3002\u5305\u542b\u5b8c\u6574\u4ee3\u7801\u793a\u4f8b\u548c\u6700\u4f73\u5b9e\u8df5\uff0c\u63d0\u5347\u7cfb\u7edf\u53ef\u89c2\u6d4b\u6027\u3002\u7acb\u5373\u638c\u63e1\u4f01\u4e1a\u7ea7\u65e5\u5fd7\u89e3\u51b3\u65b9\u6848\uff01\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.17ci.com\/index.php\/slug-netcore31-nlog-advanced-logging-api-tracing\/\" \/>\n<meta property=\"og:site_name\" content=\"\u4ed6\u7684\u65e5\u5e38\u65f6\u5149\" \/>\n<meta property=\"article:published_time\" content=\"2026-04-15T06:23:02+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-15T06:23:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.17ci.com\/wp-content\/uploads\/2023\/12\/1702602409-logoko.png\" \/>\n\t<meta property=\"og:image:width\" content=\"400\" \/>\n\t<meta property=\"og:image:height\" content=\"400\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"xieshuoshuo\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"xieshuoshuo\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"1 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.17ci.com\\\/index.php\\\/slug-netcore31-nlog-advanced-logging-api-tracing\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.17ci.com\\\/index.php\\\/slug-netcore31-nlog-advanced-logging-api-tracing\\\/\"},\"author\":{\"name\":\"xieshuoshuo\",\"@id\":\"https:\\\/\\\/www.17ci.com\\\/#\\\/schema\\\/person\\\/2b6d2c8bdf88e9055aba3abf2f2852b8\"},\"headline\":\".NET Core 3.1 \u4e2d NLog \u9ad8\u7ea7\u65e5\u5fd7\u914d\u7f6e\uff1a\u5b9e\u73b0\u63a5\u53e3\u4ea4\u4e92\u8ffd\u8e2a\u4e0e\u65e5\u5fd7\u5206\u79bb\",\"datePublished\":\"2026-04-15T06:23:02+00:00\",\"dateModified\":\"2026-04-15T06:23:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.17ci.com\\\/index.php\\\/slug-netcore31-nlog-advanced-logging-api-tracing\\\/\"},\"wordCount\":53,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.17ci.com\\\/#\\\/schema\\\/person\\\/2b6d2c8bdf88e9055aba3abf2f2852b8\"},\"keywords\":[\"C#\",\"Log\",\"NLog\"],\"articleSection\":[\"C#\",\"\u4ee3\u7801\"],\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.17ci.com\\\/index.php\\\/slug-netcore31-nlog-advanced-logging-api-tracing\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.17ci.com\\\/index.php\\\/slug-netcore31-nlog-advanced-logging-api-tracing\\\/\",\"url\":\"https:\\\/\\\/www.17ci.com\\\/index.php\\\/slug-netcore31-nlog-advanced-logging-api-tracing\\\/\",\"name\":\".NET Core 3.1 \u4e2d NLog \u9ad8\u7ea7\u65e5\u5fd7\u914d\u7f6e\uff1a\u5b9e\u73b0\u63a5\u53e3\u4ea4\u4e92\u8ffd\u8e2a\u4e0e\u65e5\u5fd7\u5206\u79bb - \u4ed6\u7684\u65e5\u5e38\u65f6\u5149\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.17ci.com\\\/#website\"},\"datePublished\":\"2026-04-15T06:23:02+00:00\",\"dateModified\":\"2026-04-15T06:23:07+00:00\",\"description\":\"\u6df1\u5165\u5b66\u4e60.NET Core 3.1\u4e2dNLog\u9ad8\u7ea7\u914d\u7f6e\uff0c\u5b9e\u73b0API\u63a5\u53e3\u65e5\u5fd7\u8ffd\u8e2a\u3001\u9519\u8bef\u5206\u79bb\u4e0e\u81ea\u5b9a\u4e49\u683c\u5f0f\u5316\u3002\u5305\u542b\u5b8c\u6574\u4ee3\u7801\u793a\u4f8b\u548c\u6700\u4f73\u5b9e\u8df5\uff0c\u63d0\u5347\u7cfb\u7edf\u53ef\u89c2\u6d4b\u6027\u3002\u7acb\u5373\u638c\u63e1\u4f01\u4e1a\u7ea7\u65e5\u5fd7\u89e3\u51b3\u65b9\u6848\uff01\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.17ci.com\\\/index.php\\\/slug-netcore31-nlog-advanced-logging-api-tracing\\\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.17ci.com\\\/index.php\\\/slug-netcore31-nlog-advanced-logging-api-tracing\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.17ci.com\\\/index.php\\\/slug-netcore31-nlog-advanced-logging-api-tracing\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\\\/\\\/www.17ci.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\".NET Core 3.1 \u4e2d NLog \u9ad8\u7ea7\u65e5\u5fd7\u914d\u7f6e\uff1a\u5b9e\u73b0\u63a5\u53e3\u4ea4\u4e92\u8ffd\u8e2a\u4e0e\u65e5\u5fd7\u5206\u79bb\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.17ci.com\\\/#website\",\"url\":\"https:\\\/\\\/www.17ci.com\\\/\",\"name\":\"\u4ed6\u7684\u65e5\u5e38\u65f6\u5149\",\"description\":\"\u832b\u832b\u4eba\u751f\uff0c\u597d\u50cf\u8352\u91ce...\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.17ci.com\\\/#\\\/schema\\\/person\\\/2b6d2c8bdf88e9055aba3abf2f2852b8\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.17ci.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"zh-Hans\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.17ci.com\\\/#\\\/schema\\\/person\\\/2b6d2c8bdf88e9055aba3abf2f2852b8\",\"name\":\"xieshuoshuo\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\\\/\\\/www.17ci.com\\\/wp-content\\\/uploads\\\/2023\\\/12\\\/1702602405-avatar.jpg\",\"url\":\"https:\\\/\\\/www.17ci.com\\\/wp-content\\\/uploads\\\/2023\\\/12\\\/1702602405-avatar.jpg\",\"contentUrl\":\"https:\\\/\\\/www.17ci.com\\\/wp-content\\\/uploads\\\/2023\\\/12\\\/1702602405-avatar.jpg\",\"width\":1619,\"height\":1619,\"caption\":\"xieshuoshuo\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.17ci.com\\\/wp-content\\\/uploads\\\/2023\\\/12\\\/1702602405-avatar.jpg\"},\"description\":\"\u8fd9\u662f\u4e00\u4e2a\u795e\u79d8\u4eba\u58eb\uff0c\u6216\u8bb8\u7528\u6307\u5b9a\u7684\u65b9\u5f0f\u53ef\u4ee5\u8054\u7cfb\u5230......\",\"sameAs\":[\"https:\\\/\\\/www.17ci.com\"],\"url\":\"https:\\\/\\\/www.17ci.com\\\/index.php\\\/author\\\/xieshuoshuo\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":".NET Core 3.1 \u4e2d NLog \u9ad8\u7ea7\u65e5\u5fd7\u914d\u7f6e\uff1a\u5b9e\u73b0\u63a5\u53e3\u4ea4\u4e92\u8ffd\u8e2a\u4e0e\u65e5\u5fd7\u5206\u79bb - \u4ed6\u7684\u65e5\u5e38\u65f6\u5149","description":"\u6df1\u5165\u5b66\u4e60.NET Core 3.1\u4e2dNLog\u9ad8\u7ea7\u914d\u7f6e\uff0c\u5b9e\u73b0API\u63a5\u53e3\u65e5\u5fd7\u8ffd\u8e2a\u3001\u9519\u8bef\u5206\u79bb\u4e0e\u81ea\u5b9a\u4e49\u683c\u5f0f\u5316\u3002\u5305\u542b\u5b8c\u6574\u4ee3\u7801\u793a\u4f8b\u548c\u6700\u4f73\u5b9e\u8df5\uff0c\u63d0\u5347\u7cfb\u7edf\u53ef\u89c2\u6d4b\u6027\u3002\u7acb\u5373\u638c\u63e1\u4f01\u4e1a\u7ea7\u65e5\u5fd7\u89e3\u51b3\u65b9\u6848\uff01","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.17ci.com\/index.php\/slug-netcore31-nlog-advanced-logging-api-tracing\/","og_locale":"zh_CN","og_type":"article","og_title":".NET Core 3.1 \u4e2d NLog \u9ad8\u7ea7\u65e5\u5fd7\u914d\u7f6e\uff1a\u5b9e\u73b0\u63a5\u53e3\u4ea4\u4e92\u8ffd\u8e2a\u4e0e\u65e5\u5fd7\u5206\u79bb - \u4ed6\u7684\u65e5\u5e38\u65f6\u5149","og_description":"\u6df1\u5165\u5b66\u4e60.NET Core 3.1\u4e2dNLog\u9ad8\u7ea7\u914d\u7f6e\uff0c\u5b9e\u73b0API\u63a5\u53e3\u65e5\u5fd7\u8ffd\u8e2a\u3001\u9519\u8bef\u5206\u79bb\u4e0e\u81ea\u5b9a\u4e49\u683c\u5f0f\u5316\u3002\u5305\u542b\u5b8c\u6574\u4ee3\u7801\u793a\u4f8b\u548c\u6700\u4f73\u5b9e\u8df5\uff0c\u63d0\u5347\u7cfb\u7edf\u53ef\u89c2\u6d4b\u6027\u3002\u7acb\u5373\u638c\u63e1\u4f01\u4e1a\u7ea7\u65e5\u5fd7\u89e3\u51b3\u65b9\u6848\uff01","og_url":"https:\/\/www.17ci.com\/index.php\/slug-netcore31-nlog-advanced-logging-api-tracing\/","og_site_name":"\u4ed6\u7684\u65e5\u5e38\u65f6\u5149","article_published_time":"2026-04-15T06:23:02+00:00","article_modified_time":"2026-04-15T06:23:07+00:00","og_image":[{"width":400,"height":400,"url":"https:\/\/www.17ci.com\/wp-content\/uploads\/2023\/12\/1702602409-logoko.png","type":"image\/png"}],"author":"xieshuoshuo","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"xieshuoshuo","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"1 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.17ci.com\/index.php\/slug-netcore31-nlog-advanced-logging-api-tracing\/#article","isPartOf":{"@id":"https:\/\/www.17ci.com\/index.php\/slug-netcore31-nlog-advanced-logging-api-tracing\/"},"author":{"name":"xieshuoshuo","@id":"https:\/\/www.17ci.com\/#\/schema\/person\/2b6d2c8bdf88e9055aba3abf2f2852b8"},"headline":".NET Core 3.1 \u4e2d NLog \u9ad8\u7ea7\u65e5\u5fd7\u914d\u7f6e\uff1a\u5b9e\u73b0\u63a5\u53e3\u4ea4\u4e92\u8ffd\u8e2a\u4e0e\u65e5\u5fd7\u5206\u79bb","datePublished":"2026-04-15T06:23:02+00:00","dateModified":"2026-04-15T06:23:07+00:00","mainEntityOfPage":{"@id":"https:\/\/www.17ci.com\/index.php\/slug-netcore31-nlog-advanced-logging-api-tracing\/"},"wordCount":53,"commentCount":0,"publisher":{"@id":"https:\/\/www.17ci.com\/#\/schema\/person\/2b6d2c8bdf88e9055aba3abf2f2852b8"},"keywords":["C#","Log","NLog"],"articleSection":["C#","\u4ee3\u7801"],"inLanguage":"zh-Hans","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.17ci.com\/index.php\/slug-netcore31-nlog-advanced-logging-api-tracing\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.17ci.com\/index.php\/slug-netcore31-nlog-advanced-logging-api-tracing\/","url":"https:\/\/www.17ci.com\/index.php\/slug-netcore31-nlog-advanced-logging-api-tracing\/","name":".NET Core 3.1 \u4e2d NLog \u9ad8\u7ea7\u65e5\u5fd7\u914d\u7f6e\uff1a\u5b9e\u73b0\u63a5\u53e3\u4ea4\u4e92\u8ffd\u8e2a\u4e0e\u65e5\u5fd7\u5206\u79bb - \u4ed6\u7684\u65e5\u5e38\u65f6\u5149","isPartOf":{"@id":"https:\/\/www.17ci.com\/#website"},"datePublished":"2026-04-15T06:23:02+00:00","dateModified":"2026-04-15T06:23:07+00:00","description":"\u6df1\u5165\u5b66\u4e60.NET Core 3.1\u4e2dNLog\u9ad8\u7ea7\u914d\u7f6e\uff0c\u5b9e\u73b0API\u63a5\u53e3\u65e5\u5fd7\u8ffd\u8e2a\u3001\u9519\u8bef\u5206\u79bb\u4e0e\u81ea\u5b9a\u4e49\u683c\u5f0f\u5316\u3002\u5305\u542b\u5b8c\u6574\u4ee3\u7801\u793a\u4f8b\u548c\u6700\u4f73\u5b9e\u8df5\uff0c\u63d0\u5347\u7cfb\u7edf\u53ef\u89c2\u6d4b\u6027\u3002\u7acb\u5373\u638c\u63e1\u4f01\u4e1a\u7ea7\u65e5\u5fd7\u89e3\u51b3\u65b9\u6848\uff01","breadcrumb":{"@id":"https:\/\/www.17ci.com\/index.php\/slug-netcore31-nlog-advanced-logging-api-tracing\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.17ci.com\/index.php\/slug-netcore31-nlog-advanced-logging-api-tracing\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.17ci.com\/index.php\/slug-netcore31-nlog-advanced-logging-api-tracing\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.17ci.com\/"},{"@type":"ListItem","position":2,"name":".NET Core 3.1 \u4e2d NLog \u9ad8\u7ea7\u65e5\u5fd7\u914d\u7f6e\uff1a\u5b9e\u73b0\u63a5\u53e3\u4ea4\u4e92\u8ffd\u8e2a\u4e0e\u65e5\u5fd7\u5206\u79bb"}]},{"@type":"WebSite","@id":"https:\/\/www.17ci.com\/#website","url":"https:\/\/www.17ci.com\/","name":"\u4ed6\u7684\u65e5\u5e38\u65f6\u5149","description":"\u832b\u832b\u4eba\u751f\uff0c\u597d\u50cf\u8352\u91ce...","publisher":{"@id":"https:\/\/www.17ci.com\/#\/schema\/person\/2b6d2c8bdf88e9055aba3abf2f2852b8"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.17ci.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"zh-Hans"},{"@type":["Person","Organization"],"@id":"https:\/\/www.17ci.com\/#\/schema\/person\/2b6d2c8bdf88e9055aba3abf2f2852b8","name":"xieshuoshuo","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.17ci.com\/wp-content\/uploads\/2023\/12\/1702602405-avatar.jpg","url":"https:\/\/www.17ci.com\/wp-content\/uploads\/2023\/12\/1702602405-avatar.jpg","contentUrl":"https:\/\/www.17ci.com\/wp-content\/uploads\/2023\/12\/1702602405-avatar.jpg","width":1619,"height":1619,"caption":"xieshuoshuo"},"logo":{"@id":"https:\/\/www.17ci.com\/wp-content\/uploads\/2023\/12\/1702602405-avatar.jpg"},"description":"\u8fd9\u662f\u4e00\u4e2a\u795e\u79d8\u4eba\u58eb\uff0c\u6216\u8bb8\u7528\u6307\u5b9a\u7684\u65b9\u5f0f\u53ef\u4ee5\u8054\u7cfb\u5230......","sameAs":["https:\/\/www.17ci.com"],"url":"https:\/\/www.17ci.com\/index.php\/author\/xieshuoshuo\/"}]}},"_links":{"self":[{"href":"https:\/\/www.17ci.com\/index.php\/wp-json\/wp\/v2\/posts\/667","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.17ci.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.17ci.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.17ci.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.17ci.com\/index.php\/wp-json\/wp\/v2\/comments?post=667"}],"version-history":[{"count":3,"href":"https:\/\/www.17ci.com\/index.php\/wp-json\/wp\/v2\/posts\/667\/revisions"}],"predecessor-version":[{"id":671,"href":"https:\/\/www.17ci.com\/index.php\/wp-json\/wp\/v2\/posts\/667\/revisions\/671"}],"wp:attachment":[{"href":"https:\/\/www.17ci.com\/index.php\/wp-json\/wp\/v2\/media?parent=667"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.17ci.com\/index.php\/wp-json\/wp\/v2\/categories?post=667"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.17ci.com\/index.php\/wp-json\/wp\/v2\/tags?post=667"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}