我可以配置console.log
,使日志被写入文件而不是在控制台中打印吗?
我可以配置console.log
,使日志被写入文件而不是在控制台中打印吗?
var fs = require('fs');
var util = require('util');
var log_file = fs.createWriteStream(__dirname + '/debug.log', {flags : 'w'});
var log_stdout = process.stdout;
console.log = function(d) { //
log_file.write(util.format(d) + '\n');
log_stdout.write(util.format(d) + '\n');
};
以上示例将记录到debug.log和stdout。
console.log = function (...d) {
log_file.write(util.format(...d) + '\n');
log_stdout.write(util.format(...d) + '\n');
};
- Paulo Victor Duarte更新于2013年-本文是针对Node v0.2和v0.4编写的;现在有更好的日志记录工具可用。我强烈推荐Winston
更新于2013年末-我们仍然使用winston,但现在使用一个日志库来包装自定义对象和格式化的日志记录功能。以下是我们logger.js的示例:https://gist.github.com/rtgibbons/7354879
应该就这么简单。
var access = fs.createWriteStream(dir + '/node.access.log', { flags: 'a' })
, error = fs.createWriteStream(dir + '/node.error.log', { flags: 'a' });
// redirect stdout / stderr
proc.stdout.pipe(access);
proc.stderr.pipe(error);
console.log(whatever);
仍然会输出到控制台,而非文件。 - trusktrprocess.__defineGetter__('stderr', function() { return fs.createWriteStream(__dirname + '/error.log', {flags:'a'}) })
。 - damianb如果您正在寻找生产环境中的内容,winston 可能是最好的选择。
如果您只想快速地进行开发工作,并将输出直接写入文件(我认为这仅适用于*nix系统):
nohup node simple-server.js > output.log &
>
符号重定向标准输出同样有效。但是nohup
命令则不行。 - Bradnohup
也可以愉快地运行此命令:node simple-server.js > output.log
。如果您希望在日志书写时跟踪它,只需运行tail -f output.log
即可。 - nasty pasty我经常在console.log()和console.error()中使用多个参数,我的解决方案是:
var fs = require('fs');
var util = require('util');
var logFile = fs.createWriteStream('log.txt', { flags: 'a' });
// Or 'w' to truncate the file every time the process starts.
var logStdout = process.stdout;
console.log = function () {
logFile.write(util.format.apply(null, arguments) + '\n');
logStdout.write(util.format.apply(null, arguments) + '\n');
}
console.error = console.log;
util.format.apply(null, arguments)
在程序启动时似乎会输出大量数据。就好像它会输出每个必需的对象一样。我不知道该如何停止它,但使用上面的单参方法则不会发生这种情况。 - ZeiWinston 是一个非常流行的 npm 模块,用于记录日志。
以下是使用说明。
在项目中安装 winston:
npm install winston --save
这里是一个开箱即用的配置,在我的项目中经常使用,作为utils下的logger.js。
/**
* Configurations of logger.
*/
const winston = require('winston');
const winstonRotator = require('winston-daily-rotate-file');
const consoleConfig = [
new winston.transports.Console({
'colorize': true
})
];
const createLogger = new winston.Logger({
'transports': consoleConfig
});
const successLogger = createLogger;
successLogger.add(winstonRotator, {
'name': 'access-file',
'level': 'info',
'filename': './logs/access.log',
'json': false,
'datePattern': 'yyyy-MM-dd-',
'prepend': true
});
const errorLogger = createLogger;
errorLogger.add(winstonRotator, {
'name': 'error-file',
'level': 'error',
'filename': './logs/error.log',
'json': false,
'datePattern': 'yyyy-MM-dd-',
'prepend': true
});
module.exports = {
'successlog': successLogger,
'errorlog': errorLogger
};
然后只需根据需要导入,如下所示:
const errorLog = require('../util/logger').errorlog;
const successlog = require('../util/logger').successlog;
然后您可以将成功记录为:
successlog.info(`Success Message and variables: ${variable}`);
并将错误定义为:
errorlog.error(`Error Message : ${error}`);
winston
和winston-daily-rotate-file
)。
它们应该在项目根目录下的名为“logs”的文件夹中创建。
抱歉回复晚了。 - KeshavDulalconst winston = require('winston');
const winstonRotator = require('winston-daily-rotate-file');
并且,在您想记录某些内容的任何地方,都需要添加以下内容:
const errorLog = require('../util/logger').errorlog;
const successlog = require('../util/logger').successlog;
- KeshavDulalconst fs = require("fs");
const {keys} = Object;
const {Console} = console;
/**
* Redirect console to a file. Call without path or with false-y
* value to restore original behavior.
* @param {string} [path]
*/
function file(path) {
const con = path ? new Console(fs.createWriteStream(path)) : null;
keys(Console.prototype).forEach(key => {
if (path) {
this[key] = (...args) => con[key](...args);
} else {
delete this[key];
}
});
};
// patch global console object and export
module.exports = console.file = file;
要使用它,请执行以下操作:
require("./console-file");
console.file("/path/to.log");
console.log("write to file!");
console.error("also write to file!");
console.file(); // go back to writing to stdout
Console.prototype
的键,只需明确设置this.error
即可。 - rich remerconsole.log
。它会改变其行为,但是您可以通过调用 console.file()
恢复旧的行为。 - rich remer对于简单情况,我们可以使用'>'和'2>&1'将标准输出(STDOUT)和标准错误(STDERR)流直接重定向到一个文件(比如test.log)中。
例如:
// test.js
(function() {
// Below outputs are sent to Standard Out (STDOUT) stream
console.log("Hello Log");
console.info("Hello Info");
// Below outputs are sent to Standard Error (STDERR) stream
console.error("Hello Error");
console.warn("Hello Warning");
})();
根据 POSIX 标准,“输入”、“输出”和“错误”流通过正整数“文件描述符”(0、1、2)进行识别。即 stdin 是 0,stdout 是 1,stderr 是 2。如果这是为了一个应用程序,最好使用日志记录模块。它会给你更多的灵活性。以下是一些建议。
如果您正在使用Linux,您还可以使用输出重定向。不确定Windows系统是否可行。
node server.js >> file.log 2>> file.log
>> file.log
用于将 stdout
重定向到文件
2>> file.log
用于将 stderr
重定向到文件
其他人使用缩写 &>>
来同时重定向 stdout
和 stderr
,但我的 Mac 和 Ubuntu 都不支持 :(
额外说明:>
表示覆盖,而 >>
表示追加。
顺便说一下,关于 NodeJS 日志记录器,我使用 pino
+ pino-pretty
记录器。
直接来自nodejs的API文档:Console
const output = fs.createWriteStream('./stdout.log');
const errorOutput = fs.createWriteStream('./stderr.log');
// custom simple logger
const logger = new Console(output, errorOutput);
// use it like console
const count = 5;
logger.log('count: %d', count);
// in stdout.log: count 5