我是否可以配置console.log,以便将日志写入文件,而不是打印在控制台中?
当前回答
2013年更新-这是在Node v0.2和v0.4左右编写的;现在有关于日志的更好的实用程序。我强烈推荐温斯顿
2013年底更新-我们仍然使用温斯顿,但现在有一个记录器库来包装自定义对象和格式的日志记录功能。下面是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);
其他回答
Winston是一个非常流行的用于日志记录的npm模块。
这里有一个操作指南。 在你的项目中安装温斯顿:
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}`);
它还将所有的成功日志和错误日志记录在logs目录下的一个文件中,如您在这里看到的那样。
大多数记录器是过量的,不支持console.log中的正确构建。因此我创建了console-log-to-file:
import { consoleLogToFile } from "console-log-to-file";
// or `const { consoleLogToFile } = require("console-log-to-file/dist/index.cjs.js")`
consoleLogToFile({
logFilePath: "/log/default.log",
});
// all of your console.log/warn/error/info will work as it does and save to file now.
方法stdout和stderr
这种方法可以帮助您(我在我的项目中使用类似的方法),并且适用于所有方法,包括console.log、console。警告说,控制台。错误,console.info
该方法将写入stdout和stderr的字节写入文件。比更改console.log, console.log更好。警告说,控制台。错误,console.info方法,因为输出将与此方法的输出完全相同
var fs= require("fs")
var os= require("os")
var HOME= os.homedir()
var stdout_r = fs.createWriteStream(HOME + '/node.stdout.log', { flags: 'a' })
var stderr_r = fs.createWriteStream(HOME + '/node.stderr.log', { flags: 'a' })
var attachToLog= function(std, std_new){
var originalwrite= std.write
std.write= function(data,enc){
try{
var d= data
if(!Buffer.isBuffer(d))
d= Buffer.from(data, (typeof enc === 'string') ? enc : "utf8")
std_new.write.apply(std_new, d)
}catch(e){}
return originalwrite.apply(std, arguments)
}
}
attachToLog(process.stdout, stdout_r)
attachToLog(process.stderr, stderr_r)
// recommended catch error on stdout_r and stderr_r
// stdout_r.on("error", yourfunction)
// stderr_r.on("error", yourfunction)
对于简单的情况,我们可以使用'>'和'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");
})();
节点test.js > test.log 2>&1 .log
根据POSIX标准,“输入”、“输出”和“错误”流由正整数文件描述符(0,1,2)标识,即stdin为0,stdout为1,stderr为2。
步骤1:'2>&1'将从2 (stderr)重定向到1 (stdout) 步骤2:'>'将从1 (stdout)重定向到文件(test.log)
您现在可以使用Caterpillar,这是一个基于流的日志记录系统,允许您登录它,然后将输出输出到不同的转换和位置。
输出到一个文件很简单:
var logger = new (require('./').Logger)();
logger.pipe(require('fs').createWriteStream('./debug.log'));
logger.log('your log message');
卡特彼勒网站上的完整示例
推荐文章
- 如何配置slf4j-simple
- 如何在Python中记录源文件名称和行号
- ReferenceError: description没有定义NodeJs
- console.log()和console.debug()的区别?
- MongoDB记录所有查询
- 将一个二进制的NodeJS Buffer转换为JavaScript的ArrayBuffer
- 如何禁用标准错误流的日志记录?
- AngularJS只适用于单页应用程序吗?
- 如何跟踪log4net问题
- 如何在vue-cli项目中更改端口号
- 在没有事件源注册的情况下写入Windows应用程序事件日志
- 同步和异步编程(在node.js中)的区别是什么?
- 如何编辑通过npm安装的节点模块?
- “node_modules”文件夹应该包含在git存储库中吗
- 使用package.json在全局和本地安装依赖项