使用AddTraceSource的dotnet核心日志记录不起作用

时间:2018-08-16 12:44:17

标签: c# logging asp.net-core .net-core

Debug Logging正在工作,但是我无法使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

2 个答案:

答案 0 :(得分:1)

对于AddTraceSource.NET Core不支持它,如果要使用.NET Framework,则需要将项目定位到AddTraceSource

  

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

参考:TraceSource provider

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

  1. 编辑csproj

     <TargetFramework>net47</TargetFramework>
    
  2. 由于Microsoft.AspNetCore.All与net47不兼容,因此请直接引用所需的推荐人:

      <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. 构建并运行项目以检查是否创建了文件。

答案 1 :(得分:0)

好吧,也许就是这个原因...

https://docs.microsoft.com/de-de/aspnet/core/fundamentals/logging/?view=aspnetcore-2.1#tracesource-provider

  

要使用此提供程序,应用程序必须在.NET Framework(而不是.NET Core)上运行。