Note
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãµã€ã³ã€ã³ãŸãã¯ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
.NET ã¯ãã¢ããªã±ãŒã·ã§ã³ã®åäœã®ç£èŠãšåé¡ã®èšºæã«åœ¹ç«ã€ãILogger API ãä»ããé«ããã©ãŒãã³ã¹ã§æ§é åããããã°èšé²ããµããŒãããŠããŸãã ç°ãªãå®å ã«ãã°ãæžã蟌ãã«ã¯ ãããŸããŸãªãã° ãããã€ããŒ ãæ§æããŸãã åºæ¬çãªãã° ãããã€ããŒã¯çµã¿èŸŒãŸããŠãããå€ãã®ãµãŒãããŒã㣠ãããã€ããŒã䜿çšã§ããŸãã
æŠèŠ
ãã®æåã®äŸã¯ãåºæ¬ã瀺ããã®ã§ãããç°¡æçãªã³ã³ãœãŒã« ã¢ããªã«ã®ã¿é©ããŠããŸãã ãã®ãµã³ãã« ã³ã³ãœãŒã« ã¢ããªã¯ã次㮠NuGet ããã±ãŒãžã«äŸåããŸãã
- Microsoft.Extensions.Logging
- Microsoft.Extensions.Logging.Console (ã³ã³ãœãŒã«çšã®ãã°èšé²æ¡åŒµæ©èœ)
次ã®ã»ã¯ã·ã§ã³ã§ã¯ãã¹ã±ãŒã«ãããã©ãŒãã³ã¹ãæ§æãããã³äžè¬çãªããã°ã©ãã³ã° ãã¿ãŒã³ãèæ ®ããŠã³ãŒããæ¹åããæ¹æ³ã«ã€ããŠèª¬æããŸãã
using Microsoft.Extensions.Logging;
using ILoggerFactory factory = LoggerFactory.Create(builder => builder.AddConsole());
ILogger logger = factory.CreateLogger("Program");
logger.LogInformation("Hello World! Logging is {Description}.", "fun");
äžèšã®äŸã®å Žå:
-
ILoggerFactory ãäœæããŸãã
ILoggerFactoryã«ã¯ããã° ã¡ãã»ãŒãžãéä¿¡ãããå Žæã決å®ãããã¹ãŠã®æ§æãæ ŒçŽãããŸãã ãã®å Žåã¯ããã° ã¡ãã»ãŒãžãã³ã³ãœãŒã«ã«æžã蟌ãŸããããã«ã³ã³ãœãŒã« ãã° ãããã€ããŒ ãæ§æããŸãã - "Program" ãšããååã®ã«ããŽãªãæã€ ILogger ãäœæããŸãã
ã«ããŽãªã¯ã
stringãªããžã§ã¯ãã«ãã£ãŠãã°ã«èšé²ãããåã¡ãã»ãŒãžã«é¢é£ä»ããããŠããILoggerã§ãã ãã°ãæ€çŽ¢ãŸãã¯ãã£ã«ã¿ãŒåŠçãããšãã«ãåãã¯ã©ã¹ (ãŸãã¯ã«ããŽãª) ããã®ãã° ã¡ãã»ãŒãžãã°ã«ãŒãåããŸãã -
LogInformation ãåŒã³åºããŠã
Informationã¬ãã«ã§ã¡ãã»ãŒãžããã°ã«èšé²ããŸãã ãã° ã¬ãã«ã¯ããã°ã«èšé²ãããã€ãã³ãã®é倧床ã瀺ããéèŠåºŠã®äœããã° ã¡ãã»ãŒãžãé€å€ããŸãã ãã° ãšã³ããªã«ã¯ãã¡ãã»ãŒãž ãã³ãã¬ãŒã"Hello World! Logging is {Description}."ãšãããŒãšå€ã®ãã¢Description = funãå«ãŸããŠããŸãã ããŒå (ãŸãã¯ãã¬ãŒã¹ãã«ããŒ) ã¯ãã³ãã¬ãŒãå ã®äžãã£ãå ã®åèªããååŸãããå€ã¯æ®ãã®ã¡ãœããåŒæ°ããååŸãããŸãã
ãã®äŸã®ãã®ãããžã§ã¯ã ãã¡ã€ã«ã«ã¯ã次㮠2 ã€ã® NuGet ããã±ãŒãžãå«ãŸããŠããŸãã
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.13" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="10.0.13" />
</ItemGroup>
</Project>
ãã³ã
ãã°ã®ãµã³ãã« ãœãŒã¹ ã³ãŒãã¯ãã¹ãŠããµã³ãã« ãã©ãŠã¶ãŒã§ããŠã³ããŒãã§ããŸãã 詳现ã«ã€ããŠã¯ãã³ãŒã ãµã³ãã«ã®åç §: .NET ã§ã®ãã°èšé²ã«é¢ããããŒãžãã芧ãã ããã
éèŠãªã¢ããªä»¥å€ã§ã®ãã°èšé²
åçŽã§ã¯ãªãã·ããªãªã§ãã°ãèšé²ããå Žåã¯ãåã®äŸã«ãããã®å€æŽãè¡ãããšãæ€èšããŠãã ããã
ã¢ããªã±ãŒã·ã§ã³ã§ äŸåé¢ä¿æ¿å ¥ (DI) ãŸã㯠ASP ãªã©ã®ãã¹ãã䜿çšããŠããå ŽåãNET ã® WebApplication ãŸã㯠æ±çšãã¹ãã§ã¯ãçŽæ¥äœæããã®ã§ã¯ãªããããããã® DI ã³ã³ãããŒãã
ILoggerFactoryãªããžã§ã¯ããšILoggerãªããžã§ã¯ãã䜿çšããŸãã 詳现ã«ã€ããŠã¯ãDI ããã³ãã¹ããšã®çµ±åã«é¢ããèšäºãåç §ããŠãã ãããéåžžããã°èšé²ã®ããã®ã³ã³ãã€ã«æã®ãœãŒã¹çæã¯ã
ILoggerã®ãããªæ¡åŒµã¡ãœããLogInformationãããåªããéžæè¢ã§ãã ãœãŒã¹çæãã°ã«ãããããã©ãŒãã³ã¹ãåäžããå ¥åã匷åãããã¡ãœããå šäœã«string宿°ã忣ããããšãåé¿ã§ããŸãã ãã¬ãŒããªããšããŠããã®ææ³ã®äœ¿çšã«ã¯ãã³ãŒããããå°ãå¿ èŠã§ãããšããç¹ããããŸããusing Microsoft.Extensions.Logging; internal partial class Program { static void Main(string[] args) { using ILoggerFactory factory = LoggerFactory.Create(builder => builder.AddConsole()); ILogger logger = factory.CreateLogger("Program"); LogStartupMessage(logger, "fun"); } [LoggerMessage(Level = LogLevel.Information, Message = "Hello World! Logging is {Description}.")] static partial void LogStartupMessage(ILogger logger, string description); }ãã° ã«ããŽãªåãéžæããå Žåã¯ããã° ã¡ãã»ãŒãžãäœæããã¯ã©ã¹ã®å®å šä¿®é£Ÿåã䜿çšããããšããå§ãããŸãã ããã«ããããã° ã¡ãã»ãŒãžãçæããã³ãŒãã«é¢é£ä»ãããã°ããã£ã«ã¿ãŒåŠçãããšãã«é©åãªã¬ãã«ã®å¶åŸ¡ãæäŸãããŸãã CreateLogger ã¡ãœããã®åãã©ã¡ãŒã¿ãŒã«ã¯ã©ã¹åãæå®ããŸãã
using Microsoft.Extensions.Logging; internal class Program { static void Main(string[] args) { using ILoggerFactory factory = LoggerFactory.Create(builder => builder.AddConsole()); ILogger logger = factory.CreateLogger<Program>(); logger.LogInformation("Hello World! Logging is {Description}.", "fun"); } }ã³ã³ãœãŒã« ãã°ãå¯äžã®éçšç£èŠãœãªã¥ãŒã·ã§ã³ãšããŠäœ¿çšããªãå Žåã¯ã䜿çšäºå®ã®ãã° ãããã€ããŒã远å ããŸãã ããšãã°ã OpenTelemetry ã䜿çšã㊠OTLP (OpenTelemetry ãããã³ã«) çµç±ã§ãã°ãéä¿¡ããŸãã
using Microsoft.Extensions.Logging; using OpenTelemetry.Logs; using ILoggerFactory factory = LoggerFactory.Create(builder => { builder.AddOpenTelemetry(logging => { logging.AddOtlpExporter(); }); }); ILogger logger = factory.CreateLogger("Program"); logger.LogInformation("Hello World! Logging is {Description}.", "fun");
ãã¹ããšäŸåæ§æ³šå ¥ã®çµ±å
ã¢ããªã±ãŒã·ã§ã³ã§ äŸåé¢ä¿æ¿å
¥ (DI) ãŸã㯠ASP ãªã©ã®ãã¹ãã䜿çšããŠããå ŽåãNET ã® WebApplication ãŸã㯠æ±çšãã¹ãã§ã¯ãçŽæ¥äœæããã®ã§ã¯ãªããDI ã³ã³ãããŒãã ILoggerFactory ãªããžã§ã¯ããš ILogger ãªããžã§ã¯ãã䜿çšããŸãã
DI ãã ILogger ãååŸãã
次ã®äŸã§ã¯ãASP.NET Minimal API ã䜿çšããŠããã¹ããããŠããã¢ããªå ã«ãã ILogger ãªããžã§ã¯ããååŸããŸãã
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<ExampleHandler>();
var app = builder.Build();
var handler = app.Services.GetRequiredService<ExampleHandler>();
app.MapGet("/", handler.HandleRequest);
app.Run();
partial class ExampleHandler(ILogger<ExampleHandler> logger)
{
public string HandleRequest()
{
LogHandleRequest(logger);
return "Hello World";
}
[LoggerMessage(LogLevel.Information, "ExampleHandler.HandleRequest was called")]
public static partial void LogHandleRequest(ILogger logger);
}
äžèšã®äŸã®å Žå:
-
ExampleHandlerãšããã·ã³ã°ã«ãã³ ãµãŒãã¹ãäœæãããšãšãã«ãExampleHandler.HandleRequest颿°ã®å®è¡ã®åä¿¡ Web èŠæ±ããããããŸããã - è¡ 12 ã§ã¯ãC# 12 ã§è¿œå ãããæ©èœã§ãã ExampleHandler ã®ãã©ã€ã㪠ã³ã³ã¹ãã©ã¯ã¿ãŒãå®çŸ©ããŸãã 以åã®ã¹ã¿ã€ã«ã® C# ã³ã³ã¹ãã©ã¯ã¿ãŒã®äœ¿çšãåæ§ã«æ©èœããŸãããããå°ã詳现ã§ãã
- ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšãããšã
ILogger<ExampleHandler>åã®ãã©ã¡ãŒã¿ãŒãå®çŸ©ãããŸãã ILogger<TCategoryName> ã¯ãILogger ããæŽŸçããILoggerãªããžã§ã¯ãã«å«ãŸããã«ããŽãªã瀺ããŸãã DI ã³ã³ãããŒã§ã¯ãé©åãªã«ããŽãªãæã€ILoggerãæ€çŽ¢ããŠããããã³ã³ã¹ãã©ã¯ã¿ãŒåŒæ°ãšããŠæå®ããŸãã ãã®ã«ããŽãªãæã€ILoggerããŸã ååšããªãå Žåã¯ãDI ã³ã³ãããŒã«ãã£ãŠãµãŒãã¹ ãããã€ããŒã®ILoggerFactoryããèªåçã«äœæãããŸãã - ã³ã³ã¹ãã©ã¯ã¿ãŒã§åãåã£ã
loggerãã©ã¡ãŒã¿ãŒã¯ãHandleRequest颿°ã®ãã°èšé²ã«äœ¿çšãããŸãã
ãã¹ããæäŸããILoggerFactory
ãã¹ã ãã«ããŒã䜿çšãããšãæ¢å®ã®æ§æãåæåããããã¹ãã®ãã«ãæã«ãæ§ææžã¿ã® ILoggerFactory ãªããžã§ã¯ãããã¹ãã® DI ã³ã³ãããŒã«è¿œå ãããŸãã ãã¹ãããã«ãããåã«ãä»ã®ãã¹ãäžã® HostApplicationBuilder.Loggingã WebApplicationBuilder.LoggingããŸãã¯åæ§ã® API ã䜿çšããŠãã°æ§æã調æŽããŸãã ãã¹ãã§ã¯ã appsettings.json ãç°å¢å€æ°ãªã©ã®æ¢å®ã®æ§æãœãŒã¹ããã®ãã°èšé²æ§æãé©çšãããŸãã 詳现ã«ã€ããŠã¯ãã.NET ã§ã®æ§æããåç
§ããŠãã ããã
ãã®äŸã§ã¯ãåè¿°ã®ãã®ãå±éããŠãILoggerFactory ã«ãã£ãŠæå®ããã WebApplicationBuilder ãã«ã¹ã¿ãã€ãºããŸãã ããã«ãããOpenTelemetry ã¯ãOTLP (OpenTelemetry ãããã³ã«) ã§ãã°ãéä¿¡ãããã° ãããã€ããŒãšããŠè¿œå ãããŸãã
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
builder.Logging.AddOpenTelemetry(logging => logging.AddOtlpExporter());
builder.Services.AddSingleton<ExampleHandler>();
WebApplication app = builder.Build();
DI ã§ ILoggerFactory ãäœæãã
ãã¹ããªãã§ DI ã³ã³ãããŒã䜿çšããŠããå Žåã¯ãAddLogging ã䜿çšããILoggerFactory ãæ§æããŠã³ã³ãããŒã«è¿œå ããŸãã
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
// Add services to the container including logging
var services = new ServiceCollection();
services.AddLogging(builder => builder.AddConsole());
services.AddSingleton<ExampleService>();
IServiceProvider serviceProvider = services.BuildServiceProvider();
// Get the ExampleService object from the container
ExampleService service = serviceProvider.GetRequiredService<ExampleService>();
// Do some pretend work
service.DoSomeWork(10, 20);
class ExampleService(ILogger<ExampleService> logger)
{
public void DoSomeWork(int x, int y)
{
logger.LogInformation("DoSomeWork was called. x={X}, y={Y}", x, y);
}
}
äžèšã®äŸã®å Žå:
- ã³ã³ãœãŒã«ã«æžã蟌ãããã«æ§æããã
ILoggerFactoryãå«ã DI ãµãŒãã¹ ã³ã³ãããŒãäœæããŸãã - ã³ã³ãããŒã«ã·ã³ã°ã«ãã³
ExampleServiceã远å ããŸãã - DI ã³ã³ãããŒãã
ExampleServiceã®ã€ã³ã¹ã¿ã³ã¹ãäœæããã³ã³ã¹ãã©ã¯ã¿ãŒåŒæ°ãšããŠäœ¿çšããILogger<ExampleService>ãèªåçã«äœæããŸããã -
ExampleService.DoSomeWorkåŒã³åºãããILogger<ExampleService>ã䜿çšããŠã³ã³ãœãŒã«ã«ã¡ãã»ãŒãžããã°ã«èšé²ããŸããã
ãã°ã®èšå®
ã³ãŒããŸãã¯æ§æãã¡ã€ã«ãç°å¢å€æ°ãªã©ã®å€éšãœãŒã¹ã䜿çšããŠããã°èšé²ã®æ§æãèšå®ããŸãã å€éšæ§æã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ããªãã«ãããã«å€æŽã§ãããããå¯èœãªå Žåã«åœ¹ç«ã¡ãŸãã ãã ãããã° ãããã€ããŒã®èšå®ãªã©ã®äžéšã®ã¿ã¹ã¯ã¯ãã³ãŒãããã®ã¿æ§æã§ããŸãã
ã³ãŒããªãã§ãã°ãæ§æãã
ãã¹ãã䜿çšããã¢ããªã®å Žåã¯ã"Logging".jsonãã¡ã€ã«ã®.{Environment}ã»ã¯ã·ã§ã³ã§ãã°èšé²ã®æ§æãæäŸãããã®ãäžè¬çã§ãã ãã¹ãã䜿çšããªãã¢ããªã®å Žåã¯ã å€éšæ§æãœãŒã¹ãæç€ºçã«èšå® ãããã代ããã« ã³ãŒãã§æ§æããŸã ã
次㮠appsettings.Development.json ãã¡ã€ã«ã¯ã.NET Worker ãµãŒãã¹ ãã³ãã¬ãŒãã«ãã£ãŠçæãããŸãã
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}
äžèšã® JSON ã§ã¯ã次ã®ããã«æå®ãããŠããŸãã
-
"Default"ã"Microsoft"ã"Microsoft.Hosting.Lifetime"ãã° ã¬ãã«ã®ã«ããŽãªãæå®ãããŠããŸãã -
"Default"å€ã¯ãç¹ã«æå®ãããŠããªããã¹ãŠã®ã«ããŽãªã«é©çšãããå®è³ªçã«ãã¹ãŠã®ã«ããŽãªã®ãã¹ãŠã®æ¢å®å€ã"Information"ãããŸãã ã«ããŽãªã®å€ãæå®ããŠããã®åäœããªãŒããŒã©ã€ãããŸãã -
"Microsoft"ã«ããŽãªã¯ã"Microsoft"ã§å§ãŸããã¹ãŠã®ã«ããŽãªã«é©çšãããŸãã -
"Microsoft"ã«ããŽãªã§ã¯ããã° ã¬ãã«ãWarning以äžã®ãã°ãèšé²ãããŸãã -
"Microsoft.Hosting.Lifetime"ã«ããŽãªã¯"Microsoft"ã«ããŽãªããã詳现ãªã®ã§ã"Microsoft.Hosting.Lifetime"ã«ããŽãªã§ã¯ãã° ã¬ãã«ã"Information"以äžã®ãã°ãèšé²ãããŸãã - ç¹å®ã®ãã° ãããã€ããŒãæå®ãããŠããªãããã
LogLevelã¯ãWindows EventLog ãé€ããã¹ãŠã®æå¹ãªãã° ãããã€ããŒã«é©çšãããŸãã
Logging ããããã£ã«ã¯ LogLevel ããã³ãã° ãããã€ããŒã®ããããã£ãå«ããããšãã§ããŸãã
LogLevel ã«ãããéžæããã«ããŽãªã«å¯Ÿãããã°ã®æå°ã¬ãã«ãæå®ãããŸãã äžèšã® JSON ã§ã¯ãInformation ãš Warning ã®ãã° ã¬ãã«ãæå®ãããŠããŸãã
LogLevel ã¯ãã°ã®é倧床ã 0 - 6 ã®ç¯å²ã§ç€ºããŸãã
Trace = 0ãDebug = 1ãInformation = 2ãWarning = 3ãError = 4ãCritical = 5ãNone = 6ã
LogLevel ãæå®ãããšãæå®ããã¬ãã«ä»¥äžã®ã¡ãã»ãŒãžã«å¯ŸããŠãã°ãæå¹ã«ãªããŸãã äžèšã® JSON ã§ã¯ãDefault ã«ããŽãªã¯ Information 以äžã«å¯ŸããŠã®ã¿ãã°ã«èšé²ãããŸãã ããšãã°ãInformationãWarningãErrorãCritical ã®ã¡ãã»ãŒãžããã°ã«èšé²ãããŸãã
LogLevel ãæå®ãããŠããªãå Žåããã°ã¯æ¢å®ã§ Information ã¬ãã«ã«ãªããŸãã 詳现ã«ã€ããŠã¯ãããã° ã¬ãã«ããåç
§ããŠãã ããã
ãããã€ã㌠ããããã£ã§ LogLevel ããããã£ãæå®ã§ããŸãã ãããã€ããŒã®äžã® LogLevel ã«ãã£ãŠããã®ãããã€ããŒã®ãã°ã«èšé²ããã¬ãã«ãæå®ããããããã€ããŒä»¥å€ã®ãã°èšå®ããªãŒããŒã©ã€ããããŸãã 以äžã® appsettings.json ãã¡ã€ã«ã«ã€ããŠèããŸã:
{
"Logging": {
"LogLevel": {
"Default": "Error",
"Microsoft": "Warning"
},
"Debug": {
"LogLevel": {
"Default": "Information",
"Microsoft.Hosting": "Trace"
}
},
"EventSource": {
"LogLevel": {
"Default": "Warning"
}
}
}
}
Logging.{ProviderName}.LogLevel ã®èšå®ã«ãã Logging.LogLevel ã®èšå®ããªãŒããŒã©ã€ããããŸãã äžèšã® JSON ã§ã¯ãDebug ãããã€ããŒã®æ¢å®ã®ãã° ã¬ãã«ã¯ Information ã«èšå®ãããŠããŸãã
Logging:Debug:LogLevel:Default:Information
äžèšã®èšå®ã«ãããInformation 以å€ã®ãã¹ãŠã® Logging:Debug: ã«ããŽãªã« Microsoft.Hosting ãã° ã¬ãã«ãæå®ãããŸãã ç¹å®ã®ã«ããŽãªãäžèŠ§è¡šç€ºããããšãç¹å®ã®ã«ããŽãªã«ãã£ãŠæ¢å®ã®ã«ããŽãªããªãŒããŒã©ã€ããããŸãã äžèšã® JSON ã§ã¯ãLogging:Debug:LogLevel ã«ããŽãª "Microsoft.Hosting" ãš "Default" ã«ãã£ãŠãLogging:LogLevel ã®èšå®ããªãŒããŒã©ã€ããããŸãã
次ã®ããããã®æå°ãã° ã¬ãã«ãæå®ããŸãã
- ç¹å®ã®ãããã€ããŒ: ããšãã°ã
Logging:EventSource:LogLevel:Default:Information - ç¹å®ã®ã«ããŽãª: ããšãã°ã
Logging:LogLevel:Microsoft:Warning - ãã¹ãŠã®ãããã€ããŒãšãã¹ãŠã®ã«ããŽãª:
Logging:LogLevel:Default:Warning
æå°ã¬ãã«ãäžåããã° ã¯æ¬¡ã®éãã§ã¯ãããŸããã
- ãããã€ããŒã«æž¡ãããã
- ãã°ã«èšé²ãŸãã¯è¡šç€ºãããã
ãã¹ãŠã®ãã°ãæå¶ããã«ã¯ãLogLevel.None ãæå®ããŸãã
LogLevel.None ã®å€ã¯ãLogLevel.Critical (5) ãã倧ãã 6 ã§ãã
ãããã€ããŒã§ãã°ã®ã¹ã³ãŒãããµããŒããããŠããå ŽåãIncludeScopes ã«ãã£ãŠãããæå¹ã«ãããã©ãããæå®ãããŸãã 詳现ã«ã€ããŠã¯ããã° ã¹ã³ãŒãã®ãåç
§ããŠãã ããã
次㮠appsettings.json ãã¡ã€ã«ã«ã¯ããã¹ãŠã®çµã¿èŸŒã¿ãããã€ããŒçšã®èšå®ãå«ãŸããŠããŸãã
{
"Logging": {
"LogLevel": {
"Default": "Error",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Warning"
},
"Debug": {
"LogLevel": {
"Default": "Information"
}
},
"Console": {
"IncludeScopes": true,
"LogLevel": {
"Microsoft.Extensions.Hosting": "Warning",
"Default": "Information"
}
},
"EventSource": {
"LogLevel": {
"Microsoft": "Information"
}
},
"EventLog": {
"LogLevel": {
"Microsoft": "Information"
}
},
"AzureAppServicesFile": {
"IncludeScopes": true,
"LogLevel": {
"Default": "Warning"
}
},
"AzureAppServicesBlob": {
"IncludeScopes": true,
"LogLevel": {
"Microsoft": "Information"
}
},
"ApplicationInsights": {
"LogLevel": {
"Default": "Information"
}
}
}
}
äžèšã®ãµã³ãã«ã«ã€ããŠ:
- ã«ããŽãªãšã¬ãã«ã¯æšå¥šå€ã§ã¯ãããŸããã ãã®ãµã³ãã«ã§ã¯ããã¹ãŠã®æ¢å®ã®ãããã€ããŒã衚瀺ãããŸãã
-
Logging.{ProviderName}.LogLevelã®èšå®ã«ããLogging.LogLevelã®èšå®ããªãŒããŒã©ã€ããããŸãã ããšãã°ãDebug.LogLevel.Defaultã®ã¬ãã«ã«ããLogLevel.Defaultã®ã¬ãã«ããªãŒããŒã©ã€ããããŸãã - åãããã€ããŒã® "ãšã€ãªã¢ã¹" ã䜿çšãããŠããŸãã åãããã€ããŒã¯ãå®å
šä¿®é£Ÿååã®ä»£ããã«æ§æã§äœ¿çšã§ãã ãšã€ãªã¢ã¹ ãå®çŸ©ããŸãã çµã¿èŸŒã¿ãããã€ããŒã®ãšã€ãªã¢ã¹ã¯æ¬¡ã®ãšããã§ãã
ConsoleDebugEventSourceEventLogAzureAppServicesFileAzureAppServicesBlobApplicationInsights
ã³ãã³ã ã©ã€ã³ãç°å¢å€æ°ãããã³ãã®ä»ã®æ§æã§ãã° ã¬ãã«ãèšå®ãã
æ§æãããã€ããŒã®ããããã䜿çšããŠãã° ã¬ãã«ãèšå® ããŸãã ããšãã°ãLogging:LogLevel:Microsoftã®å€ãæã€Informationãšããååã®æ°žç¶åãããç°å¢å€æ°ãäœæããŸãã
ãã° ã¬ãã«ã®å€ãä»£å ¥ããããæ°žç¶åãããç°å¢å€æ°ãäœæããŸãã
:: Assigns the env var to the value
setx "Logging__LogLevel__Microsoft" "Information" /M
ã³ãã³ã ããã³ããã® "æ°ãã" ã€ã³ã¹ã¿ã³ã¹ã§ãç°å¢å€æ°ãèªã¿åããŸãã
:: Prints the env var value
echo %Logging__LogLevel__Microsoft%
äžèšã®ç°å¢èšå®ã¯ãç°å¢ã«ä¿æãããŸãã .NET Worker ãµãŒãã¹ ãã³ãã¬ãŒãã§äœæãããã¢ããªã䜿çšããŠèšå®ããã¹ãããã«ã¯ãç°å¢å€æ°ã«ä»£å
¥ããåŸããããžã§ã¯ã ãã£ã¬ã¯ããªå
ã§ dotnet run ã³ãã³ãã䜿çšããŸãã
dotnet run
ãã³ã
ç°å¢å€æ°ãèšå®ããåŸãçµ±åéçºç°å¢ (IDE) ãåèµ·åããŠãæ°ãã远å ããç°å¢å€æ°ã䜿çšã§ããããšã確èªããŸãã
Azure App Service ã®ã ããŒãžã§ > ãéžæããŸãã Azure App Service ã¢ããªã±ãŒã·ã§ã³ã®èšå®ã¯ïŒ
- ä¿åæã«æå·åãããæå·åããããã£ãã«çµç±ã§éä¿¡ãããŸãã
- ç°å¢å€æ°ãšããŠå ¬éãããŸãã
ç°å¢å€æ°ã䜿çšã㊠.NET æ§æå€ãèšå®ããæ¹æ³ã®è©³çްã«ã€ããŠã¯ãç°å¢å€æ°ã«é¢ããèšäºãåç §ããŠãã ããã
ã³ãŒãã䜿çšããŠãã°èšé²ãæ§æãã
ã³ãŒãã«ãã°ãæ§æããã«ã¯ãILoggingBuilder API ã䜿çšããŸãã ããŸããŸãªå Žæããã¢ã¯ã»ã¹ã§ããŸãã
-
ILoggerFactoryãçŽæ¥äœæããå Žåã¯ãLoggerFactory.Create ã«æ§æããŸãã - ãã¹ããªãã§ DI ã䜿çšããå Žåã¯ãLoggingServiceCollectionExtensions.AddLogging ã«æ§æããŸãã
- ãã¹ãã䜿çšããå Žåã¯ãHostApplicationBuilder.LoggingãWebApplicationBuilder.LoggingããŸãã¯ãã®ä»ã®ãã¹ãåºæã® API ã䜿çšããŠæ§æããŸãã
ãã®äŸã§ã¯ãã³ã³ãœãŒã« ãã° ãããã€ããŒãšããã€ãã®ãã£ã«ã¿ãŒãèšå®ããŠããŸãã
using Microsoft.Extensions.Logging;
using var loggerFactory = LoggerFactory.Create(static builder =>
{
builder
.AddFilter("Microsoft", LogLevel.Warning)
.AddFilter("System", LogLevel.Warning)
.AddFilter("LoggingConsoleApp.Program", LogLevel.Debug)
.AddConsole();
});
ILogger logger = loggerFactory.CreateLogger<Program>();
logger.LogDebug("Hello {Target}", "Everyone");
åã®äŸã§ã¯ãAddFilterããŸããŸãªã«ããŽãªã§æå¹ã«ãªã£ãŠãããã° ã¬ãã«ã調æŽããŸãã
AddConsole ã¯ã³ã³ãœãŒã« ãã° ãããã€ããŒã远å ããŸãã æ¢å®ã§ã¯ãDebug ã®é倧床ã®ãã°ã¯æå¹ã«ãªã£ãŠããŸããããæ§æã«ãã£ãŠãã£ã«ã¿ãŒã調æŽãããããããããã° ã¡ãã»ãŒãž "Hello Everyone" ãã³ã³ãœãŒã«ã«è¡šç€ºãããŸãã
ãã£ã«ã¿ãŒèŠåãé©çšããæ¹æ³
ILogger<TCategoryName> ãªããžã§ã¯ããäœæãããšãILoggerFactory ãªããžã§ã¯ãã«ãã£ãŠããã®ãã¬ãŒã«é©çšãããããã€ããŒããšã« 1 ã€ã®èŠåãéžæãããŸãã
ILogger ã€ã³ã¹ã¿ã³ã¹ã¯ãéžæããã«ãŒã«ã«åºã¥ããŠãæžã蟌ããã¹ãŠã®ã¡ãã»ãŒãžããã£ã«ã¿ãŒåŠçããŸãã 䜿çšã§ããèŠåãããåãããã€ããŒãšã«ããŽãªã®ãã¢ããšã«æãæç¢ºãªèŠåãéžæãããŸãã
ç¹å®ã®ã«ããŽãªã« ILogger ãäœæããããšãã«ãåãããã€ããŒã«æ¬¡ã®ã¢ã«ãŽãªãºã ã䜿çšãããŸãã
- ãããã€ããŒãšãã®ãšã€ãªã¢ã¹ãšäžèŽãããã¹ãŠã®èŠåãéžæãããŸãã äžèŽãèŠã€ãããªãå Žåã¯ã空ã®ãããã€ããŒã§ãã¹ãŠã®èŠåãéžæãããŸãã
- åã®æé ã®çµæãæãé·ãã«ããŽãªã®ãã¬ãã£ãã¯ã¹ãäžèŽããèŠåãéžæãããŸãã äžèŽãèŠã€ãããªãå Žåã¯ãã«ããŽãªãæå®ããªããã¹ãŠã®èŠåãéžæãããŸãã
- è€æ°ã®èŠåãéžæãããŠããå Žåã¯ãæåŸã® 1 ã€ã䜿çšãããŸãã
- èŠåãéžæãããŠããªãå Žåã¯ãLoggingBuilderExtensions.SetMinimumLevel(ILoggingBuilder, LogLevel) ã䜿çšããŠæå°ãã°èšé²ã¬ãã«ãæå®ããŸãã
ãã°ã®ã«ããŽãª
ILogger ãªããžã§ã¯ããäœæããããšãã«ã"ã«ããŽãª" ãæå®ãããŸãã ãã®ã«ããŽãªã¯ãILogger ã®ã€ã³ã¹ã¿ã³ã¹ã«ãã£ãŠäœæãããåãã° ã¡ãã»ãŒãžãšå
±ã«å«ããããŸãã ã«ããŽãªæååã¯ä»»æã§ãããæ
£ç¿çã«ã¯å®å
šä¿®é£Ÿã¯ã©ã¹åã䜿çšããŸãã ããšãã°ããµãŒãã¹ã次ã®ãªããžã§ã¯ãããã«å®çŸ©ãããŠããã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã«ããŽãªã¯ "Example.DefaultService" ã®ããã«ãªããŸãã
namespace Example
{
public class DefaultService : IService
{
private readonly ILogger<DefaultService> _logger;
public DefaultService(ILogger<DefaultService> logger) =>
_logger = logger;
// ...
}
}
ãããªãåé¡ãå¿ èŠãªå Žåãæ £ç¿çã«ã¯ã次ã®ããã«å®å šä¿®é£Ÿã¯ã©ã¹åã«ãµãã«ããŽãªã远å ããããšã§éå±€çãªååã䜿çšããLoggerFactory.CreateLogger ã䜿çšããŠã«ããŽãªãæç€ºçã«æå®ããŸãã
namespace Example
{
public class DefaultService : IService
{
private readonly ILogger _logger;
public DefaultService(ILoggerFactory loggerFactory) =>
_logger = loggerFactory.CreateLogger("Example.DefaultService.CustomCategory");
// ...
}
}
åºå®åã§ CreateLogger ãåŒã³åºãããšã¯ãã€ãã³ããã«ããŽãªå¥ã«æŽçã§ããããã«ãè€æ°ã®ã¯ã©ã¹/åã§äœ¿çšããå Žåã«äŸ¿å©ã§ãã
ILogger<T> ã¯ãCreateLogger ã®å®å
šä¿®é£Ÿååã䜿çšãã T ã®åŒã³åºããšåãã§ãã
ãã° ã¬ãã«
次ã®è¡šã«ãLogLevel å€ã䟿å©ãª Log{LogLevel} æ¡åŒµã¡ãœãããæšå¥šãããäœ¿çšæ³ã瀺ããŸãã
| LogLevel | äŸ¡å€ | ã¡ãœãã | Description |
|---|---|---|---|
| ãã¬ãŒã¹ | 0 | LogTrace | æã詳现ãªã¡ãã»ãŒãžãå«ãŸããŸãã ãããã®ã¡ãã»ãŒãžã«ã¯ãæ©å¯æ§ã®é«ãã¢ã㪠ããŒã¿ãå«ãŸããŠããå ŽåããããŸãã ãããã®ã¡ãã»ãŒãžã¯æ¢å®ã§ç¡å¹ã«ãªã£ãŠãããããéçšç°å¢ã§ã¯æå¹ã« "ããªãã§ãã ãã"ã |
| ãããã° | 1 | LogDebug | ãããã°ãšéçºçšã éãå€ããããéçšç°å¢ã§ã¯æ éã«äœ¿çšããŠãã ããã |
| æ å ± | 2 | LogInformation | ã¢ããªã®äžè¬çãªãããŒã远跡ããŸãã é·æçãªäŸ¡å€ããããããããŸããã |
| èŠå | 3 | LogWarning | ç°åžžãªã€ãã³ããäºæããªãã€ãã³ãçšã éåžžãã¢ããªã倱æããåå ã«ãªããªããšã©ãŒãæ¡ä»¶ãå«ãŸããŸãã |
| ãšã©ãŒ | 4 | LogError | åŠçã§ããªããšã©ãŒãšäŸå€ã®å Žåã ãããã®ã¡ãã»ãŒãžã¯ãã¢ããªå šäœã®ãšã©ãŒã§ã¯ãªããçŸåšã®æäœãèŠæ±ã«ããã倱æã瀺ããŸãã |
| é倧 | 5 | LogCritical | å³æã®æ³šæãå¿ èŠãªãšã©ãŒã®å Žåã äŸ: ããŒã¿æå€±ã®ã·ããªãªããã£ã¹ã¯é åäžè¶³ã |
| ãªã | 6 | ã¡ãã»ãŒãžãæžã蟌ãå¿ èŠããªãããšãæå®ããŸãã |
åã®è¡šã§ã¯ãé倧床ãæãäœãæ¹ããé«ãæ¹ã« LogLevel ãäžèŠ§è¡šç€ºãããŠããŸãã
Log ã¡ãœããã®æåã®ãã©ã¡ãŒã¿ãŒ LogLevel ã¯ããã°ã®é倧床ã瀺ããŸãã ã»ãšãã©ã®éçºè
ã¯ãLog(LogLevel, ...) ãåŒã³åºãã®ã§ã¯ãªããLog{LogLevel} æ¡åŒµã¡ãœãããåŒã³åºããŸãã
Log{LogLevel} æ¡åŒµã¡ãœããã«ãã£ãŠãLog ã¡ãœãããåŒã³åºãããLogLevel ãæå®ãããŸãã ããšãã°ã次㮠2 ã€ã®ãã°åŒã³åºãã¯ãæ©èœçã«åçã§ãåããã°ãçæãããŸãã
public void LogDetails()
{
var logMessage = "Details for log.";
_logger.Log(LogLevel.Information, AppLogEvents.Details, logMessage);
_logger.LogInformation(AppLogEvents.Details, logMessage);
}
AppLogEvents.Details ã¯ã€ãã³ã ID ã§ãããæé»çã« Int32 宿°å€ã«ãã£ãŠè¡šãããŸãã
AppLogEvents ã¯ããŸããŸãªååä»ãèå¥å宿°ãå
¬éããã¯ã©ã¹ã§ããããã° ã€ãã³ã ID ã»ã¯ã·ã§ã³ã«è¡šç€ºãããŸãã
Information ããã³ Warning ãã°ãäœæããã³ãŒããæ¬¡ã«ç€ºããŸãã
public async Task<T> GetAsync<T>(string id)
{
_logger.LogInformation(AppLogEvents.Read, "Reading value for {Id}", id);
var result = await _repository.GetAsync(id);
if (result is null)
{
_logger.LogWarning(AppLogEvents.ReadNotFound, "GetAsync({Id}) not found", id);
}
return result;
}
äžèšã®ã³ãŒãã§ã¯ãæåã® Log{LogLevel} ãã©ã¡ãŒã¿ãŒ ( AppLogEvents.Read) 㯠Log ã€ãã³ã ID ã§ãã 2 ã€ç®ã®ãã©ã¡ãŒã¿ãŒã¯ãä»ã®ã¡ãœãã ãã©ã¡ãŒã¿ãŒã«ãã£ãŠæäŸãããåŒæ°å€ã®ãã¬ãŒã¹ãã«ããŒãå«ãã¡ãã»ãŒãž ãã³ãã¬ãŒãã§ãã ã¡ãœãã ãã©ã¡ãŒã¿ãŒã«ã€ããŠã¯ããã®èšäºã®åŸåã®ã¡ãã»ãŒãž ãã³ãã¬ãŒãã«é¢ããã»ã¯ã·ã§ã³ã§èª¬æããŸãã
é©åãªãã° ã¬ãã«ãæ§æããé©å㪠Log{LogLevel} ã¡ãœãããåŒã³åºããŠãç¹å®ã®ã¹ãã¬ãŒãž ã¡ãã£ã¢ã«æžã蟌ããã°åºåã®éãå¶åŸ¡ããŸãã äŸãã°æ¬¡ãæããããŸãã
- éçšç°å¢:
-
TraceãŸãã¯Debugã®ã¬ãã«ã§ãã°ãèšé²ãããšã詳现ãªãã° ã¡ãã»ãŒãžã倧éã«çæãããŸãã ã³ã¹ããå¶åŸ¡ããããŒã¿ ã¹ãã¬ãŒãžã®äžéãè¶ ããªãããã«ããã«ã¯ãTraceããã³Debugã®ã¬ãã«ã®ã¡ãã»ãŒãžãã倧容éã®äœã³ã¹ãã®ããŒã¿ ã¹ãã¢ã«èšé²ããŸããTraceãšDebugãç¹å®ã®ã«ããŽãªã«å¶éããããšãæ€èšããŠãã ããã -
WarningããCriticalã®ã¬ãã«ã§ãã°ãèšé²ããŠãããã° ã¡ãã»ãŒãžã¯ã»ãšãã©çæãããŸããã- éåžžãã³ã¹ããšã¹ãã¬ãŒãžã®å¶éã¯èæ ®ãããŸããã
- ãã°ã®æ°ãå°ãªãã»ã©ãããŒã¿ ã¹ãã¢ãããæè»ã«éžæã§ããããã«ãªããŸãã
-
- éçºäž:
-
Warningã«èšå®ããŸãã - ãã©ãã«ã·ã¥ãŒãã£ã³ã°ã®éã«
TraceãŸãã¯Debugã®ã¡ãã»ãŒãžã远å ããŸãã åºåãå¶éããã«ã¯ã調æ»äžã®ã«ããŽãªã«å¯ŸããŠã®ã¿TraceãŸãã¯Debugãèšå®ããŸãã
-
次㮠JSON 㯠Logging:Console:LogLevel:Microsoft:Information ãèšå®ããŸãã
{
"Logging": {
"LogLevel": {
"Microsoft": "Warning"
},
"Console": {
"LogLevel": {
"Microsoft": "Information"
}
}
}
}
ãã° ã€ãã³ã ID
åãã°ã§ã¯ã"ã€ãã³ãèå¥å" ãæå®ã§ããŸããEventId ã¯ãId ããã³çç¥å¯èœãª Name èªã¿åãå°çšããããã£ãæã€æ§é äœã§ãã ãµã³ãã« ãœãŒã¹ ã³ãŒãã§ã¯ãAppLogEvents ã¯ã©ã¹ã䜿çšããŠã€ãã³ã ID ãå®çŸ©ããŠããŸãã
using Microsoft.Extensions.Logging;
internal static class AppLogEvents
{
internal static EventId Create = new(1000, "Created");
internal static EventId Read = new(1001, "Read");
internal static EventId Update = new(1002, "Updated");
internal static EventId Delete = new(1003, "Deleted");
// These are also valid EventId instances, as there's
// an implicit conversion from int to an EventId
internal const int Details = 3000;
internal const int Error = 3001;
internal static EventId ReadNotFound = 4000;
internal static EventId UpdateNotFound = 4001;
// ...
}
ãã³ã
int ã EventId ã«å€æŽããæ¹æ³ã«ã€ããŠã¯ããEventId.Implicit(Int32 to EventId) æŒç®åããåç
§ããŠãã ããã
ã€ãã³ã ID ã«ãã£ãŠäžé£ã®ã€ãã³ããé¢é£ä»ããããŸãã ããšãã°ããªããžããªããã®å€ã®èªã¿åãã«é¢é£ãããã¹ãŠã®ãã°ã 1001 ã«ããããšãã§ããŸãã
ãã° ãããã€ããŒã¯ãã€ãã³ã ID ã ID ãã£ãŒã«ãããã° ã¡ãã»ãŒãžããŸãã¯ãŸã£ãããã°ã«èšé²ããªãå¯èœæ§ããããŸãã Debug ãããã€ããŒã§ã€ãã³ã ID ã衚瀺ãããããšã¯ãããŸããã Console ãããã€ããŒã§ã¯ãã«ããŽãªã®åŸã®ãã©ã±ããå ã«ã€ãã³ã ID ã衚瀺ãããŸãã
info: Example.DefaultService.GetAsync[1001]
Reading value for a1b2c3
warn: Example.DefaultService.GetAsync[4000]
GetAsync(a1b2c3) not found
äžéšã®ãã° ãããã€ããŒã§ã¯ãã€ãã³ã ID ããã£ãŒã«ãã«æ ŒçŽãããŸããããã«ãããID ã«å¯Ÿãããã£ã«ã¿ãŒåŠçãå¯èœã«ãªããŸãã
ãã° ã¡ãã»ãŒãž ãã³ãã¬ãŒã
åãã° API ã§ã¯ãã¡ãã»ãŒãž ãã³ãã¬ãŒãã䜿çšãããŸãã ã¡ãã»ãŒãž ãã³ãã¬ãŒãã«ã¯ãæå®ãããåŒæ°ã®ããã®ãã¬ãŒã¹ãã«ããŒãå«ããããšãã§ããŸãã ãã¬ãŒã¹ãã«ããŒã«ã¯ãæ°å€ã§ã¯ãªãååã䜿çšããŸãã ãã¬ãŒã¹ãã«ããŒã®ååã§ã¯ãªãããã¬ãŒã¹ãã«ããŒã®é åºã«ãã£ãŠãå€ã®æå®ã«äœ¿çšããããã©ã¡ãŒã¿ãŒã決ãŸããŸãã æ¬¡ã®ã³ãŒãã§ã¯ããã©ã¡ãŒã¿ãŒåãã¡ãã»ãŒãž ãã³ãã¬ãŒãå ã®ã·ãŒã±ã³ã¹ã®å€ã«ãããŸãã
string p1 = "param1";
string p2 = "param2";
_logger.LogInformation("Parameter values: {p2}, {p1}", p1, p2);
äžèšã®ã³ãŒãã§ã¯ãã·ãŒã±ã³ã¹å ã®ãã©ã¡ãŒã¿ãŒå€ãå«ããã° ã¡ãã»ãŒãžãäœæãããŸãã
Parameter values: param1, param2
泚
1 ã€ã®ã¡ãã»ãŒãž ãã³ãã¬ãŒãå ã§è€æ°ã®ãã¬ãŒã¹ãã«ããŒã䜿çšãããšãã¯æ³šæããŠãã ãããåºæ°åºæºã«ãªããŸãã ååã¯ãåŒæ°ããã¬ãŒã¹ãã«ããŒã«åãããããã«äœ¿çšãããŸããã
ãã®æ¹æ³ã«ããããã° ãããã€ããŒã¯ ã»ãã³ãã£ã㯠ãã°ãŸãã¯æ§é åãã°ãå®è£ ã§ããŸãã æžåŒèšå®ãããã¡ãã»ãŒãž ãã³ãã¬ãŒãã ãã§ãªããåŒæ°èªäœããã° ã·ã¹ãã ã«æž¡ãããŸãã ããã«ããããã° ãããã€ããŒã¯ãã£ãŒã«ããšããŠãã©ã¡ãŒã¿ãŒå€ãæ ŒçŽããããšãã§ããŸãã æ¬¡ã®ãã¬ãŒ ã¡ãœããã«ã€ããŠèããŠã¿ãŸãã
_logger.LogInformation("Getting item {Id} at {RunTime}", id, DateTime.Now);
ããšãã°ãAzure Table Storage ã«ãã°ãèšé²ããå Žå:
- å Azure Table ãšã³ãã£ãã£ã«ã¯ã
IDããããã£ãšRunTimeããããã£ãå«ããããšãã§ããŸãã - ããããã£ãæã€ããŒãã«ã«ãã£ãŠããã°ã«èšé²ãããããŒã¿ã«å¯Ÿããã¯ãšãªãç°¡ç¥åãããŸãã ããšãã°ãã¯ãšãªã«ãã£ãŠãç¹å®ã®
RunTimeã®ç¯å²å ã®ãã¹ãŠã®ãã°ãæ€çŽ¢ã§ããŸããããã¹ã ã¡ãã»ãŒãžããæéãè§£æããå¿ èŠã¯ãããŸããã
ãã° ã¡ãã»ãŒãž ãã³ãã¬ãŒãã®æžåŒèšå®
ãã° ã¡ãã»ãŒãž ãã³ãã¬ãŒãã§ã¯ããã¬ãŒã¹ãã«ããŒã®æžåŒèšå®ããµããŒããããŠããŸãã ãã³ãã¬ãŒãã§ã¯ãæå®ãããååŒæ°ã« ä»»æã®æå¹ãªåœ¢åŒ ãæå®ã§ããŸãã ããšãã°ã次㮠Information ãã¬ãŒ ã¡ãã»ãŒãž ãã³ãã¬ãŒãã«ã€ããŠèããŠã¿ãŸãã
_logger.LogInformation("Logged on {PlaceHolderName:MMMM dd, yyyy}", DateTimeOffset.UtcNow);
// Logged on January 06, 2022
åã®äŸã§ã¯ãDateTimeOffset ã€ã³ã¹ã¿ã³ã¹ã¯ããã¬ãŒ ã¡ãã»ãŒãž ãã³ãã¬ãŒãã® PlaceHolderName ã«å¯Ÿå¿ããåã«ãªããŸãã å€ã¯åºæ°åºæºã§ããããã®ååã«ã¯äœã§ãæå®ã§ããŸãã
MMMM dd, yyyy 圢åŒã¯ DateTimeOffset åã§æå¹ã§ãã
DateTime ããã³ DateTimeOffset ã®è©³çްã«ã€ããŠã¯ããã«ã¹ã¿ã æ¥æåœ¢åŒæååããã芧ãã ããã
äŸç€º
次ã®äŸã§ã¯ã{} ãã¬ãŒã¹ãã«ããŒæ§æã䜿çšããŠã¡ãã»ãŒãž ãã³ãã¬ãŒããæžåŒèšå®ããæ¹æ³ã瀺ãããŸãã ããã«ã{} ãã¬ãŒã¹ãã«ããŒæ§æããšã¹ã±ãŒãããäŸããã®åºåãšå
±ã«ç€ºãããŸãã æåŸã«ããã³ãã¬ãŒã ãã¬ãŒã¹ãã«ããŒã䜿çšããæååè£éã瀺ãããŸãã
logger.LogInformation("Number: {Number}", 1); // Number: 1
logger.LogInformation("{{Number}}: {Number}", 3); // {Number}: 3
logger.LogInformation($"{{{{Number}}}}: {{Number}}", 5); // {Number}: 5
ãã³ã
- ã»ãšãã©ã®å Žåããã°èšé²æã«ã¯ãåžžã«ãã° ã¡ãã»ãŒãž ãã³ãã¬ãŒãã®æžåŒèšå®ã䜿çšããå¿ èŠããããŸãã æååè£éã䜿çšãããšãããã©ãŒãã³ã¹ã«åé¡ãçºçããããšããããŸãã
- ã³ãŒãåæã®ã«ãŒã«ãCA2254: ãã³ãã¬ãŒãã¯éçãªåŒã«ããå¿ èŠããããŸããã¯ããã° ã¡ãã»ãŒãžã«é©åãªæžåŒèšå®ã䜿çšãããŠããªãå Žæã«ã€ããŠèŠåããã®ã«åœ¹ç«ã¡ãŸãã
äŸå€ããã°ã«èšé²ãã
ãã¬ãŒ ã¡ãœããã«ã¯ãäŸå€ãã©ã¡ãŒã¿ãŒãåãåããªãŒããŒããŒãããããŸãã
public void Test(string id)
{
try
{
if (id is "none")
{
throw new Exception("Default Id detected.");
}
}
catch (Exception ex)
{
_logger.LogWarning(
AppLogEvents.Error, ex,
"Failed to process iteration: {Id}", id);
}
}
äŸå€ãã°ã¯ãããã€ããŒåºæã§ãã
æ¢å®ã®ãã° ã¬ãã«
æ¢å®ã®ãã° ã¬ãã«ãèšå®ãããŠããªãå Žåãæ¢å®ã®ãã° ã¬ãã«ã®å€ã¯ Informationã
ããšãã°ã次ã®ãããªã¯ãŒã«ãŒ ãµãŒãã¹ ã¢ããªã«ã€ããŠèããŠã¿ãŸãã
- .NET Worker ãã³ãã¬ãŒãã䜿çšããŠäœæãããã
- appsettings.json ãš appsettings.Development.json ãåé€ãŸãã¯ååã倿Žãããã
äžèšã®èšå®ã§ããã©ã€ãã·ãŒ ããŒãžãŸãã¯ããŒã ããŒãžã«ç§»åãããšãã«ããŽãªåã« Trace ãå«ãŸããå€ãã® DebugãInformationãMicrosoft ã®ã¡ãã»ãŒãžãçæãããŸãã
次ã®ã³ãŒãã¯ãæ¢å®ã®ãã° ã¬ãã«ãæ§æã§èšå®ãããŠããªãå Žåã«æ¢å®ã®ãã° ã¬ãã«ãèšå®ããŸãã
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Logging.SetMinimumLevel(LogLevel.Warning);
using IHost host = builder.Build();
await host.RunAsync();
ãã£ã«ã¿ãŒé¢æ°
ãã£ã«ã¿ãŒé¢æ°ã¯ãæ§æãŸãã¯ã³ãŒãã«ãã£ãŠèŠåãå²ãåœãŠãããŠããªããã¹ãŠã®ãããã€ããŒãšã«ããŽãªã«å¯ŸããŠåŒã³åºãããŸãã
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Logging.AddFilter((provider, category, logLevel) =>
{
return provider.Contains("ConsoleLoggerProvider")
&& (category.Contains("Example") || category.Contains("Microsoft"))
&& logLevel >= LogLevel.Information;
});
using IHost host = builder.Build();
await host.RunAsync();
äžèšã®ã³ãŒãã§ã¯ãã«ããŽãªã« Example ãŸã㯠Microsoft ãå«ãŸãããã° ã¬ãã«ã Information 以äžã®å Žåã«ã³ã³ãœãŒã« ãã°ã衚瀺ãããŸãã
ãã°ã®ã¹ã³ãŒã
"ã¹ã³ãŒã" ã§ã¯ãè«çæäœã®ã»ãããã°ã«ãŒãåããŸãã ãã®ã°ã«ãŒãåã§ã¯ãã»ããã®äžéšãšããŠäœæãããåãã°ã«åãããŒã¿ãã¢ã¿ããã§ããŸãã ããšãã°ããã©ã³ã¶ã¯ã·ã§ã³åŠçã®äžéšãšããŠäœæããããã¹ãŠã®ãã°ã«ããã©ã³ã¶ã¯ã·ã§ã³ ID ãå«ããããšãã§ããŸãã
ã¹ã³ãŒãã¯:
- IDisposable ã¡ãœããã«ãã£ãŠè¿ããã BeginScope åã§ãã
- ç Žæ£ããããŸã§ãã®ãŸãŸæå¹ã§ãã
次ã®ãããã€ããŒã§ã¯ã¹ã³ãŒãããµããŒããããŠããŸãã
ãã¬ãŒã®åŒã³åºãã using ãããã¯ã§ã©ããããããšã«ãã£ãŠãã¹ã³ãŒãã䜿çšããŸãã
public async Task<T> GetAsync<T>(string id)
{
T result;
var transactionId = Guid.NewGuid().ToString();
using (_logger.BeginScope(new List<KeyValuePair<string, object>>
{
new KeyValuePair<string, object>("TransactionId", transactionId),
}))
{
_logger.LogInformation(
AppLogEvents.Read, "Reading value for {Id}", id);
var result = await _repository.GetAsync(id);
if (result is null)
{
_logger.LogWarning(
AppLogEvents.ReadNotFound, "GetAsync({Id}) not found", id);
}
}
return result;
}
次㮠JSON ã§ã¯ãConsole ãããã€ããŒã®ã¹ã³ãŒããæå¹ã«ããŠããŸãã
{
"Logging": {
"Debug": {
"LogLevel": {
"Default": "Information"
}
},
"Console": {
"IncludeScopes": true,
"LogLevel": {
"Microsoft": "Warning",
"Default": "Information"
}
},
"LogLevel": {
"Default": "Debug"
}
}
}
次ã®ã³ãŒãã§ã¯ãConsole ãããã€ããŒã®ã¹ã³ãŒããæå¹ã«ããŠããŸãã
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Logging.ClearProviders();
builder.Logging.AddSimpleConsole(options => options.IncludeScopes = true);
using IHost host = builder.Build();
await host.RunAsync();
Main ã§ãã°ãäœæãã
次ã®ã³ãŒãã§ã¯ããã¹ããæ§ç¯ããåŸã« DI ãã Main ã€ã³ã¹ã¿ã³ã¹ãååŸããããšã«ãã£ãŠ ILogger ã§ãã°ãèšé²ããŸãã
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using IHost host = Host.CreateApplicationBuilder(args).Build();
var logger = host.Services.GetRequiredService<ILogger<Program>>();
logger.LogInformation("Host created.");
await host.RunAsync();
äžèšã®ã³ãŒãã¯ã次㮠2 ã€ã® NuGet ããã±ãŒãžã«äŸåããŠããŸãã
ãããžã§ã¯ã ãã¡ã€ã«ã¯æ¬¡ã®ããã«ãªããŸãã
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
</ItemGroup>
</Project>
éåæã§ãªããã¬ãŒ ã¡ãœãã
ãã°èšé²ã¯é«éã«å®è¡ãããéåæã³ãŒãã®ããã©ãŒãã³ã¹ ã³ã¹ããäžåãå¿
èŠããããŸãã ãã° ããŒã¿ ã¹ãã¢ãäœéã®å Žåã¯ããããžçŽæ¥æžã蟌ãŸãªãã§ãã ããã ãŸããã° ã¡ãã»ãŒãžãé«éãªã¹ãã¢ã«æžã蟌ãã§ãããåŸã§äœéãªã¹ãã¢ã«ç§»åããããšãæ€èšããŠãã ããã ããšãã°ãSQL Server ã«ãã°ãèšé²ããå ŽåãLog ã¡ãœããã¯åæããŠãããããLog ã¡ãœããã§çŽæ¥ãããè¡ããªãã§ãã ããã 代ããã«ããã° ã¡ãã»ãŒãžãã€ã³ã¡ã¢ãª ãã¥ãŒã«åæçã«è¿œå ããããã¯ã°ã©ãŠã³ã ã¯ãŒã«ãŒã«ãã¥ãŒããã¡ãã»ãŒãžããã«ãããŠãSQL Server ã«ããŒã¿ãããã·ã¥ããéåæåŠçãå®è¡ãããŸãã
å®è¡äžã®ã¢ããªã®ãã° ã¬ãã«ã倿Žãã
ãã° API ã«ã¯ãã¢ããªã®å®è¡äžã«ãã° ã¬ãã«ã倿Žããã·ããªãªã¯å«ãŸããŠããŸããã ãã ããäžéšã®æ§æãããã€ããŒã¯æ§æãåèªã¿èŸŒã¿ã§ãããã°èšé²ã®æ§æã«ããã«åœ±é¿ããŸãã ããšãã°ããã¡ã€ã«æ§æãããã€ããŒã§ã¯ãæ¢å®ã§ãã°æ§æãå床èªã¿èŸŒãŸããŸãã ã¢ããªã®å®è¡äžã«ã³ãŒãå ã®æ§æã倿Žããå Žåãã¢ããªã¯ IConfigurationRoot.Reload ãåŒã³åºããŠã¢ããªã®ãã°æ§æãæŽæ°ã§ããŸãã
NuGet ããã±ãŒãž
ILogger<TCategoryName> ãš ILoggerFactory ã®ã€ã³ã¿ãŒãã§ã€ã¹ãšå®è£ ã¯ãã»ãšãã©ã® .NET SDK ã«æé»çãªããã±ãŒãžåç §ãšããŠå«ãŸããŠããŸãã æé»çã«åç §ãããªãå Žåã§ããæ¬¡ã® NuGet ããã±ãŒãžã§æç€ºçã«äœ¿çšããããšãã§ããŸãã
- ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãMicrosoft.Extensions.Logging.Abstractions ã«ãããŸãã
- æ¢å®ã®å®è£ ã¯ãMicrosoft.Extensions.Logging ã«ãããŸãã
ã©ã® .NET SDK ã«æé»çãªããã±ãŒãžåç §ãå«ãŸãããã®è©³çްã«ã€ããŠã¯ã.NET SDK: æé»çãªåå空éãžã®ããŒãã«ã«é¢ããèšäºãåç §ããŠãã ããã
ãã¡ããåç §ãã ãã
- .NET ã§ã®ãã° ãããã€ããŒ
- .NET ã«ã«ã¹ã¿ã ãã° ãããã€ããŒãå®è£ ãã
- ã³ã³ãœãŒã« ãã°ã®æžåŒèšå®
- .NET ã§ã®é«ããã©ãŒãã³ã¹ ãã°èšé²
- .NET ã©ã€ãã©ãªäœæè ã®ããã®ãã°ã®ã¬ã€ãã³ã¹
- ãã°ã®ãã°ã¯ãgithub.com/dotnet/runtime/ ãªããžããªã«äœæããå¿ èŠããããŸãã