日志方法参数为什么要采用 Object 类型?

2015-10-09 08:15:46 +08:00
 Soar360

在日志组件的设计中,为何写日志方法的 message 参数会采用 object 或者泛型呢?最终的表现形式不都是 string 类型吗?干嘛不直接用 string ?参考 log4j 和 nlog 。
我想知道具体的引用场景,麻烦大神说明一下。

3098 次点击
所在节点    Java
10 条回复
nullcc
2015-10-09 08:33:31 +08:00
object 有一个 description 方法, NSLog 之类其实是调用对象的 description , description 方法可以自己写,用来自定义 format 输出
nullcc
2015-10-09 08:34:21 +08:00
咦,原来是 JAVA 的,我还以为 Obj-c 的,不过原理应该差不多
Gonster
2015-10-09 08:41:01 +08:00
应该是为了统一格式吧,如果参数使用一个用代码规范的类,类构造还有最后 toString 等都可以由代码规范。比如公司有这么一个要求,要求每个异常日志都要带编号之类的固定格式,仅仅靠文档说明,程序员可能每次都会重复写那个拼接字符串的代码,或者甚至可能跟文档要求的有出入。日志到最后可能需要统一分析,如果格式不够统一可能比较难以统一用代码分析,或者分析效率很低。不是大神,这是我个人理解_(:з」∠)_
dallaslu
2015-10-09 09:10:22 +08:00
log4j 也不是 String 啊!
Cloudee
2015-10-09 10:17:58 +08:00
可能也有性能上的考虑,在调用的时候 toString 的话,无论配置的日志级别如何, toString 都会调用了,直接传 Object 的话,这条日志实际上不输出的时候 toString 是不调用的
oott123
2015-10-09 13:07:20 +08:00
按我的理解就是方便啊,不过我不写 java 。
log(obj.toString())
log(obj)
显然后者要舒服一些嘛。
Gonster
2015-10-09 15:43:25 +08:00
-. -| 我去看了一下 log4j API 发现我好像理解错 lz 问的意思了。

log4j 的 message 参数为什么是 Object ,我看了一下 log4j 的源码, org.apache.log4j.or 包下面有个 ObjectRenderer 接口,还有个 RendererMap 类, log4j 貌似会根据不同的对象通过 RendererMap 找到不同的 ObjectRenderer 实现,用来生成不同的字符串:其中一个实现类 DefaultRenderer 貌似就是直接调用 toString ,但是 org.apache.log4j.or.jms.MessageRenderer 就由不同的代码逻辑了,如果对象是 javax.jms.Message 会有不同的处理方式。

现在只是看的有这些类,具体 log4j 是不是这么调用的我没看完还不确定- -。
zacard
2015-10-09 16:04:53 +08:00
目测楼主看的是 slf4j 的方法,而不是 log4j.
顺便问一句,那个“日志组件的设计”的 message 是 object 的。。。
fwrq41251
2015-10-09 16:23:46 +08:00
slf4j 传的是 String 啊
![info]( )
Soar360
2015-10-09 16:31:34 +08:00
@Gonster 觉得是这样的,谢谢。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/226490

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX