Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 向所有控制台消息添加时间戳_Node.js_Express_Console - Fatal编程技术网

Node.js 向所有控制台消息添加时间戳

Node.js 向所有控制台消息添加时间戳,node.js,express,console,Node.js,Express,Console,我有一个完整的、已部署的、基于Express的项目,整个项目中有许多console.log()和console.error()语句。 项目使用forever运行,将stdout和stderr定向到两个单独的文件 这一切都运行得很好,但现在我缺少了时间戳,无法准确地知道错误发生的时间 我可以在我的代码中进行某种搜索/替换,或者使用一些npm模块覆盖每个文件中的控制台,但我不想接触每个模型/路由文件,除非我必须这样做 有没有一种方法,也许是一种快速中间件,可以让我在每次通话中都添加一个时间戳,或者我

我有一个完整的、已部署的、基于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,并且在不支持JavaScript
Proxy
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括在括号中--它正在自动运行YYi
logger
已被
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],
  }
)