Có hai tiến bộ cơ bản với cách tiếp cận có cấu trúc không thể được mô phỏng bằng nhật ký văn bản mà không cần (đôi khi mức độ cực đoan).
Các loại sự kiện
Khi bạn viết hai sự kiện với log4net như:
log.Debug("Disk quota {0} exceeded by user {1}", 100, "DTI-Matt");
log.Debug("Disk quota {0} exceeded by user {1}", 150, "nblumhardt");
Chúng sẽ tạo ra văn bản tương tự:
Disk quota 100 exceeded by user DTI-Matt
Disk quota 150 exceeded by user nblumhardt
Nhưng, liên quan đến xử lý máy móc, chúng chỉ là hai dòng văn bản khác nhau.
Bạn có thể muốn tìm tất cả các sự kiện "vượt quá hạn ngạch đĩa", nhưng trường hợp đơn giản tìm kiếm sự kiện like 'Disk quota%'
sẽ rơi xuống ngay khi một sự kiện khác xảy ra như sau:
Disk quota 100 set for user DTI-Matt
Ghi nhật ký văn bản sẽ loại bỏ thông tin ban đầu chúng ta có về nguồn gốc của sự kiện và điều này phải được xây dựng lại khi đọc nhật ký thường với các biểu thức khớp ngày càng phức tạp hơn.
Ngược lại, khi bạn viết hai sự kiện Serilog sau:
log.Debug("Disk quota {Quota} exceeded by user {Username}", 100, "DTI-Matt");
log.Debug("Disk quota {Quota} exceeded by user {Username}", 150, "nblumhardt");
Chúng tạo ra đầu ra văn bản tương tự như phiên bản log4net, nhưng đằng sau hậu trường, "Disk quota {Quota} exceeded by user {Username}"
mẫu thông báo được thực hiện bởi cả hai sự kiện.
Với một mức chìm phù hợp, sau này bạn có thể viết các truy vấn where MessageTemplate = 'Disk quota {Quota} exceeded by user {Username}'
và nhận chính xác các sự kiện vượt quá hạn ngạch đĩa.
Không phải lúc nào cũng thuận tiện để lưu trữ toàn bộ mẫu thông báo với mọi sự kiện nhật ký, do đó, một số chìm băm mẫu tin nhắn thành một EventType
giá trị số (ví dụ 0x1234abcd
), hoặc, bạn có thể thêm một enricher vào đường dẫn ghi nhật ký để tự làm điều này .
Nó tinh tế hơn sự khác biệt tiếp theo bên dưới, nhưng mạnh mẽ hơn khi xử lý khối lượng nhật ký lớn.
Dữ liệu có cấu trúc
Một lần nữa xem xét hai sự kiện về việc sử dụng không gian đĩa, có thể dễ dàng sử dụng nhật ký văn bản để truy vấn cho một người dùng cụ thể like 'Disk quota' and like 'DTI-Matt'
.
Nhưng, chẩn đoán sản xuất không phải lúc nào cũng đơn giản. Hãy tưởng tượng bạn cần tìm các sự kiện vượt quá dung lượng đĩa dưới 125 MB?
Với Serilog, điều này có thể xảy ra ở hầu hết các bồn rửa bằng cách sử dụng một biến thể:
Quota < 125
Xây dựng loại truy vấn này từ một biểu thức thông thường là có thể, nhưng nó trở nên mệt mỏi nhanh chóng và thường kết thúc là một biện pháp cuối cùng.
Bây giờ thêm vào đây một loại sự kiện:
Quota < 125 and EventType = 0x1234abcd
Bạn bắt đầu thấy ở đây làm thế nào các khả năng này kết hợp một cách đơn giản để làm cho việc gỡ lỗi sản xuất với nhật ký cảm thấy giống như một hoạt động phát triển hạng nhất.
Một lợi ích nữa, có lẽ không dễ gì ngăn chặn được, nhưng một khi việc gỡ lỗi sản xuất đã được gỡ bỏ khỏi vùng đất của regex, các nhà phát triển bắt đầu coi trọng nhật ký hơn rất nhiều và quan tâm và cân nhắc hơn khi viết chúng. Nhật ký tốt hơn -> ứng dụng chất lượng tốt hơn -> hạnh phúc hơn xung quanh.