• 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')
            }
        }
    }
    

  • 相关阅读:
    小程序使用腾讯位置插件获取当前位置
    图解辗转相除法求解最大公约数
    【数据结构练习题】消失的数字 --- 三种解法超详解
    操作系统学习笔记2 | 操作系统接口
    基于kolla的openstack在线变更网卡(bond)
    计组——I/O方式
    Maven--如何下载JSONObject相关依赖架包
    信号相干解调
    PyTorch模型定义和相关使用
    Windows字符和字符串处理
  • 原文地址:https://blog.csdn.net/paj123456789/article/details/126903756