VieTopikKhoá học
  • Games
  • Cá nhân
Tải app
© 2026 VieTopikChính sách bảo mậtĐiều khoản sử dụngCài appEnglish
  • Trang chủ
  • Học
  • Luyện thi
  • Cẩm nang
  • Games
  • Cá nhân
ASP.NET Core Web APICấu trúc ứng dụng
Bài 11/19
5 phút

Logging

Bình luận
Nội dung bài · 5 mục
  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt

Khách báo không đặt được hàng lúc 2 giờ sáng. Không ai ngồi xem server lúc đó. Thứ duy nhất còn lại để biết chuyện gì đã xảy ra là log. Bài này hướng dẫn ghi log đúng cách trong ASP.NET Core.

Khái niệm

📝 Logging: ghi lại những gì ứng dụng đang làm, để tra cứu khi có sự cố.

📶 Log level: mức độ quan trọng của một dòng log, từ thấp tới cao là Trace, Debug, Information, Warning, Error, Critical.

Level Khi nào dùng
Debug chi tiết để dò lỗi lúc dev
Information sự kiện bình thường: tạo đơn, đăng nhập
Warning bất thường nhưng vẫn chạy được
Error lỗi làm hỏng một thao tác

Ví dụ

using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/products")]
public class ProductsController : ControllerBase
{
    private readonly ILogger<ProductsController>
        _logger;

    public ProductsController(
        ILogger<ProductsController> logger)
    {
        _logger = logger;
    }

    [HttpGet("{id}")]
    public IActionResult GetById(int id)
    {
        _logger.LogDebug(
            "Bắt đầu tìm sản phẩm {Id}", id);

        if (id > 100)
        {
            _logger.LogWarning(
                "Không tìm thấy sản phẩm {Id}", id);
            return NotFound();
        }
        return Ok(id);
    }
}
  • ILogger<ProductsController> có sẵn trong container. Tên class trong < > được ghi kèm mỗi dòng log để biết log đến từ đâu.
  • {Id} là placeholder: giá trị của id được điền vào đúng vị trí đó. Công cụ xem log lọc được theo giá trị này.
  • appsettings.json quy định level thấp nhất được ghi. Mặc định là Information, nên dòng LogDebug không hiện.

Thử ngay

Dùng controller ở ví dụ trên, chạy server rồi gọi:

curl -i http://localhost:5000/api/products/999

Đoán trước khi chạy: action gọi cả LogDebug và LogWarning. Cửa sổ đang chạy server hiện mấy dòng log mới?

Xem kết quả
warn: ProductsController[0]
      Không tìm thấy sản phẩm 999

Chỉ một dòng warn của action. LogDebug thấp hơn mức Information mặc định nên bị bỏ qua. Lần gọi đầu có thể kèm một dòng warn của HttpsRedirection báo không tìm thấy cổng https, bỏ qua được.

Lỗi hay gặp

Ghép chuỗi vào log. Dòng log vẫn đọc được, nhưng công cụ xem log không lọc được theo Id nữa.

// SAI — giá trị bị ghép thẳng vào chuỗi
_logger.LogWarning($"Không tìm thấy sản phẩm {id}");
// ĐÚNG — dùng placeholder {Id}
_logger.LogWarning("Không tìm thấy sản phẩm {Id}", id);

Ghi dữ liệu nhạy cảm. Mật khẩu, số thẻ, token không bao giờ được ghi vào log, vì nhiều người và nhiều hệ thống đọc được log.

Tóm tắt

  • Nhận ILogger<T> qua constructor để ghi log.
  • Chọn level theo mức độ: Information cho sự kiện thường, Warning cho bất thường, Error cho lỗi.
  • Dùng placeholder như {Id} thay vì ghép chuỗi.
  • Level thấp nhất được ghi đặt trong appsettings.json.
Cấu hình với appsettingsMiddleware và pipeline

Bình luận

Đang tải bình luận…

Nội dung bài

  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt