2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

.Net Core2.2におけるWebAPIのログ出力について

Posted at

.NET Coreを始めたのですが、理解が浅かったのでこまめにまとめたいと思います。
ここではWebAPIによるプロジェクトのログ出力についてまとめます。

環境

Tools Version
.NET Core SDK 2.2.401

初めに

.NET CoreにおけるLoggerの基本的な使い方はDIによる利用になります。

SampleController.cs
    [Route("api/[action]")]
    [ApiController]
    public class SamplesController : ControllerBase
    {
        private readonly ILogger<SamplesController> _logger;
        public SamplesController(ILogger<SamplesController> logger)
        {
            _logger = logger;
        }
        [HttpGet]
        public async Task<ActionResult<IEnumerable<Sample>>> GetSamples()
        {
            _logger.LogTrace("trace");
            _logger.LogDebug("debug");
            _logger.LogInformation("info");
            _logger.LogWarning("warning");
            _logger.LogError("error");
            _logger.LogCritical("critical");
            return new List<Sample> { new Sample() };
        }
    }

TraceIdの扱いをどうするか

例えば、GET: api/samples/{id}のようなエンドポイントを考えます。
以下のようなコードを用意します。

SampleController.cs
    [Route("api/[action]")]
    [ApiController]
    public class SamplesController : ControllerBase
    {
        private readonly ISampleService _sampleService;
        private readonly ILogger<SamplesController> _logger;
        public SamplesController(ISampleService sampleService, ILogger<SamplesController> logger)
        {
            _sampleService = sampleService;
            _logger = logger;
        }
        [HttpGet("{id}")]
        public async Task<ActionResult<Sample>> GetSample(int id)
        {
          var sample = await _sampleService.FindById(id);
          if (sample == null) {
            return NotFound();
          }
          return  sample;
        }
    }

指定したIdが存在しない場合、NotFoundResultを返します。

この時のレスポンスは以下のようになります。


    {
        "type": "https://tools.ietf.org/html/rfc7231#section-6.5.4",
        "title": "Not Found",
        "status": 404,
        "traceId": "0HLOJ3836502B:00000001"
    }

ここで気になるのはtraceIdの存在です。ログの出力をDebugレベルで確認すると、リクエストの開始とレスポンスの完了のタイミングでtraceIdの出力があります。しかし、Debugレベルでの出力になるので、不要なのでは?と思ってしまいます。

悩んだ結果、TraceIdをログに出すことにしました。

SampleController.cs
        [HttpGet("{id}")]
        public async Task<ActionResult<Sample>> GetSample(int id)
        {
          var sample = await _sampleService.FindById(id);
          if (sample == null) {
            _logger.LogError($"traceId: {HttpContext.TraceIdentifier}. Sample is not found.");
            return NotFound();
          }
          return  sample;
        }

Controllerからであれば、HttpContextプロパティのTraceIdentifierをログ出力すれば良いです。

最後に

そもそもレスポンスをtraceIdを返さないようにすることもできるんですが、どちらがいいんでしょうか 🤔

参考

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?