logging la gi

Note: see the liên kết below for the English version of this article.

https://ceds.edu.vn/structured-log/

Bạn đang xem: logging la gi

Structured logging là gì

Logging là 1 trong mỗi dụng cụ hữu ích nhất của từng xây dựng viên. Nếu thiếu hụt logging, việc bám theo dõi hiện trạng khối hệ thống, đo tính năng, hoặc sửa lỗi tiếp tục trở ngại rộng lớn thật nhiều, còn nếu như không ham muốn trình bày là tiếp tục trở nên bất khả đua. Vấn đề này càng chính xác nếu như khối hệ thống của tớ được cấu trở nên từ khá nhiều microservice, nhập bại liệt từng service lại sở hữu nhiều instance hòng tăng tính khả dụng

Logging bám theo phong thái truyền thống

Cách logging truyền thống lịch sử là ghi toàn bộ tài liệu đi ra những tệp tin. Tuy nhiên phương thức này còn có điểm yếu rộng lớn, nó ko bảo toàn được toàn cỗ vấn đề lúc đầu nhập log. Giả sử tớ với 1 tệp tin log rộng lớn nhập bại liệt có tương đối nhiều message như sau đây.

<timestamp> Warn: CPU Usage percentage exceeded 50% for node A
<timestamp> Warn: Memory Usage exceeded 50% for node B

Ta hoàn toàn có thể người sử dụng câu mệnh lệnh grep %node A% nhằm trích đi ra toàn bộ message về NodeA, tớ cũng hoàn toàn có thể người sử dụng grep %exceeded 50% nhằm trích toàn cỗ những cảnh bảo khi một node nào là bại liệt dùng vượt lên trên 50% khoáng sản. Cách thực hiện này được chấp nhận tớ tìm ra cả những message vừa lòng ĐK phức tạp như node A dùng vượt lên trên 50% CPU. Tuy nhiên, cách thức này kha khá phức tạp, tốn thời hạn và dễ dàng kéo đến lầm lẫn.

Structured logging

Với structured logging, thay cho lưu tài liệu bên dưới dạng text thường thì, log được lưu với format và đã được quy lăm le trước. Hai message ví dụ nhập phần trước sẽ tiến hành lưu bên dưới dạng tại đây.

{
   "Timestamp":"<timestamp>",
   "Level":"Warning",
   "MessageTemplate":"{ResourceName} percentage exceeded {ResourcePercentage}% for node {NodeName}",
   "Properties":{
      "ResourceName":"CPU Usage",
      "ResourcePercentage": 50,
      "NodeName": "A"
   }
},
{
   "Timestamp":"<timestamp>",
   "Level":"Warning",
   "MessageTemplate":"{ResourceName} percentage exceeded {ResourcePercentage}% for node {NodeName}",
   "Properties":{
      "ResourceName":"Memory Usage",
      "ResourcePercentage": 50,
      "NodeName": "B"
   }
}

Việc dùng structured logging được chấp nhận tớ ghi chép câu query bên trên log như thể query tài liệu nhập DB. VD: nhằm dò thám toàn bộ lưu ý khi node A dùng vượt lên trên 50% CPU, tớ chỉ việc người sử dụng query này NodeName = A and ResourceName = "CPU Usage" and ResourcePercentage > 50. Vì log của tớ với format cố định và thắt chặt nên những ứng dụng dễ dàng xử lý bọn chúng rộng lớn, tớ hoàn toàn có thể dùng nhiều dụng cụ nhằm gọi, phân tách và dò thám đi ra quy luật kể từ log một cơ hội tự động hóa.

Structured logging với Seq

Để tớ tiếp tục dùng Seq, một khối hệ thống logging triệu tập, nhằm test những tác dụng của structured logging. Đường liên kết chuyển vận phiên bản người sử dụng test của Seq ở bên trên phía trên. Ngoài Seq tớ cũng đều có nhiều lựa lựa chọn khác ví như SumoLogic hoặc Datadog.

Sau khi thiết đặt, bám theo khoác lăm le Seq tiếp tục chạy ở cổng 5341. Trang công ty của chính nó như sau.

Tôi vẫn ghi chép sẵn một ứng dụng sinh log tự động hóa, đàng liên kết bên trên phía trên. Các bạn cũng có thể clone repository này và chạy câu mệnh lệnh sau đây muốn tạo 100 message, tớ tiếp tục người sử dụng bọn chúng nhập phần bên dưới.

dotnet lập cập Seq

Sau khi chạy câu mệnh lệnh bên trên, trang Seq tiếp tục như sau.

Chú ý là tuy nhiên tớ đang được dùng structured logging, Seq vẫn hiển thị log tương tự như log truyền thống lịch sử, những tác dụng của structured log chỉ được dùng khi tớ gọi cho tới.

Sau phía trên tớ tiếp tục chạy test một vài query đơn giản và giản dị.

Tìm toàn bộ message khi NodeA người sử dụng vượt lên trên 50% bộ nhớ lưu trữ và toàn cỗ message khi NodeB người sử dụng bên dưới 50& bộ nhớ lưu trữ.

ResourceName='Memory Usage' and ((NodeName='NodeA' and ResourcePercentage > 50) or (NodeName='NodeB' and ResourcePercentage <50))

Thống kê toàn bộ log của NodeB, đối chiếu lượng bộ nhớ lưu trữ và CPU nhưng mà node này dùng nhằm mục đích dò thám đi ra côn trùng tương quan đằm thắm bọn chúng.

select count(*) as Event
from stream
where NodeName='NodeB'
group by ResourceName, time(5s)

Ta cũng hoàn toàn có thể dò thám tìm kiếm vị text tương tự như nhập log truyền thống lịch sử.

"percentage exceeded 8"

Xem thêm: luôn có giáo viên phải mời phụ huynh

Sử dụng Serilog nhằm xuất structured log với C#

Trong bài bác này tớ người sử dụng Serilog nhằm xuất structured log với C#, song tớ cũng hoàn toàn có thể lựa lựa chọn 1 vài ba library khác ví như NLog hoặc Microsoft.Extensions.Logging…

Cài bịa đặt những library cần thiết thiết

Đầu tiên tớ cần thiết mua sắm Serilog.

dotnet add package Serilog --version 2.10.0

Sau bại liệt tớ cần thiết mua sắm một library tương hỗ nhằm dùng Serilog cùng theo với khối hệ thống logging của .Net Chip Core.

dotnet add package Serilog.Extensions.Hosting --version 4.1.2

Ta còn cần thiết thiết đặt những sink, đó là đích nhưng mà tớ tiếp tục ghi log nhập. Trong môi trường xung quanh thực tiễn, tớ tiếp tục dùng khối hệ thống log triệu tập như Seq, song tớ tiếp tục mua sắm tăng nhì sink không giống nhằm ghi log đi ra tệp tin hoặc console.

dotnet add package Serilog.Sinks.Seq --version 5.0.1 // <- Seq sink
dotnet add package Serilog.Sinks.File --version 4.1.0 // <- File sink
dotnet add package Serilog.Sinks.Console --version 3.1.1 // <- Console sink

Thiết lập mang lại Serilog

Tạo một LoggerConfiguration và thiết lập nhằm nó ghi log đi ra server Seq nhưng mà tớ vừa phải thiết đặt nhập phần “.

var configuration = new LoggerConfiguration();
configuration.WriteTo.Seq("http://localhost:5341/"); // <- người sử dụng cổng khoác lăm le của Seq

Dùng LoggerConfiguration muốn tạo Logger và gán nó nhập trở thành ILogger của Serilog.

Log.Logger = configuration.CreateLogger();

Cuối nằm trong tớ tích ăn ý Serilog nhập khối hệ thống log của .Net Chip Core.

services.AddLogging(logBuilder => logBuilder.AddSerilog(dispose: true))

Giờ phía trên tớ hoàn toàn có thể người sử dụng Serilog nhằm ghi structured log.

_logger.Log(LogLevel.Information, "Hello lớn {Name}", "Nguyen Thai Duong");

Kết trái khoáy tiếp tục như sau.

Đối với Seq, log bên trên được lưu bên dưới dạng sau (múi giờ UTC).

{
   "@t":"2021-06-15T13:43:26.3719578Z",
   "@mt":"Hello lớn {Name}",
   "@m":"Hello lớn Nguyen Thai Duong",
   "@i":"8a4e9e4c",
   "Name":"Nguyen Thai Duong",
   "SourceContext":"StructuredLogGenerator.LogGenerator"
}

Xuất log đi ra tệp tin hoặc console

Hệ thống log triệu tập như Seq là biện pháp tốt nhất có thể nhập môi trường xung quanh thực tiễn, song thỉnh thoảng tớ cần thiết xuất log đi ra tệp tin hoặc console nhằm debug.

Để ghi đi ra console, tớ thay đổi LoggerConfiguration trở nên như sau.

var configuration = new LoggerConfiguration();
configuration.WriteTo.Console(); // <- người sử dụng console thực hiện sink

Kết trái khoáy của câu mệnh lệnh.

_logger.Log(LogLevel.Information, "Hello lớn {Name}", "Nguyen Thai Duong");

Sẽ như sau.

Ta hoàn toàn có thể thay đổi format của log nhập console trở nên JSON.

var configuration = new LoggerConfiguration();
configuration.WriteTo.Console(new JsonFormatter()); // <- người sử dụng formatter ở đây

Xem thêm: truyện ngắn ngôn tình hay

Tương tự động bên trên, nhằm xuất log đi ra tệp tin, tớ thay đổi LoggerConfiguration trở nên.

var configuration = new LoggerConfiguration();
configuration.WriteTo.File("C:/duong.log"); // <- xuất log đi ra "C:/duong.log"

Có lẽ chúng ta đã và đang đoán được là tớ hoàn toàn có thể ghi log bên dưới dạng JSON nhập tệp tin.

var configuration = new LoggerConfiguration();
configuration.WriteTo.File(new JsonFormatter(), "C:/duong.log");

Kết thúc

Trên phía trên tất cả chúng ta vẫn test qua chuyện 1 phần cực kỳ nhỏ của structured logging. Tôi kỳ vọng rằng nội dung bài viết này tiếp tục khiến cho những ai ko test qua chuyện structured logging cảm nhận thấy hào hứng nhằm người sử dụng test nó.