我想使用log4javascript记录对象。例如,请考虑以下代码:
function LogObject() {
var blah = {
one: 42,
two: "486"
};
logger.Info(blah);
假设logger是正确设置的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 object”(类似于toString()方法被调用)。我怎样才能做到这一点?
答案 0 :(得分:4)
JsonLayout
将日志记录事件(包括除日志消息之外的日志级别,时间戳和记录器名称)格式化为JSON而不是日志消息,后者几乎被假定为字符串。这样做的原因是为了避免旧版浏览器依赖JSON库;如果没有JSON库,JsonLayout
处理的简单已知数据生成JSON是没有问题的,但处理任意对象肯定需要一个。
我建议的解决方法只是在将消息传递给日志记录调用之前格式化消息:
logger.info( JSON.stringify(blah) );
答案 1 :(得分:3)
logger.info( JSON.stringify(blah) );
但是在调用 JSON.stringify
之前{em}发生了<{1}}以来我们遇到了性能问题,因此即使将日志记录级别设置为忽略此日志,它也总会发生。< / p>
为了解决这个问题,我编写了一个新的 lazy 布局,以便只有在实际输出日志时才会发生 stringification 。为了更灵活,它也允许传递函数,在这种情况下它输出运行所述函数的结果。
<强>用法:强>
logger.info
<强>实施强>
logger.trace("Received ", widget, " which has ", () => countFrimbles(widget), ' frimbles');
答案 2 :(得分:0)
问题有些过时了,但是一个简单的谷歌搜索出现了这个问题,并且似乎有一种记录对象的内置方式:
var log = log4javascript.getDefaultLogger();
log.info("log following object",{ data:5, text:"bla" });
输出
12:49:43 INFO - 记录以下对象{ 数据:5, 文字:bla }