V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Soar360
V2EX  ›  Java

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

  •  
  •   Soar360 · 2015-10-09 08:15:46 +08:00 · 3100 次点击
    这是一个创建于 3370 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    10 条回复    2015-10-09 16:31:34 +08:00
    nullcc
        1
    nullcc  
       2015-10-09 08:33:31 +08:00
    object 有一个 description 方法, NSLog 之类其实是调用对象的 description , description 方法可以自己写,用来自定义 format 输出
    nullcc
        2
    nullcc  
       2015-10-09 08:34:21 +08:00
    咦,原来是 JAVA 的,我还以为 Obj-c 的,不过原理应该差不多
    Gonster
        3
    Gonster  
       2015-10-09 08:41:01 +08:00 via iPhone
    应该是为了统一格式吧,如果参数使用一个用代码规范的类,类构造还有最后 toString 等都可以由代码规范。比如公司有这么一个要求,要求每个异常日志都要带编号之类的固定格式,仅仅靠文档说明,程序员可能每次都会重复写那个拼接字符串的代码,或者甚至可能跟文档要求的有出入。日志到最后可能需要统一分析,如果格式不够统一可能比较难以统一用代码分析,或者分析效率很低。不是大神,这是我个人理解_(:з」∠)_
    dallaslu
        4
    dallaslu  
       2015-10-09 09:10:22 +08:00
    log4j 也不是 String 啊!
    Cloudee
        5
    Cloudee  
       2015-10-09 10:17:58 +08:00 via iPhone
    可能也有性能上的考虑,在调用的时候 toString 的话,无论配置的日志级别如何, toString 都会调用了,直接传 Object 的话,这条日志实际上不输出的时候 toString 是不调用的
    oott123
        6
    oott123  
       2015-10-09 13:07:20 +08:00
    按我的理解就是方便啊,不过我不写 java 。
    log(obj.toString())
    log(obj)
    显然后者要舒服一些嘛。
    Gonster
        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 是不是这么调用的我没看完还不确定- -。
    zacard
        8
    zacard  
       2015-10-09 16:04:53 +08:00
    目测楼主看的是 slf4j 的方法,而不是 log4j.
    顺便问一句,那个“日志组件的设计”的 message 是 object 的。。。
    fwrq41251
        9
    fwrq41251  
       2015-10-09 16:23:46 +08:00
    slf4j 传的是 String 啊
    ![info]( )
    Soar360
        10
    Soar360  
    OP
       2015-10-09 16:31:34 +08:00
    @Gonster 觉得是这样的,谢谢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1509 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:52 · PVG 00:52 · LAX 08:52 · JFK 11:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.