首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >log4javascript中的日志对象

log4javascript中的日志对象
EN

Stack Overflow用户
提问于 2013-08-13 09:15:05
回答 3查看 3.7K关注 0票数 5

我想使用log4javascript记录对象。例如,考虑以下代码:

代码语言:javascript
复制
function LogObject() {
var blah = {
    one: 42,
    two: "486"
};
logger.Info(blah);

假设记录器是正确设置的log4javascript记录器的实例:

代码语言:javascript
复制
var logger = log4javascript.getLogger("InternalLogger");
var ajaxAppender = new log4javascript.AjaxAppender(url),
jsonLayout = new log4javascript.JsonLayout(false, false);
ajaxAppender.setLayout(jsonLayout);
ajaxAppender.addHeader("Content-Type", "application/json");
logger.addAppender(ajaxAppender);

我期望得到的结果如下:请求有效负载包含消息数组,首先是我的对象序列化为JSON。我看到的是消息数组,其中首先有字符串"Object对象“(就像调用了toString()方法)。我怎样才能做到这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-13 21:31:42

JsonLayout将日志事件(除了日志消息之外还包括日志级别、时间戳和记录器名称)格式化为JSON,而不是日志消息,而日志消息基本上被假定为字符串。这样做的原因是为了避免对旧浏览器依赖JSON库;如果没有JSON库,为JsonLayout处理的简单已知数据生成JSON没有问题,但是处理任意对象肯定需要一个JSON库。

我建议的解决办法是,在将消息传递给日志记录调用之前先格式化它:

代码语言:javascript
复制
logger.info( JSON.stringify(blah) );
票数 4
EN

Stack Overflow用户

发布于 2016-02-10 15:38:47

我们在跟踪@Tim Down's suggestion

代码语言:javascript
复制
logger.info( JSON.stringify(blah) );

但是我们有性能问题,因为JSON.stringify发生在调用logger.info之前,因此即使日志记录级别被设置为忽略此日志,它也始终会发生。

为了解决这个问题,我编写了一个新的懒散布局,这样只有在日志实际输出时才会发生字符串化。为了更灵活,它还分配传递一个函数,在这种情况下,它输出运行所述函数的结果。

使用:

代码语言:javascript
复制
logger.trace("Received ", widget, " which has ", ()  => countFrimbles(widget), ' frimbles');

Implementation:

代码语言:javascript
复制
function LazyFormatLayout() { }
LazyFormatLayout.prototype = new log4javascript.Layout();
LazyFormatLayout.prototype.format = function (loggingEvent) {
    var time = loggingEvent.timeStamp.toTimeString().split(/\s/)[0];

    var head = time + ' ' + loggingEvent.logger.name + ' [' + loggingEvent.level.name + '] - ';
    var body = loggingEvent.messages.map(function (arg) {
        try {
            switch (typeof (arg)) {
                case 'function':
                    return arg();
                case 'object':
                    return JSON.stringify(arg);
            }
        }
        catch (e) {
            return '<<error while logging: ' + e.stack + '>>';
        }
        return arg;

    }).join('');
    if (!loggingEvent.exception)
        return head + body;

    return head + body + ' ==> Exception: ' + loggingEvent.exception.stack;
}

LazyFormatLayout.prototype.ignoresThrowable = function () { return false; };
LazyFormatLayout.prototype.toString = function () { return "LazyFormatLayout"; };
票数 4
EN

Stack Overflow用户

发布于 2015-06-26 10:54:22

问题有点过时了,但是google的简单搜索发现了这个问题,并且似乎有一种内置的方式来记录对象:

var log = log4javascript.getDefaultLogger(); log.info("log following object",{ data:5, text:"bla" });

输出

12:49:43 INFO - log以下对象{ data: 5,text: bla }

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18205084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档