NODEJS | GHI LOG VỚI THƯ VIỆN WINSTON

NODEJS | GHI LOG VỚI THƯ VIỆN WINSTON

I. GIỚI THIỆU.

Winston là gì?

Winston được thiết kế để trở thành một thư viện ghi log  đơn giản và phổ biến với sự hỗ trợ cho nhiều transport. Mỗi logger, winston có thể có nhiều transport được cấu hình ở các level khác nhau. Winston xuất tất cả các log vô console hoặc 1 file cục bộ.

Mục đích của Winston nhằm tách rời các phần của quy trình ghi log để làm cho nó linh hoạt và mở rộng hơn.

Cài đặt.

npm install winston hoặc  yarn add winston.

Cách khai báo vào project.

const winston = require(‘winston’) hoặc import * as winston from ‘winston’.

Winston (ver 3.2.1) có gì mới?.

Những thay đổi mới

  • Top-level winston.* API.
  • Transport.
  • Container và winston.loggers.
  • Logger.
  • Exceptions và xử lý exception.
  • Những thay đổi nhỏ khác.

Nâng cấp winston.format.

  • Xóa bỏ các tùy chọn định dạng winston.Logger.
  • Xóa bỏ các tùy chọn định dạng winston.transports.{File,Console,Http}.
  • Chuyển các bộ lọc và các bộ ghi sang format của winston@3
  • Modularity: winston-transport, logform và nhiều hơn nữa.

Chi tiết.

https://github.com/winstonjs/winston/blob/HEAD/UPGRADE-3.0.md

Cách được đề nghị để sử dụng winston là tạo logger của riêng bạn. Cách đơn giản nhất để làm điều này là sử dụng winston.createLogger.

II. LOGGING.

Các level ghi log trong winston tuân theo thứ tự mức độ nghiêm trọng được chỉ định bởi RFC5424: Mức độ nghiêm trọng của các level được giả định bằng các con sốđược sắp xếp tăng dần từ nghiêm trọng nhất đến ít nghiêm trọng nhất.

 

Thông số

Tên Giá trị mặc định Mô tả
level ‘info’ Chỉ ghi log nếu info.level nhỏ hơn hoặc bằng với level này.
levels winston.config.npm.levels  Các level (và màu sắc) thể hiện mức độ ưu tiên của log.
format winston.format.json Định dạng cho những message của info.
transports [] (No transports) Đặt mục tiêu ghi log cho những message của info.
exitOnError true Nếu false, xử lý ngoại lệ sẽ không dẫn tới process.exit
silent false Nếu true, tất cả log đều bị chặn.

 

Các level cung cấp cho createLogger sẽ được định nghĩa trên logger được trả về như là một phương thức tiện lợi

Bạn có thể thêm hoặc xóa các transport khỏi logger sau khi nó được cung cấp từ winston.createLogger:

 

Thuộc tính bổ sung cho format

Thuộc tính Được thêm bởi Mô tả
splat splat() String interpolation cho kiểu message %d %s.
timestamp timestamp() Thời gian message ghi nhận được.
label label() Custom label liên kết với mỗi message.
ms ms() Số mili giây kể từ log message trước đó.

 

Bạn có thể thêm bất kỳ thuộc tính nào bạn muốn – internal state được duy trì bởi các thuộc tính Symbol:

Symbol.for(‘level’) (READ-ONLY): tương đương với thuộc tính level. Không thay đổi trong toàn bộ code

Symbol.for(‘message’): các chuỗi message hoàn thành được chỉ định bởi “finalizing formats”:

  • json
  • logstash
  • printf
  • prettyPrint
  • simple

Symbol.for(‘splat’): Những đối số string interpolation bổ sung. Được sử dụng bởi định dạng splat().

LƯU Ý: mọi thuộc tính {message} trong một meta object được cung cấp sẽ tự động kết nối với bất kỳ message nào đã được cung cấp: Ví dụ: bên dưới sẽ ghép ‘world’ vào ‘hello’:

 

III. FORMAT

Các format trong winston có thể được truy cập từ winston.format. Chúng được thực hiện trong logform, một module riêng biệt từ winston. Điều này cho phép linh hoạt khi viết những transport của riêng bạn, trong trường hợp bạn muốn thêm một default format với transport của bạn.

Nếu bạn muốn format log của mình, winston.format.printf là dành cho bạn:

 

Kết hợp các format.

Bất kỳ số lượng nào của format cũng có thể được kết hợp thành một format bằng cách sử dụng format.combine.

 

String interpolation.

Phương thức ghi log cung cấp cho việc string interpolation bằng cách sử dụng util.format. Nó cần được kích hoạt bằng format.splat().

 

IV. LOGGING LEVELS.

Mỗi level được ưu tiên bằng một số nguyên cụ thể. Level ưu tiên càng cao thì tầm quan trọng của message sẽ càng cao, và ngược lại. Ví dụ, như được chỉ định chính xác trong RFC5424, các level ghi log hệ thống được ưu tiên từ 0 đến 7 (cao nhất đến thấp nhất).

 

Tương tự, các level ghi log npm được ưu tiên từ 0 đến 5 (cao nhất đến thấp nhất):

 

Sử dụng logging levels.

 

Sử dụng logging levels tùy chỉnh.

 

V. TRANSPORTS.

Có thể sử dụng nhiều transport cùng loại, ví dụ: winston.transports.File khi bạn xây dựng transport.

 

Nếu sau này bạn muốn loại bỏ một trong những transport này, bạn có thể thực hiện bằng cách sử dụng chính transport đó.

 

VI. EXCEPTIONS.

Xử lý các trường hợp exception chưa được xử lý bằng winston.

Với winston, có thể catch và ghi log các sự kiện unceptionException từ các xử lý của bạn. Với  logger của riêng bạn, bạn có thể kích hoạt hành vi này khi nó được tạo hoặc trong vòng đời ứng dụng của bạn sau này:

 

Nếu bạn muốn sử dụng tính năng này với logger mặc định, chỉ cần gọi .exceptions.handle() với một transport instance.

 

Exit hoặc không Exit.

Theo mặc định, winston sẽ exit sau khi ghi log một unsceptionException. Nếu đây không phải là hành vi bạn muốn, hãy đặt exitOnError = false

 

Khi làm việc với logger tùy chỉnh, bạn có thể chuyển các transport đến các thuộc tính exceptionHandlers riêng biệt hoặc đặt handleExceptions trên bất kỳ transport nào.

Ví dụ 1

 

Ví dụ 2

 

VII. TRUY VẤN LOG.

Winston hỗ trợ truy vấn các log với các tùy chọn giống như Loggly. Cụ thể: File, Couchdb, Redis, Loggly, Nssocket, and Http.

 

VIII. ÁP DỤNG VÀO PROJECT.

Cài đặt winston.

 

Tạo file winston.ts.

 

Ghi log.

 

Kiểm thử.

Sử dụng PostMan để chạy api với đường dẫn là http://localhost:8081/v1/user/1 (Id tồn tại).

 

Sử dụng PostMan để chạy api với đường link là http://localhost:8081/v1/user/2 (Id không tồn tại).

IX. TÀI LIỆU THAM KHẢO.