Node.js 向所有控制台消息添加时间戳
我有一个完整的、已部署的、基于Express的项目,整个项目中有许多console.log()和console.error()语句。 项目使用forever运行,将stdout和stderr定向到两个单独的文件 这一切都运行得很好,但现在我缺少了时间戳,无法准确地知道错误发生的时间 我可以在我的代码中进行某种搜索/替换,或者使用一些npm模块覆盖每个文件中的控制台,但我不想接触每个模型/路由文件,除非我必须这样做Node.js 向所有控制台消息添加时间戳,node.js,express,console,Node.js,Express,Console,我有一个完整的、已部署的、基于Express的项目,整个项目中有许多console.log()和console.error()语句。 项目使用forever运行,将stdout和stderr定向到两个单独的文件 这一切都运行得很好,但现在我缺少了时间戳,无法准确地知道错误发生的时间 我可以在我的代码中进行某种搜索/替换,或者使用一些npm模块覆盖每个文件中的控制台,但我不想接触每个模型/路由文件,除非我必须这样做 有没有一种方法,也许是一种快速中间件,可以让我在每次通话中都添加一个时间戳,或者我
有没有一种方法,也许是一种快速中间件,可以让我在每次通话中都添加一个时间戳,或者我必须手动添加时间戳?这不是一个直接的答案,但您是否查看过winston.js?它有更多的日志记录选项,包括登录到json文件或数据库。默认情况下,它们始终具有时间戳。只是一个想法。创建一个包含以下内容的文件:
var log = console.log;
console.log = function(){
log.apply(console, [Date.now()].concat(arguments));
};
在你登录任何东西之前,在你的应用程序中需要它。对控制台执行相同的操作。错误(如果需要)
请注意,如果您正在使用变量插入(console.log(“he%s”,“y”)/“hey”
),此解决方案将破坏变量插入。如果需要,只需先记录时间戳:
log.call(console, Date.now());
log.apply(console, arguments);
事实证明,您可以覆盖app.js文件顶部的控制台功能,并使其在其他模块中生效。我得到的结果好坏参半,因为我的一个模块被分叉为
子进程
。一旦我将行复制到该文件的顶部,所有工作都正常
为了记录,我安装了模块控制台戳记(npm安装控制台戳记--save
),并在app.js和childProcess.js的顶部添加了这一行:
// add timestamps in front of log messages
require('console-stamp')(console, '[HH:MM:ss.l]');
我现在的问题是connect logger的:date
格式使用UTC格式,而不是我在其他控制台调用中使用的格式。通过注册我自己的时间格式(作为一个副作用,需要控制台戳记附带的dateformat
模块,而不是安装另一个模块),可以很容易地解决这个问题:
现在,我的日志文件看起来有条理(更好的是,可以解析):
您可以从中使用函数util.log
请注意,自版本6.0.0以来,它已被弃用
对于更高版本,您应该也可以使用该软件包。它非常简单,并且可以自定义。如果您想要一个没有其他外部依赖项的解决方案,但希望保留console.log(多参数,变量插入)的全部功能,则可以使用以下代码:
var log = console.log;
console.log = function () {
var first_parameter = arguments[0];
var other_parameters = Array.prototype.slice.call(arguments, 1);
function formatConsoleDate (date) {
var hour = date.getHours();
var minutes = date.getMinutes();
var seconds = date.getSeconds();
var milliseconds = date.getMilliseconds();
return '[' +
((hour < 10) ? '0' + hour: hour) +
':' +
((minutes < 10) ? '0' + minutes: minutes) +
':' +
((seconds < 10) ? '0' + seconds: seconds) +
'.' +
('00' + milliseconds).slice(-3) +
'] ';
}
log.apply(console, [formatConsoleDate(new Date()) + first_parameter].concat(other_parameters));
};
此实现非常简单,支持console.log的原始功能(传递单个对象和变量替换),不使用外部模块,只需调用console.log即可打印所有内容:
var origlog = console.log;
console.log = function( obj, ...placeholders ){
if ( typeof obj === 'string' )
placeholders.unshift( Date.now() + " " + obj );
else
{
// This handles console.log( object )
placeholders.unshift( obj );
placeholders.unshift( Date.now() + " %j" );
}
origlog.apply( this, placeholders );
};
模块:“日志时间戳”适用于我
看
简单易用
console.log('Before log-timestamp');
require('log-timestamp');
console.log('After log-timestamp');
结果
Before log-timestamp
[2012-08-23T20:08:32.000Z] After log-timestamp
像这样使用事件侦听器
process.on('error', function() {
console.log('Error Occurred.');
var d = Date(Date.now()).toString();
console.log.call(console, d); // Wed Aug 07 2019 23:40:07 GMT+0100 (GMT+01:00)
});
快乐编码:)如果您愿意,可以通过扩展节点的内置“Console”类为您的应用程序创建自定义记录器。请参考以下实施方案
“严格使用”;
恒力矩=要求的(‘力矩’);
const util=require('util');
const Console=require('Console')。Console;
类记录器扩展控制台{
构造函数(stdout、stderr等其他参数){
超级(标准输出、标准输出、其他参数);
}
日志(…args){
super.log(矩()格式('D MMM HH:mm:ss')、'-',util.format(…args));
}
错误(…args){
super.error(矩()格式('D MMM HH:mm:ss'),'-',util.format(…args));
}
}
module.exports=(函数(){
返回新的记录器(process.stdout、process.stderr);
}());代码>我正在尝试覆盖控制台
对象-似乎工作正常。要使用,请将下面的代码保存在文件中,然后导入以覆盖代理对象,然后按常规使用
(请注意,这需要babel transpilation,并且在不支持JavaScriptProxy
constructor的环境(如IE 11)中不起作用)
基本上,我用JavaScript代理对象覆盖控制台对象。当您调用.log
、.warn
等时,覆盖控制台将检查您调用的是否是函数,如果是函数,它将在日志语句中插入日期作为第一个参数,然后是所有参数
我认为控制台
对象实际上做了很多事情,但我并不完全理解它。所以我只截获console.log
,console.info
,console.warn
,console.error
调用。我已经研究了很多事情,现在,我想向现有的已部署项目中添加一些东西-如果是同一个应用程序/流程,就不需要太多的代码。控制台是一个全局对象,因此,如果您劫持它的一个函数,它将继续被劫持,因为所有共享该全局对象的文件都会被劫持。因此,这应该/可以放在app.js文件中?是的。我建议使用console stamp而不是这不是一个好的解决方案-它要么破坏变量插入(因此不能用作替换),要么在不同的行上打印日期和日志输出。我找不到它的文档,但似乎“:mm”将指月份“:mm”是您实际想要使用的格式。您应该根据@user603124更改分钟部分。分钟的字符串是:MM(),谢谢您的评论。更正!似乎您不再需要将HH:MM:ss.l括在括号中--它正在自动运行YYilogger
已被morgan
密切相关:和@Vipul这是一个NodeJS问题(后端),而不是Chrome控制台问题。不推荐:使用第三方模块。谢谢,这是“无依赖项”答案正是我所需要的。这把文件搞乱了:行信息:(谢谢,与此线程中的其他实现相比,这一个看起来非常简单,而且似乎工作正常
npm install log-timestamp
console.log('Before log-timestamp');
require('log-timestamp');
console.log('After log-timestamp');
Before log-timestamp
[2012-08-23T20:08:32.000Z] After log-timestamp
app.use(morgan('[:date[web]] :method :url :status :res[content-length] - :remote-addr - :response-time ms'))
process.on('error', function() {
console.log('Error Occurred.');
var d = Date(Date.now()).toString();
console.log.call(console, d); // Wed Aug 07 2019 23:40:07 GMT+0100 (GMT+01:00)
});
import console from './console-shadow.js'
console.log(...)
console.warn(...)
console.error(...)
// console-shadow.js
// Only these functions are shadowed by default
const overwrites = ['log', 'warn', 'info', 'error']
export default new Proxy(
// Proxy (overwrite console methods here)
{},
// Handler
{
get: (obj, prop) =>
prop in obj
? obj[prop]
: overwrites.includes(prop)
? (...args) => console[prop].call(console, new Date(), ...args)
: console[prop],
}
)