/** * 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') } } } |