温斯顿记录器抛出 ENOENT
Winston logger throws ENOENT
我的代码:
import winston from 'winston';
Meteor.startup(() => {
const env = process.env.NODE_ENV || 'development';
const tsFormat = () => (new Date()).toLocaleTimeString();
const logDir = 'log';
const logger1 = new (winston.Logger)({
transports: [
// colorize the output to the console
new (winston.transports.Console)({
timestamp: tsFormat,
colorize: true,
level: 'info',
}),
new (winston.transports.File)({
filename: `${logDir}/results.log`,
timestamp: tsFormat,
level: env === 'development' ? 'debug' : 'info',
}),
],
});
logger1.info('Hello world');
//logger1.warn('Warning message');
//logger1.debug('Debugging info');
});
输出:
I20170717-11:39:11.027(2)? 11:39:10 - info: Hello world
W20170717-11:39:11.150(2)? (STDERR)
W20170717-11:39:11.151(2)? (STDERR) events.js:72
W20170717-11:39:11.152(2)? (STDERR) throw er; // Unhandled 'error' event
W20170717-11:39:11.152(2)? (STDERR) ^
W20170717-11:39:11.153(2)? (STDERR) Error: ENOENT, open 'log/results.log'
甚至没有创建 results.log
更新:当我只使用没有路径的文件名时,它可以工作。
相关但无助于解决:
Node.js, can't open files. Error: ENOENT, stat './path/to/file'
有什么问题?
Winston 实际上并没有创建您希望日志文件所在的目录,这就是您获得 ENOENT
.
的原因
(我对 Meteor 不是很熟悉,但下面的说明适用于 "plain" Node.js)
您可以在实例化 Winston 之前手动创建目录以确保它存在,使用 fs.mkdirSync
,尽管这只会深入一层(它不会创建中间目录,如果路径)。
还有 mkdirp.sync()
, 创建中间目录。
使用同步版本要容易一些,因为它是在应用程序启动期间只发生一次的操作,所以不是瓶颈。
我的代码:
import winston from 'winston';
Meteor.startup(() => {
const env = process.env.NODE_ENV || 'development';
const tsFormat = () => (new Date()).toLocaleTimeString();
const logDir = 'log';
const logger1 = new (winston.Logger)({
transports: [
// colorize the output to the console
new (winston.transports.Console)({
timestamp: tsFormat,
colorize: true,
level: 'info',
}),
new (winston.transports.File)({
filename: `${logDir}/results.log`,
timestamp: tsFormat,
level: env === 'development' ? 'debug' : 'info',
}),
],
});
logger1.info('Hello world');
//logger1.warn('Warning message');
//logger1.debug('Debugging info');
});
输出:
I20170717-11:39:11.027(2)? 11:39:10 - info: Hello world
W20170717-11:39:11.150(2)? (STDERR)
W20170717-11:39:11.151(2)? (STDERR) events.js:72
W20170717-11:39:11.152(2)? (STDERR) throw er; // Unhandled 'error' event
W20170717-11:39:11.152(2)? (STDERR) ^
W20170717-11:39:11.153(2)? (STDERR) Error: ENOENT, open 'log/results.log'
甚至没有创建 results.log
更新:当我只使用没有路径的文件名时,它可以工作。
相关但无助于解决:
Node.js, can't open files. Error: ENOENT, stat './path/to/file'
有什么问题?
Winston 实际上并没有创建您希望日志文件所在的目录,这就是您获得 ENOENT
.
(我对 Meteor 不是很熟悉,但下面的说明适用于 "plain" Node.js)
您可以在实例化 Winston 之前手动创建目录以确保它存在,使用 fs.mkdirSync
,尽管这只会深入一层(它不会创建中间目录,如果路径)。
还有 mkdirp.sync()
, 创建中间目录。
使用同步版本要容易一些,因为它是在应用程序启动期间只发生一次的操作,所以不是瓶颈。