log4js node

node log4js 入門

曾建淞 2020/12/24 15:41:18
162
nodeJs 自己的 log 輸出一堆訊息,要從這麼多又雜的訊息中找出問題,是件非常辛苦的事情。log4js 是一款基於 Node 環境下較好用的 log 模組,本篇簡單介紹 log4js 的使用方式。
 
安裝:
yarn add log4js
 
基本使用方式:
const log4js = require('log4js');

const logger = log4js.getLogger()
logger.level = 'all'

logger.trace('Some trace messages')
logger.debug('Some debug messages')
logger.info('Some info messages')
logger.warn('Some warn messages')
logger.error('Some error messages')
logger.fatal('Some fatal messages')
 
輸出結果:
[2020-12-23T06:16:26.738] [TRACE] default - Some trace messages
[2020-12-23T06:16:26.741] [DEBUG] default - Some debug messages
[2020-12-23T06:16:26.741] [INFO] default - Some info messages
[2020-12-23T06:16:26.741] [WARN] default - Some warn messages
[2020-12-23T06:16:26.741] [ERROR] default - Some error messages
[2020-12-23T06:16:26.741] [FATAL] default - Some fatal messages
 
這裡需要注意 log 預設的 level 是 off,不會輸出任何資訊,輸出時可以設定的 level 如下圖。
 
 
調整 log level 為 all,並輸出 info 的 log,可以看到類別的 log,使用 log4js.getLogger([category]) 默認會有 default 的 log,還可以為每個類別指定 log 輸出的等級,這裡設定為 info 等級。
const log4js = require('log4js');

const logger = log4js.getLogger()
logger.level = 'all'
logger.info('Some info messages', 'append', 'more')

const cheseLogger = log4js.getLogger('cheese')
cheseLogger.level = 'all'
cheseLogger.info('Cheese is Comte.')
 
輸出結果:
[2020-12-23T06:20:47.880] [INFO] default - Some info messages append more
[2020-12-23T06:20:47.884] [INFO] cheese - Cheese is Comte.
 
 
自訂配置可同時輸出到指定檔案跟 command line:
 
appender
定義 log 的輸出介面,較常用的 appender 有兩種:
1.stdout 或 stderr:將 log 輸出到彩色指令介面,前者為預設的 appender
2.file:將 log 輸出到檔案,可以指定單一 log 檔案的大小、備份數量等
filename:檔案名稱
maxLogSize:單一檔案容量大小,默認無上限
backups:保留的文件數量,默認為 5
compress:是否壓縮檔案(.gz)
keepFileExt:沿用副檔名(如:xxx.ext.1更改為xxx.1.ext)
encoding:默認值為 utf-8
 
category
category 指的是 log 輸出時的選項,通常使用 log4js.getLogger() 拿到 log4js 系統中預設的 log,通過指定的名稱來取得配置檔案中相應的 log。配置時可以有多個 category ,每個 category 中可以有多個 appender 。
 
const log4js = require('log4js');

log4js.configure({
  appenders: {
    out: { type: 'stdout' },
    app: { type: 'file', filename: 'application.log' }
  },
  categories: {
    default: { appenders: ['out', 'app'], level: 'debug' }
  }
})

const logger = log4js.getLogger()
logger.level = 'all'

logger.trace('Some trace messages')
logger.debug('Some debug messages')
logger.info('Some info messages')
logger.warn('Some warn messages')
logger.error('Some error messages')
logger.fatal('Some fatal messages')
 
輸出結果:
[2020-12-23T23:14:22.308] [TRACE] default - Some trace messages
[2020-12-23T23:14:22.311] [DEBUG] default - Some debug messages
[2020-12-23T23:14:22.311] [INFO] default - Some info messages
[2020-12-23T23:14:22.311] [WARN] default - Some warn messages
[2020-12-23T23:14:22.311] [ERROR] default - Some error messages
[2020-12-23T23:14:22.311] [FATAL] default - Some fatal messages
 
 
其他特殊自訂模式:
log 輸出時還可以配置自己喜歡樣式,如:顏色、field 格式、時間格式..等。
field:%[padding].[truncation][field]{[format]}
1. padding:需要幾個空白字元
2. truncation:最大字數,超過會被截斷
3. field:字段名稱
4. format:字段選項
%m:輸出程式碼中指定的訊息
%p:輸出優先順序,即DEBUG,INFO,WARN,ERROR,FATAL 
%r:輸出自應用啟動到輸出該log資訊耗費的毫秒數 
%c:輸出所屬的類目,通常就是所在類的全名 
%t:輸出產生該日誌事件的執行緒名 
%n:輸出一個回車換行符,Windows平臺為“\r\n”,Unix平臺為“\n” 
%d:輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},輸出類似:2002年10月18日  22 : 10 : 28 , 921  
%l:輸出日誌事件的發生位置,包括類目名、發生的執行緒,以及在程式碼中的行數。舉例:Testlog4.main(TestLog4.java: 10 ) 
 
const log4js = require('log4js');

log4js.configure({
  appenders: {
    out: { type: 'stdout', layout: { type: 'pattern', pattern: '%d %[%5p%] %c %m' } },
    app: { type: 'dateFile', filename: 'application.log', pattern: '.yyyyMMdd-hhmmss' }
  },
  categories: {
    default: { appenders: ['out'], level: 'debug' },
    custom: {appenders: ["out", "app"], level: "all"}
  }
})


const logger = log4js.getLogger()
logger.level = 'all'

logger.trace('Some trace messages')
logger.debug('Some debug messages')
logger.info('Some info messages')
logger.warn('Some warn messages')
logger.error('Some error messages')
logger.fatal('Some fatal messages')
 
輸出結果:
2020-12-24T00:38:38.210 TRACE default Some trace messages
2020-12-24T00:38:38.213 DEBUG default Some debug messages
2020-12-24T00:38:38.213  INFO default Some info messages
2020-12-24T00:38:38.213  WARN default Some warn messages
2020-12-24T00:38:38.213 ERROR default Some error messages
2020-12-24T00:38:38.213 FATAL default Some fatal messages
 
 
 
參考:
 
曾建淞