标签: .net-core-logging

ILoggerFactory vs serviceCollection.AddLogging vs WebHostBuilder.ConfigureLogging

我的asp.net core 2.x app有典型的日志记录要求:

  • 在生产中使用应用洞察力,
  • 开发环境中的控制台和调试记录器
  • 根据类别和日志级别设置一些过滤器

现在我看到至少有三种不同的API来配置日志记录:

  1. WebHostBuilder.ConfigureLogging()在Program.cs中

    public static void Main(string[] args)
    {
        var webHost = new WebHostBuilder()               
            .ConfigureLogging((hostingContext, logging) =>
            {
                logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
                logging.AddConsole();
                logging.AddDebug();
                logging.AddAzureWebAppDiagnostics();
            })
            .UseStartup<Startup>()
            .Build();
    
        webHost.Run();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 注入ILoggerFactoryStartup.Configure方法:

    public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory, IServiceProvider serviceProvider)
    {
        loggerFactory.AddConsole();
        loggerFactory.AddAzureWebAppDiagnostics();
        loggerFactory.AddApplicationInsights(app.ApplicationServices, 
            (category, level) => level >= (category == "Microsoft" ? LogLevel.Error : LogLevel.Information));
        }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在Startup.ConfigureServices中:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddLogging(logging => 
        {
            logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
            logging.AddConsole();
            logging.AddDebug();
            logging.AddAzureWebAppDiagnostics();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

那些有什么区别?什么时候用哪个?

c# logging .net-core asp.net-core .net-core-logging

20
推荐指数
2
解决办法
4770
查看次数

升级到ASP.NET Core 2.2后如何配置Azure日志记录

从ASP.NET Core 2.1升级到ASP.NET Core 2.2,并遵循官方文档指南

Startup.cs中编写新的日志记录配置时遇到问题。有关如何处理AzureWebAppDiagnostics的具体问题。

旧配置由以下配置组成:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    ...
    loggerFactory.AddApplicationInsights(app.ApplicationServices);
    loggerFactory.AddAzureWebAppDiagnostics(
        new AzureAppServicesDiagnosticsSettings
        {
            OutputTemplate = "{Timestamp:yyyy-MM-dd HH:mm:ss zzz} [{Level}] {RequestId}-{SourceContext}: {Message}{NewLine}{Exception}"
        }
    );
}
Run Code Online (Sandbox Code Playgroud)

无论是AddAzureWebAppDiagnosticsAzureAppServicesDiganosticsSettings被标记为过时。后者建议改用AzureBlobLoggerOptions。该指南指出,日志记录配置应移至以下内容:

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddLogging(builder => builder
        .AddConsole()
        .AddAzureWebAppDiagnostics());
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何正确地将配置添加到ILoggingBuildler,并且作为额外的奖励,AzureBlobLoggerOptions不允许自定义OutputTemplate。该AddApplicationInsights也从ILoggingBuilder失踪。

关于如何使它像以前一样工作的任何建议?

c# azure-diagnostics .net-core-logging

6
推荐指数
1
解决办法
1052
查看次数

如何在ASP.NET Core中启用跟踪日志记录?

我无法LogTrace(...)在我的应用程序中获得basice 输出.这是一个复制品:

  1. 使用Visual Studio 2017创建新的ASP.NET Core应用程序.
  2. (可选)注释掉,.UseApplicationInsights()以便repro更清晰
  3. 用以下代码替换代码ValuesController.cs:

    using System.Collections.Generic;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Logging;
    
    namespace WebApplication1.Controllers
    {
        [Route("api/[controller]")]
        public class ValuesController : Controller
        {
            private readonly ILogger<ValuesController> logger;
    
            public ValuesController(ILogger<ValuesController> logger)
            {
                this.logger = logger;
            }
    
            [HttpGet]
            public IEnumerable<string> Get()
            {
                logger.LogError("ERROR!");
                logger.LogWarning("WARN!");
                logger.LogInformation("INFO!");
                logger.LogTrace("TRACE!");
                return new string[] { "value1", "value2" };
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 改变appsettings.Development.json这样的:

    {
      "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
          "Default": "Trace",
          "System": "Information",
          "Microsoft": "Information"
        }
      }
    } …
    Run Code Online (Sandbox Code Playgroud)

c# .net-core asp.net-core .net-core-logging .net-core-configuration

5
推荐指数
3
解决办法
2万
查看次数

从ASP.NET Core日志记录中删除日志中的敏感信息

我正在为我的应用程序使用ASP.NET Core日志抽象.

我有一个敏感字符串列表,我希望确保在发送到任何接收器时在日志中屏蔽"*****".(我正在使用serilog - 但也许它甚至可以在serilog之前插入).

我如何将其插入ASP.NET Core日志系统,以便在发送到任何接收器/写入器之前用"*******"替换所有这些敏感字符串.

.net .net-core .net-core-logging

5
推荐指数
1
解决办法
1231
查看次数

使用 Unity 解决通用 Microsoft.Extensions.Logging.ILogger&lt;T&gt; - get InvalidCastException

我正在尝试在 Unity(版本 4)中注册通用 ILogger(来自 Microsoft.Extensions.Logging,而不是来自 Serilog)。

我有以下课程:

public class MyClass
{
    private readonly Microsoft.Extensions.Logging.ILogger<MyClass> _logger;

    public MyClass(Microsoft.Extensions.Logging.ILogger<MyClass> logger)
    {
        _logger = logger;
    }
}
Run Code Online (Sandbox Code Playgroud)

以及以下 Unity 注册和测试:

// Arrange
IUnityContainer container = new UnityContainer();

// provider from Serilog.Extensions.Logging nuget package
var provider = new Serilog.Extensions.Logging.SerilogLoggerProvider();

container.RegisterType(typeof(Microsoft.Extensions.Logging.ILogger<>),
    new InjectionFactory((ctr, type, name) =>
    {
        var loggerType = type.GetGenericArguments()[0].FullName;
        Microsoft.Extensions.Logging.ILogger logger = provider.CreateLogger(loggerType);
        return logger;
    }));

container.RegisterType<MyClass, MyClass>(); // just for demo purpose. 

// Assert
container.Resolve<MyClass>();
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎没问题,太糟糕了我在解决时遇到以下错误:

例外是:InvalidCastException - 无法将类型为“Serilog.Extensions.Logging.SerilogLogger”的对象转换为类型“Microsoft.Extensions.Logging.ILogger`1[MyNamespace.MyClass]”。

如何解决这个问题?

完全例外:

Microsoft.Practices.Unity.ResolutionFailedException:依赖项解析失败,类型 …

c# unity-container serilog .net-core-logging

5
推荐指数
2
解决办法
4490
查看次数

在集成测试中实现完整日志记录

我正在 .Net Core 3.1 中创建一个新应用程序。

我已经创建了数据库,现在正在处理业务逻辑,它位于服务集合中。在开始创建 API 或 UI(即:任何 Web 应用程序类型项目)之前,我希望首先 100% 让所有数据访问和服务按预期工作...包括日志记录。为了确保这一切都能正常工作,我想创建一些集成测试。

我遇到的问题是我真的很苦恼如何让日志记录工作。我能找到的每个教程、文档和所有示例都假设您有一个Program.csStartup.cs

注意 1:我希望日志记录像在生产中一样工作,这意味着一直到 SQL。没有嘲笑。没有替代品。无需更换。

注 2:我不太关心测试中的日志记录。我想在服务中进行日志记录。

这是我迄今为止拥有的集成测试 (xUnit) 类的示例。它正在工作,但没有日志记录。

namespace MyApp.Test
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddTransient<IAccountService, AccountService>();
            services.AddTransient<IAppSettings, AppSettings>();
        }
    }

    public class AccountServiceTests
    {
        private readonly IAccountService _account;
        private readonly IAppSettings _settings;

        public AccountServiceTests(IAccountService account, IAppSettings settings)
        {
            _account = account;
            _settings = settings;
        }

        [Fact]
        public async Task AccountService_CreateAccount()
        {
            Account …
Run Code Online (Sandbox Code Playgroud)

.net c# integration-testing .net-core .net-core-logging

5
推荐指数
1
解决办法
7034
查看次数

如何使用ASP.NET Core日志记录懒惰?

假设这样的场景:

[Route("api/test")]
public class TestController
{
    private readonly ILogger<TestController> logger;

    public TestController(ILogger<TestController> logger)
    {
        this.logger = logger;
    }

    [HttpPut]
    public void Put(Guid id, [FromBody]FooModel model)
    {
        logger.LogInformation($"Putting {id}");
        logger.LogTrace("Putting model {0}", Newtonsoft.Json.JsonConvert.SerializeObject(model));
        try
        {
            // Omitted: actual PUT operation.
        }
        catch (Exception ex)
        {
            logger.LogError("Exception {0}", ex);
        }
    }
}

public class FooModel 
{ 
    string Bar { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,LogInformation呼叫将触发一个string.Format电话,甚至更糟的是,该LogTrace行会触发一个SerializeObject电话,不管LogLevel.这似乎相当浪费.

Logging API中是否存在允许更懒惰的方法?我能想到的唯一解决方法是覆盖ToString模型以创建非常详细的表示,并跳过使用JsonConvert.SerializeObject作为工具.

c# .net-core .net-core-logging

4
推荐指数
1
解决办法
353
查看次数

如何将 ILogger&lt;T&gt; 依赖项注入 ConfigureServices - .net core 2.0 中的服务

我有以下几点MailService

public class MailService : IMailService
{
    private readonly ILogger<MailService> _logger;
    private readonly SmtpClient _client;

    public MailService(ILogger<MailService> logger, SmtpClient client)
    {
        _logger = logger;
        _client = client;
    }

    public async Task Send(string to, string subject, string body)
    {
        var message = new MailMessage
        {
            Subject = subject,
            Body = body,
            IsBodyHtml = true,
            From = new MailAddress("info@domain.com")
        };

        message.To.Add(to);

        using (_client)
        {
            _logger.LogTrace($"Sending email from {message.From.Address} to {to}. Subject: {subject}");
            await _client.SendMailAsync(message);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

我想使用实现工厂创建此服务,因为我将从配置中读取 smtp 设置并提供 …

c# dependency-injection asp.net-core-2.0 .net-core-logging

2
推荐指数
1
解决办法
2483
查看次数

netcore2 控制台应用程序在 appsettings 配置日志级别

我尝试向我的控制台应用程序添加一个记录器。所有配置都正确应用,除了Logging

程序.cs:

   private static void Main(string[] args)
    {
        var services = new ServiceCollection();
        ConfigureServices(services);

        var serviceProvider = services.BuildServiceProvider();

        serviceProvider.GetService<App>().Run();
        Console.ReadKey();
    }

    private static void ConfigureServices(ServiceCollection services)
    {

        var envName = Environment.GetEnvironmentVariable("MY_ENV") ?? DevelopmentEnvName;

        var configuration = new ConfigurationBuilder()
                            .SetBasePath(Directory.GetCurrentDirectory())
                            .AddJsonFile("appsettings.json", false)
                            .AddJsonFile($"appsettings.{envName}.json", true, true)
                            .AddEnvironmentVariables()
                            .Build();

        services.AddSingleton(configuration);
        services.AddLogging(builder =>
                            {
                                builder.AddConfiguration(configuration)
                                       .AddConsole()
                                       .AddDebug();
                            });

        ConfigureOptions(services, configuration);

        ConfigureDependencies(services);
    }
Run Code Online (Sandbox Code Playgroud)

App.Run()我尝试记录调试和信息消息

 public void Run()
 {
    _logger.LogDebug("Debug");
    _logger.LogDebug(_appOptions.Env);   //print nothing

    _logger.LogInformation("Info");
    _logger.LogInformation(_appOptions.Env);  //print Info and debug env lines
 }
Run Code Online (Sandbox Code Playgroud)

appsettings.json: …

.net-core .net-core-logging .net-core-configuration .net-core-2.0

2
推荐指数
1
解决办法
1348
查看次数

如何在 .NET Core 3 中通过命令行参数设置日志级别

我有一个 .NET Core 3.0 控制台应用程序。我有一个 Microsoft.Extensions.Logging 记录器,并且正在使用命令行参数构建 Microsoft.Extensions.Configuration。

我的问题是“如何通过命令行参数设置日志级别?”

.net-core-logging .net-core-configuration

2
推荐指数
1
解决办法
3056
查看次数