节点:login文件而不是控制台

我可以configurationconsole.log以便将日志写入文件而不是在控制台中打印吗?

2013年更新 –这是围绕节点v0.2和v0.4写的; 现在有很多更好的实用程序围绕着日志logging。 我强烈推荐温斯顿

2013年末更新 –我们仍然使用winston,但是现在有了一个logging库来包装logging自定义对象和格式的function。 这里是我们的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函数:

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

上面的例子将会logging到debug.log和stdout。

编辑:在这个页面上也可以查看Clément的多参数版本 。

如果你正在寻找生产winston可能是最好的select。

如果你只是想快速做开发的东西,直接输出到一个文件(我认为这只适用于* nix系统):

 nohup node simple-server.js > output.log & 

我经常对console.log()console.error()使用很多参数,所以我的解决scheme是:

 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; 

Winston-logger是一个stream行的用于日志logging的npm模块。

这是一个如何做。
在你的项目中安装winston:

 npm install winston --save 

下面是一个configuration,可以在我的项目中经常使用,作为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; 

然后,您可以将成功logging为:

 successlog.info(`Success Message and variables: ${variable}`); 

和错误为:

 errorlog.error(`Error Message : ${error}`); 

它还将所有成功日志和错误日志logging在日志目录下的日志文件中,如您在此处所看到的。
日志direcotry

如果这是针对某个应用程序的,那么最好使用日志logging模块。 它会给你更多的灵活性。 一些build议。

 const fs = require("fs"); const keys = Object.keys; const Console = 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] = function() { con[key].apply(con, arguments); }; } 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.log是要走的路。 但是为了在需要的模块中工作,还需要导出它。

 module.exports = console; 

为了节省自己编写日志文件,旋转和其他东西的麻烦,你可以考虑使用一个简单的logging器模块,比如winston:

 // Include the logger module var winston = require('winston'); // Set up log file. (you can also define size, rotation etc.) winston.add(winston.transports.File, { filename: 'somefile.log' }); // Overwrite some of the build-in console functions console.error=winston.error; console.log=winston.info; console.info=winston.info; console.debug=winston.debug; console.warn=winston.warn; module.exports = console; 

您现在可以使用Caterpillar这是一个基于stream的日志logging系统,允许您login到其中,然后将输出传送到不同的转换和位置。

输出到一个文件就像:

 var logger = new (require('./').Logger)(); logger.pipe(require('fs').createWriteStream('./debug.log')); logger.log('your log message'); 

卡特彼勒网站上的完整示例

另一个没有提到的解决scheme是通过将Writablestream挂在process.stdoutprocess.stderr 。 这样你就不需要重写所有输出到stdout和stderr 的控制台函数 。 此实现将stdout和stderrredirect到日志文件:

 var log_file = require('fs').createWriteStream(__dirname + '/log.txt', {flags : 'w'}) function hook_stream(stream, callback) { var old_write = stream.write stream.write = (function(write) { return function(string, encoding, fd) { write.apply(stream, arguments) // comments this line if you don't want output in the console callback(string, encoding, fd) } })(stream.write) return function() { stream.write = old_write } } console.log('a') console.error('b') var unhook_stdout = hook_stream(process.stdout, function(string, encoding, fd) { log_file.write(string, encoding) }) var unhook_stderr = hook_stream(process.stderr, function(string, encoding, fd) { log_file.write(string, encoding) }) console.log('c') console.error('d') unhook_stdout() unhook_stderr() console.log('e') console.error('f') 

它应该在控制台中打印

 a b c d e f 

并在日志文件中:

 c d 

欲了解更多信息,请查看这个要点 。

你也可以看看这个npm模块: https ://www.npmjs.com/package/noogger

noogger

简单而直接

直接从控制台上的nodejs的API文档

 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