我想使用log4javascript记录对象。例如,考虑以下代码:
function LogObject() {
var blah = {
one: 42,
two: "486"
};
logger.Info(blah);假设记录器是正确设置的log4javascript记录器的实例:
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()方法)。我怎样才能做到这一点?
发布于 2013-08-13 21:31:42
JsonLayout将日志事件(除了日志消息之外还包括日志级别、时间戳和记录器名称)格式化为JSON,而不是日志消息,而日志消息基本上被假定为字符串。这样做的原因是为了避免对旧浏览器依赖JSON库;如果没有JSON库,为JsonLayout处理的简单已知数据生成JSON没有问题,但是处理任意对象肯定需要一个JSON库。
我建议的解决办法是,在将消息传递给日志记录调用之前先格式化它:
logger.info( JSON.stringify(blah) );发布于 2016-02-10 15:38:47
logger.info( JSON.stringify(blah) );但是我们有性能问题,因为JSON.stringify发生在调用logger.info之前,因此即使日志记录级别被设置为忽略此日志,它也始终会发生。
为了解决这个问题,我编写了一个新的懒散布局,这样只有在日志实际输出时才会发生字符串化。为了更灵活,它还分配传递一个函数,在这种情况下,它输出运行所述函数的结果。
使用:
logger.trace("Received ", widget, " which has ", () => countFrimbles(widget), ' frimbles');Implementation:
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"; };发布于 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 }
https://stackoverflow.com/questions/18205084
复制相似问题