nodejs 使用winston记录日志(打印文件名和行号)

/**
 * Created by prgma42 on 2022/9/16.
 */
const { createLogger, format, transports } = require('winston');
const fs = require('fs');
const path = require('path');
const dateUtil = require('./date_util');
const env = process.env.NODE_ENV || 'development';
const logDir = 'logs/'+dateUtil.getDateByType('YYYYMMDD');
const PROJECT_ROOT = path.join(__dirname, '..')
// Create the log directory if it does not exist
if (!fs.existsSync(logDir)) {
    fs.mkdirSync(logDir);
}
const filename = path.join(logDir, 'results.log');


const logger = createLogger({
    level: env === 'production' ? 'info' : 'debug',
    format: format.combine(
        format.label({ label: path.basename(process.mainModule.filename) }),
        format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' })
    ),
    transports: [
        new transports.Console({
            format: format.combine(
                format.colorize(),
                format.printf(
                    info =>
                        `${info.timestamp} ${info.level}  ${info.message}`
                )
            )
        }),
        new transports.File({
            filename,
            format: format.combine(
                format.printf(
                    info =>
                        `${info.timestamp} ${info.level}  ${info.message}`
                )
            )
        }),
        new transports.File({
            name:'error_file',
            filename:path.join(logDir,'error.log'),
            level:'error',
            format: format.combine(
                format.printf(
                    info =>
                        `${info.timestamp} ${info.level}  ${info.message}`
                )
            )
        })
    ]
});

//module.exports = logger;

module.exports.debug = module.exports.log = function () {
    logger.debug.apply(logger, formatLogArguments(arguments))
}

module.exports.info = function () {
    logger.info.apply(logger, formatLogArguments(arguments))
}

module.exports.warn = function () {
    logger.warn.apply(logger, formatLogArguments(arguments))
}

module.exports.error = function () {
    logger.error.apply(logger, formatLogArguments(arguments))
}

//module.exports.stream = logger.stream

/**
 * Attempts to add file and line number info to the given log arguments.
 */
function formatLogArguments (args) {
    args = Array.prototype.slice.call(args)

    const stackInfo = getStackInfo(1)
    if (stackInfo) {
        // get file path relative to project root
        const calleeStr = '[' + stackInfo.relativePath + ':' + stackInfo.line + '] '
        let content = '';
        for(var i in args){
           
if (args[i]  instanceof Object) {
    content = content + ' ' + JSON.stringify(args[i]);
}else{
    content = content + ' ' + args[i]
}
        }
        if (content && content.length>0) {
            args[0] = calleeStr + ' ' + content
        } else {
            args.unshift(calleeStr)
        }
    }

    return args
}

/**
 * Parses and returns info about the call stack at the given index.
 */
function getStackInfo (stackIndex) {
    // get call stack, and analyze it
    // get all file, method, and line numbers
    var stacklist = (new Error()).stack.split('\n').slice(3)

    // stack trace format:
    // http://code.google.com/p/v8/wiki/JavaScriptStackTraceApi
    // do not remove the regex expresses to outside of this method (due to a BUG in node.js)
    var stackReg = /at\s+(.*)\s+\((.*):(\d*):(\d*)\)/gi
    var stackReg2 = /at\s+()(.*):(\d*):(\d*)/gi

    var s = stacklist[stackIndex] || stacklist[0]
    var sp = stackReg.exec(s) || stackReg2.exec(s)

    if (sp && sp.length === 5) {
        return {
            method: sp[1],
            relativePath: path.relative(PROJECT_ROOT, sp[2]),
            line: sp[3],
            pos: sp[4],
            file: path.basename(sp[2]),
            stack: stacklist.join('\n')
        }
    }
}

你可能感兴趣的:(nodejs,node.js)