WSyslog.mjs

import path from 'path'
import { fileURLToPath } from 'url'
import get from 'lodash-es/get.js'
import isestr from 'wsemi/src/isestr.mjs'
import pino from 'pino'


//__dirname
let __filename = fileURLToPath(import.meta.url)
let __dirname = path.dirname(__filename)


/**
 * 輸出log
 *
 * @class
 * @param {Object} [opt={}] 輸入設定物件,預設{}
 * @param {String} [opt.fdLog='./_logs'] 輸入儲存log資料夾字串,預設'./_logs'
 * @param {String} [opt.interval='day'] 輸入儲存log時分檔模式字串,可選'day'、'hr',分別代表每日或每時分檔,預設'day'
 * @returns {Object} 回傳log物件,提供info、warn、error紀錄函數
 * @example
 * import fs from 'fs'
 * import _ from 'lodash-es'
 * import w from 'wsemi'
 * import WSyslog from './src/WSyslog.mjs'
 *
 * w.fsCleanFolder('./_logs')
 *
 * let log = WSyslog()
 * log.info({ event: 'runner', msg: 'start' })
 * log.warn({ event: 'monitor-memory', msg: 'usage-high', ratio: 85.4 })
 * log.error({ event: 'crash', msg: 'db connection', code: 500 })
 *
 * await w.delay(2000) //等待2秒讓pino能flush數據
 *
 * let vpfs = w.fsTreeFolder('./_logs')
 * // console.log('vpfs', vpfs)
 *
 * let fp = _.get(vpfs, `0.path`, '')
 *
 * let jj = fs.readFileSync(fp, 'utf8')
 * console.log(jj)
 * // {"level":30,"time":1751780174415,"pid":24144,"hostname":"DESKTOP-6R7USAO","event":"runner","msg":"start"}
 * // {"level":40,"time":1751780174415,"pid":24144,"hostname":"DESKTOP-6R7USAO","event":"monitor-memory","msg":"usage-high"}
 * // {"level":50,"time":1751780174415,"pid":24144,"hostname":"DESKTOP-6R7USAO","event":"crash","msg":"db connection","code":500}
 *
 */
function WSyslog(opt = {}) {

    //fdLog
    let fdLog = get(opt, 'fdLog')
    if (!isestr(fdLog)) {
        fdLog = './_logs'
    }

    //interval
    let interval = get(opt, 'interval')
    if (interval !== 'day' && interval !== 'hr') {
        interval = 'day'
    }

    // 建立 logger,使用自訂 transport
    let transport = pino.transport({
        targets: [
            {

                // fatal: 60
                // error: 50
                // warn: 40
                // info: 30
                // debug: 20
                // trace: 10
                level: 'info', //僅紀錄info(30)以上

                target: path.resolve(__dirname, './formatter.mjs'),

                options: {
                    interval,
                    logDir: fdLog,
                },

            },
        ]
    })

    //log
    let log = pino(transport)
    // console.log('log', log)

    return log
}


export default WSyslog