我的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();
}
Run Code Online (Sandbox Code Playgroud)注入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)在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)那些有什么区别?什么时候用哪个?
从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)
无论是AddAzureWebAppDiagnostics和AzureAppServicesDiganosticsSettings被标记为过时。后者建议改用AzureBlobLoggerOptions。该指南指出,日志记录配置应移至以下内容:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddLogging(builder => builder
.AddConsole()
.AddAzureWebAppDiagnostics());
...
}
Run Code Online (Sandbox Code Playgroud)
但是,我不知道如何正确地将配置添加到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" };
}
}
}
Run Code Online (Sandbox Code Playgroud)改变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
我正在为我的应用程序使用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;
}
}
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:依赖项解析失败,类型 …
我正在 .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 …Run Code Online (Sandbox Code Playgroud) 假设这样的场景:
[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作为工具.
我有以下几点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 设置并提供 …
我尝试向我的控制台应用程序添加一个记录器。所有配置都正确应用,除了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
我有一个 .NET Core 3.0 控制台应用程序。我有一个 Microsoft.Extensions.Logging 记录器,并且正在使用命令行参数构建 Microsoft.Extensions.Configuration。
我的问题是“如何通过命令行参数设置日志级别?”