多个 logfactory 实例,性能安全吗?

时间:2021-07-10 08:54:27

标签: .net-core nlog

我将 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;
    }

}

我想知道这种方法是否正确,它的性能是否安全。如果没有,是否有人可以建议任何不同的方法。

0 个答案:

没有答案
相关问题