我将 NLog 与 IIS10 中托管的 .netcore31 web api 一起使用。
We are following a design by Filip 允许在应用程序内为每个应用程序区域/分支运行并行和独立的管道。
我想为每个独立管道配置单独的 nlog.config 文件,以便每个管道都有自己的日志记录配置和日志记录过滤器/目标等。
我使用以下代码为每个分支配置单独的 nlog.config -
//示例代码 - 每个分支/管道
var webHostBuilder = WebHost.CreateDefaultBuilder()
.ConfigureLogging((hostingContext, logging) =>
{
logging.AddNLog(serviceProvider => new LogFactory(nLogConfigFilePathForBranch))
})
我在应用程序中配置了 18 个这样的分支。 我没有在代码中的任何地方使用 UseNLog() 方法。
在负载(200 个并发请求)下,应用程序的响应时间非常短,应用程序在前 4-5 分钟内停止,然后以非常慢的速度响应。功能中有一个针对单个视图的“选择”查询(从大约 500 条记录中选择 1 条记录)。
我还在 NLog 内部日志中看到一个错误 - “警告刷新完成,但出现错误异常:System.TimeoutException:刷新所有目标时超时,等待 15 秒后。”
我正在使用以下 Nuget pckgs -
<PackageReference Include="NLog" Version="4.7.4" />
<PackageReference Include="NLog.Web.AspNetCore" Version="4.9.3" />
<PackageReference Include="NLog.WindowsEventLog" Version="4.7.4" />
NLog.Config 通常看起来像 -
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true" internalLogLevel="off" internalLogFile="admin.internalLog.txt">
<extensions>
<add assembly="NLog.Web.AspNetCore" />
<add assembly="NLog.WindowsEventLog" />
<add assembly="Sirius.Api.Platform.Common" />
</extensions>
<!-- the targets to write to -->
<targets>
<target xsi:type="EventLog" name="apiEventlog" source="Api.Travel" layout="${api-traceidentifier}|${api-userid}|${logger}|${message} ${exception:format=tostring}" Log="Application" machinename="."/>
<!-- write to file -->
<target xsi:type="File" name="Api.Travel" fileName="Logs\Api.Travel\${shortdate}.log" keepFileOpen="true" openFileCacheTimeout="120"
layout="${longdate}|${api-traceidentifier}|${uppercase:${level}}|${api-userid}|${logger}|${message} ${exception:format=tostring}" />
</targets>
<!-- rules to map from logger name to target -->
<rules>
<logger name="*" minlevel="Info" writeTo="Api.Travel" />
<!--Skip non-critical Microsoft logs and so log only own logs-->
<logger name="Microsoft.*" maxLevel="Info" writeTo="Api.Travel" />
<logger name="*" minlevel="Warn" writeTo="apiEventlog" />
</rules>
</nlog>
api-traceidentifier 和 api-userid 是布局渲染器如下 -
[LayoutRenderer("api-traceidentifier")]
[ThreadSafe]
internal class ApiUserLogin_RequestTokenLayoutRenderer : AspNetLayoutRendererBase
{
protected override void Append(StringBuilder builder, LogEventInfo logEvent)
{
var httpContext = HttpContextAccessor?.HttpContext;
if (httpContext == null)
{
Guid traceId = System.Diagnostics.Trace.CorrelationManager.ActivityId;
var identifier = Convert.ToBase64String(traceId.ToByteArray()).Replace("=", "").Replace("+", "-").Replace("/", "_");
builder.Append(identifier);
}
else
{
base.Append(builder, logEvent);
}
}
protected override void DoAppend(StringBuilder builder, LogEventInfo logEvent)
{
var httpContext = HttpContextAccessor.HttpContext;
builder.Append(LookupTraceIdentifier(httpContext));
}
private string LookupTraceIdentifier(HttpContext httpContext)
{
var traceId = Guid.Empty;
if (Guid.TryParse(httpContext.TraceIdentifier, out traceId))
{
return Convert.ToBase64String(traceId.ToByteArray()).Replace("=", "").Replace("+", "-").Replace("/", "_");
}
return httpContext.TraceIdentifier;
}
}
我想知道这种方法是否正确,它的性能是否安全。如果没有,是否有人可以建议任何不同的方法。