小智 165
您也可以重载默认的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');
};
Run Code Online (Sandbox Code Playgroud)
上面的示例将记录到debug.log和stdout.
编辑: 请参阅此页面上的Clément多参数版本.
Rya*_*ons 67
2013年更新 -这是围绕Node v0.2和v0.4编写的; 现在有更好的实用程序围绕日志记录.我强烈推荐温斯顿
更新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);
Run Code Online (Sandbox Code Playgroud)
ale*_*lex 57
如果您正在寻找生产中的东西,温斯顿可能是最好的选择.
如果你只是想快速做dev开发,直接输出到文件(我认为这只适用于*nix系统):
nohup node simple-server.js > output.log &
Run Code Online (Sandbox Code Playgroud)
小智 52
我经常使用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;
Run Code Online (Sandbox Code Playgroud)
kes*_*lal 28
Winston是一个非常流行的npm模块,用于日志记录.
这是一个操作方法.
在您的项目中安装winston:
npm install winston --save
Run Code Online (Sandbox Code Playgroud)
这是一个可以在我的项目中经常使用的开箱即用的配置,如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
};
Run Code Online (Sandbox Code Playgroud)
然后只需在需要的地方导入:
const errorLog = require('../util/logger').errorlog;
const successlog = require('../util/logger').successlog;
Run Code Online (Sandbox Code Playgroud)
然后您可以将成功记录为:
successlog.info(`Success Message and variables: ${variable}`);
Run Code Online (Sandbox Code Playgroud)
和错误:
errorlog.error(`Error Message : ${error}`);
Run Code Online (Sandbox Code Playgroud)
它还会将所有成功日志和错误日志记录在日志目录下的日志目录中,如此处所示.
ric*_*mer 13
const 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;
Run Code Online (Sandbox Code Playgroud)
要使用它,请执行以下操作:
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
Run Code Online (Sandbox Code Playgroud)
Mon*_*Mon 11
如果您使用的是 Linux,还可以使用输出重定向。不确定 Windows 的情况。
node server.js >> file.log 2>> file.log
Run Code Online (Sandbox Code Playgroud)
>> file.log
重定向stdout
到该文件
2>> file.log
重定向stderr
到该文件
其他人都使用and&>>
的简写,但我的 mac 和 ubuntu 都不接受它:(stdout
stderr
extra: >
覆盖,同时>>
追加。
顺便说一句,关于 NodeJS 记录器,我使用pino
+pino-pretty
记录器
Mar*_*rco 10
如果这是针对应用程序的,那么最好使用日志记录模块.它会给你更多的灵活性.一些建议.
直接来自控制台上的 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
Run Code Online (Sandbox Code Playgroud)
对于简单的情况,我们可以使用'>'和'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");
})();
Run Code Online (Sandbox Code Playgroud)
节点 test.js > test.log 2>&1
根据 POSIX 标准,“输入”、“输出”和“错误”流由正整数文件描述符(0、1、2)标识。即,stdin 为 0,stdout 为 1,stderr 为 2。
第 1 步:'2>&1'将从 2 ( stderr )重定向到 1 ( stdout )
第 2 步:“>”将从 1 ( stdout )重定向到文件 ( test.log )
覆盖 console.log 是要走的路。但是为了让它在所需的模块中工作,您还需要导出它。
module.exports = console;
Run Code Online (Sandbox Code Playgroud)
为了省去编写日志文件、旋转等的麻烦,你可以考虑使用一个简单的记录器模块,比如 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;
Run Code Online (Sandbox Code Playgroud)
另一个尚未提及的解决方案是将Writable
流挂在process.stdout
和中process.stderr
。这样,您无需覆盖输出到stdout和stderr的所有控制台功能。此实现将stdout和stderr都重定向到日志文件:
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')
Run Code Online (Sandbox Code Playgroud)
它应该在控制台中打印
a
b
c
d
e
f
Run Code Online (Sandbox Code Playgroud)
并在日志文件中:
c
d
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请检查此要点。
归档时间: |
|
查看次数: |
212779 次 |
最近记录: |