我的文件夹结构如下
- 原木
- 2023-07
- info-2023-07-20.log
- info-2023-07-21.log
其中日志是在根目录和使用温斯顿我添加日志到日志文件,文件自动更改使用温斯顿每日旋转文件包,但我也想改变目录时,月份得到的改变这是不工作,我必须重新启动我的服务器,让它工作,否则它只是附加到以前创建的旧文件夹.
下面是我的代码库,我如何设置我的日志。(logger.js)
const fs = require('fs')
const winston = require('winston')
const { format, transports } = winston
const { colorize, combine, timestamp, printf, splat, errors } = format
require('winston-daily-rotate-file')
if (!fs.existsSync('logs/')) {
fs.mkdirSync('logs/')
}
const todayDate = new Date()
const currentMonth = ('0' + (todayDate.getMonth() + 1)).slice(-2)
const logDir = `logs/${todayDate.getFullYear()}-${currentMonth}` // Directory path for logs.
// month + 1 is because first month starts with 0
if (!fs.existsSync(logDir)) {
fs.mkdirSync(logDir)
}
const logFormat = combine(
timestamp({ format: 'HH:mm:ss' }),
splat(),
errors({ stack: true }),
printf(({ timestamp, level, message, stack }) => {
return `${timestamp},${global.isBackgroundServer ? ` [BG]:` : ''}${
process.env.NODE_ENV === 'development' ? ` ${level}:` : ''
} ${typeof message === 'object' ? JSON.stringify(message) : message}${stack ? `, Stack: ${stack}` : ''}`
}),
)
const defaultLoggerOptions = {
format: logFormat,
}
const infoTransport = new transports.DailyRotateFile({
...defaultLoggerOptions,
level: 'info',
filename: logDir + '/Info-%DATE%.log',
})
const errorTransport = new transports.DailyRotateFile({
...defaultLoggerOptions,
level: 'error',
filename: logDir + '/Error-%DATE%.log',
})
const warningTransport = new transports.DailyRotateFile({
...defaultLoggerOptions,
level: 'debug',
filename: logDir + '/Warning-%DATE%.log',
})
const consoleTransport = new transports.Console({
format: combine(colorize(), logFormat),
})
const errorLogger = winston.createLogger({
transports: [consoleTransport, errorTransport],
})
const successLogger = winston.createLogger({
transports: [consoleTransport, infoTransport],
})
const warningLogger = winston.createLogger({
transports: [consoleTransport, warningTransport],
})
const transportConsoleToWinston = () => {
const getArgumentsStr = (arguments) => {
return Array.prototype.slice.call(arguments).join(' ')
}
const wrappedSuccessLogger = (...args) => successLogger.log.apply(successLogger, ['info', getArgumentsStr(args)])
const wrappedWarningLogger = (...args) => warningLogger.log.apply(warningLogger, ['warn', getArgumentsStr(args)])
const wrappedDebugLogger = (...args) => warningLogger.log.apply(warningLogger, ['debug', getArgumentsStr(args)])
console.log = wrappedSuccessLogger
console.info = wrappedSuccessLogger
console.warn = wrappedWarningLogger
console.debug = wrappedDebugLogger
console.error = (...args) => errorLogger.error.call(errorLogger, ...args)
}
module.exports = { errorLogger, successLogger, warningLogger, transportConsoleToWinston }
字符串
3条答案
按热度按时间xmq68pz91#
在撰写本文时,您无法在运行时更改
dirName
和fileName
属性。因此,您需要每个月创建一个新的传输,同时每天创建(旋转)一个新文件。我会这么做它依赖于每天自动发生的旋转事件。如果还没有包含当前年份/月份的文件夹,这意味着我们正在更改月份,因此只需创建一个文件夹并更新传输(请参阅评论):字符串
hgb9j2n62#
对于这个问题,我有一个简单的想法,我认为值得一试,我们可以使用setTimeout和setInterval来创建logger:
字符串
gab6jxml3#
问题
您的代码只为logs文件夹创建一次名称,以后不再更改它。
解决方案
好吧,
winston-daily-rotate-file
不提供为dirname
选项使用占位符的方式,它为filename
选项所做的方式,你只能使用完整的日期占位符%DATE%
。所以我们每个月都要手动重新创建记录器。以下是许多方法中的一种:字符串
说明
代码的大部分被 Package 到
createLoggers
函数中。准确地说,是负责创建日志功能的更改部分的部分。而且里面还加了一个小块:型
该块负责计算下个月的开始,并再次调度
createLoggers
的调用。可能出现的问题