首页 > 解决方案 > 使用 AddTraceSource 的 dotnet 核心日志记录不起作用

问题描述

调试日志正在工作,但我无法让 TraceSource 工作。
这应该很简单吧?:)

我的“AppSettings.json”看起来像这样......

"Logging": {
   "IncludeScopes": false,
   "LogLevel": {
   "Default": "Information"
   },
   "Debug": {
     "LogLevel": {
       "Default": "Information"
     }
   },
   "Console": {
     "LogLevel": {
       "Default": "Information"
     }
   }
 }

Startup的长这样...

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddDebug();

    // add Trace Source logging
    SourceSwitch sourceSwitch = new SourceSwitch("sourceSwitch", "Logging Sample")
    {
        Level = SourceLevels.Information
    };

    loggerFactory.AddTraceSource(sourceSwitch, new TextWriterTraceListener(@"C:\temp\trace.log"));

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseMvc();
}

我的示例控制器看起来像那样......

[Route("[controller]")]
public class ValuesController : Controller
{
    private readonly ILogger<ValuesController> _logger;
    private readonly ILogger _logger2;

    public ValuesController(ILogger<ValuesController> logger, ILoggerFactory loggerFactory)
    {
        _logger = logger;
        _logger2 = loggerFactory.CreateLogger("sourceSwitch");
    }

    // GET api/values
    [HttpGet]
    public async Task Get()
    {
        string myName = "demo";
        _logger.LogError($"{myName} started.");
        _logger2.LogError($"logger2 {myName} started.");

        await Task.Delay(1000);

        _logger.LogInformation($"{myName} finished.");
    }
}

不幸的是,没有文件被写入(到)。
文件权限不是问题。我可以File.AppendAllText()毫无问题地使用。

我也找不到任何关于SourceSwitch它的名字和重要性的有意义的文档。我基本上遵循了这里列出的官方文档:https ://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.1#tracesource-provider

标签: c#loggingasp.net-core.net-core

解决方案


因为AddTraceSource,它不支持,如果你想使用.NET Core,你需要将你的项目定位到。 .NET FrameworkAddTraceSource

要使用此提供程序,应用程序必须在 .NET Framework(而不是 .NET Core)上运行。提供程序允许您将消息路由到各种侦听器,例如示例应用程序中使用的 TextWriterTraceListener。

参考: TraceSource 提供程序

要检查此行为,您可以尝试按照以下步骤操作:

  1. 编辑 csproj

     <TargetFramework>net47</TargetFramework>
    
  2. 由于Microsoft.AspNetCore.All与net47不兼容,直接引用需要的reference:

      <ItemGroup>
    <PackageReference Include="FluentValidation.AspNetCore" Version="7.5.0" />
    <!--<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.6" />-->
    <PackageReference Include="Microsoft.AspNetCore.App" Version="2.0.6" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.3" />
    <PackageReference Include="Moq" Version="4.8.3" />
    <PackageReference Include="System.ServiceModel.Duplex" Version="4.4.*" />
    <PackageReference Include="System.ServiceModel.Http" Version="4.4.*" />
    <PackageReference Include="System.ServiceModel.NetTcp" Version="4.4.*" />
    <PackageReference Include="System.ServiceModel.Security" Version="4.4.*" />
      </ItemGroup>
    
  3. 构建并运行您的项目以检查文件是否已创建。


推荐阅读