在日志组件的设计中,为何写日志方法的 message 参数会采用 object 或者泛型呢?最终的表现形式不都是 string 类型吗?干嘛不直接用 string ?参考 log4j 和 nlog 。
我想知道具体的引用场景,麻烦大神说明一下。
1
nullcc 2015-10-09 08:33:31 +08:00
object 有一个 description 方法, NSLog 之类其实是调用对象的 description , description 方法可以自己写,用来自定义 format 输出
|
2
nullcc 2015-10-09 08:34:21 +08:00
咦,原来是 JAVA 的,我还以为 Obj-c 的,不过原理应该差不多
|
3
Gonster 2015-10-09 08:41:01 +08:00 via iPhone
应该是为了统一格式吧,如果参数使用一个用代码规范的类,类构造还有最后 toString 等都可以由代码规范。比如公司有这么一个要求,要求每个异常日志都要带编号之类的固定格式,仅仅靠文档说明,程序员可能每次都会重复写那个拼接字符串的代码,或者甚至可能跟文档要求的有出入。日志到最后可能需要统一分析,如果格式不够统一可能比较难以统一用代码分析,或者分析效率很低。不是大神,这是我个人理解_(:з」∠)_
|
4
dallaslu 2015-10-09 09:10:22 +08:00
log4j 也不是 String 啊!
|
5
Cloudee 2015-10-09 10:17:58 +08:00 via iPhone
可能也有性能上的考虑,在调用的时候 toString 的话,无论配置的日志级别如何, toString 都会调用了,直接传 Object 的话,这条日志实际上不输出的时候 toString 是不调用的
|
6
oott123 2015-10-09 13:07:20 +08:00
按我的理解就是方便啊,不过我不写 java 。
log(obj.toString()) log(obj) 显然后者要舒服一些嘛。 |
7
Gonster 2015-10-09 15:43:25 +08:00 1
-. -| 我去看了一下 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 是不是这么调用的我没看完还不确定- -。 |
8
zacard 2015-10-09 16:04:53 +08:00
目测楼主看的是 slf4j 的方法,而不是 log4j.
顺便问一句,那个“日志组件的设计”的 message 是 object 的。。。 |
9
fwrq41251 2015-10-09 16:23:46 +08:00
slf4j 传的是 String 啊
![info]( ) |