我的asp.net core 2.x app有典型的日志记录要求:
现在我看到至少有三种不同的API来配置日志记录:
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();
}
注入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));
    }
在Startup.ConfigureServices中:
public void ConfigureServices(IServiceCollection services)
{
    services.AddLogging(logging => 
    {
        logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
        logging.AddConsole();
        logging.AddDebug();
        logging.AddAzureWebAppDiagnostics();
    }
}
那些有什么区别?什么时候用哪个?
从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}"
        }
    );
}
无论是AddAzureWebAppDiagnostics和AzureAppServicesDiganosticsSettings被标记为过时。后者建议改用AzureBlobLoggerOptions。该指南指出,日志记录配置应移至以下内容:
public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddLogging(builder => builder
        .AddConsole()
        .AddAzureWebAppDiagnostics());
    ...
}
但是,我不知道如何正确地将配置添加到ILoggingBuildler,并且作为额外的奖励,AzureBlobLoggerOptions不允许自定义OutputTemplate。该AddApplicationInsights也从ILoggingBuilder失踪。
关于如何使它像以前一样工作的任何建议?
我无法LogTrace(...)在我的应用程序中获得basice 输出.这是一个复制品:
.UseApplicationInsights()以便repro更清晰用以下代码替换代码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" };
        }
    }
}
改变appsettings.Development.json这样的:
{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Trace",
      "System": "Information",
      "Microsoft": "Information"
    }
  }
} …c# .net-core asp.net-core .net-core-logging .net-core-configuration
我正在为我的应用程序使用ASP.NET Core日志抽象.
我有一个敏感字符串列表,我希望确保在发送到任何接收器时在日志中屏蔽"*****".(我正在使用serilog - 但也许它甚至可以在serilog之前插入).
我如何将其插入ASP.NET Core日志系统,以便在发送到任何接收器/写入器之前用"*******"替换所有这些敏感字符串.
我正在尝试在 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;
    }
}
以及以下 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>();
这对我来说似乎没问题,太糟糕了我在解决时遇到以下错误:
例外是:InvalidCastException - 无法将类型为“Serilog.Extensions.Logging.SerilogLogger”的对象转换为类型“Microsoft.Extensions.Logging.ILogger`1[MyNamespace.MyClass]”。
如何解决这个问题?
完全例外:
Microsoft.Practices.Unity.ResolutionFailedException:依赖项解析失败,类型 …
我正在 .Net Core 3.1 中创建一个新应用程序。
我已经创建了数据库,现在正在处理业务逻辑,它位于服务集合中。在开始创建 API 或 UI(即:任何 Web 应用程序类型项目)之前,我希望首先 100% 让所有数据访问和服务按预期工作...包括日志记录。为了确保这一切都能正常工作,我想创建一些集成测试。
我遇到的问题是我真的很苦恼如何让日志记录工作。我能找到的每个教程、文档和所有示例都假设您有一个Program.cs和Startup.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 …假设这样的场景:
[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; } 
}
在这种情况下,LogInformation呼叫将触发一个string.Format电话,甚至更糟的是,该LogTrace行会触发一个SerializeObject电话,不管LogLevel.这似乎相当浪费.
Logging API中是否存在允许更懒惰的方法?我能想到的唯一解决方法是覆盖ToString模型以创建非常详细的表示,并跳过使用JsonConvert.SerializeObject作为工具.
我有以下几点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);
        }
    }
}
我想使用实现工厂创建此服务,因为我将从配置中读取 smtp 设置并提供 …
我尝试向我的控制台应用程序添加一个记录器。所有配置都正确应用,除了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);
    }
在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
 }
appsettings.json: …
.net-core .net-core-logging .net-core-configuration .net-core-2.0
我有一个 .NET Core 3.0 控制台应用程序。我有一个 Microsoft.Extensions.Logging 记录器,并且正在使用命令行参数构建 Microsoft.Extensions.Configuration。
我的问题是“如何通过命令行参数设置日志级别?”