我如何子类/覆盖Ember.Logger?

时间:2016-02-15 16:31:38

标签: ember.js

我正在我的Ember应用程序中实现远程日志记录功能,我希望将发送到日志控制台的所有内容推送到远程日志记录服务(例如Loggly)。

我相信我需要做的是覆盖Ember.Logger的方法来将日志输出重定向到远程日志服务,但我无法弄清楚如何做到这一点。

Ember.Logger的{​​{3}}只是声明:

  

覆盖它以提供更强大的日志记录功能。

  1. 如何“覆盖此”?我尝试过Ember.Logger.reopenClass()并且抱怨Ember.Logger.reopenClass is not a function

  2. 我会在哪里这样做?在初始化程序中?在服务?其他

2 个答案:

答案 0 :(得分:4)

Ember.Logger不是Ember类。它只是一个带有一些方法的对象。

您可以通过类似

的方式覆盖它
Ember.Logger.log = function(...

你可以把它放在任何你想要的地方。我可以把它放在app.js的顶部。

答案 1 :(得分:1)

扩展并更新@ user663031响应...

截至2017年11月,Ember.Logger的状态正在播出。它未包含在Ember's module API中,并且还没有针对未来的RFC。

可以直接使用调试实用程序,例如ember-debug-logger,并将这些原型与Ember.Logger分开。

但是,我选择直接覆盖Ember.Logger,因为它允许我包含我喜欢的任何日志记录工具(而不是debug util),而不必修改分散在整个代码中的日志语句。

当我在后端使用bunyan时,选择使用browser-bunyan进行记录,其中infowarnerrorEmber.Logger相同。

YMMV,但这是对我有用的最小例子......

enter image description here

// app/app.js
import LOG from './logger-bunyan';
if (config.APP.LOG_BUNYAN) {
    Ember.Logger = LOG;
}

// app/logger-bunyan.js
import bunyan from 'npm:browser-bunyan';

const LOG = bunyan.createLogger({
    name: 'emberApplication',
});

export default LOG;

// config/environment.js
if (environment === 'development') {
    ENV.APP.LOG_BUNYAN = true;
}

// app/component/WhereIWantToLog.js
Logger.warn('bunyan logged warning message')