当前位置: 首页 > 知识库问答 >
问题:

记录器的用法,是参数化更好还是用来添加参数?

拓拔富
2023-03-14

以下哪项是更好地使用记录器?

>

  • 参数化(log4j 2)

    logger.info("User {} has logged in using id {}", map.get("Name"), user.getId());`
    

    使用运算符(log4j)

    logger.info("User"+ map.get("Name") +" has logged in using id " +user.getId());`
    

    为什么?

  • 共有2个答案

    潘银龙
    2023-03-14

    参数化消息避免格式化文本,直到Log4j确定消息将被记录。这可以让你避免周围的logger.debug(...)调用与检查,如if(logger.isDebugEn的())...,这给了更干净的代码。

    这个答案基于现代日志框架,而不是像Log4J这样过时的框架。

    当你说“过时”时,你一定是在谈论log4j1。x、 截至2014年,Log4j 2是最前沿的开源日志框架。它采纳了SLF4J的一些想法,比如参数化日志消息,但添加了一个插件系统,这样您就可以轻松地添加自定义附加器、自定义布局和自定义查找。此外,log4j2还支持自定义日志级别、lambda表达式和无锁且性能非常好的异步记录器。为了增加趣味性,从2.6版开始,log4j2是无垃圾的。

    Kayaman可能在谈论Log4j 1,它自2015年8月以来就已经结束了生命。

    程赞
    2023-03-14

    即使没有其他东西,使用时发生的额外StringBuilder恶作剧也会使使用参数成为显而易见的选择。

    更不用说在连接值时,即使日志记录级别未启用,也会调用所有参数的toString()方法,这意味着您在浪费CPU来构建一个永远不会被记录的字符串。当调试级别通常在生产环境中被禁用时,如果存在大量的debug()语句,这将产生(尽管很小)影响。

     类似资料:
    • 我想自动化一个简单的应用程序脚本,从主屏幕打开play store应用程序。当我尝试运行脚本时,出现以下错误: AppiumDriver类型不是泛型;它不能用参数参数化,因为AndroidDriver类型不是泛型的;它不能用参数参数化 我安装的依赖项包括: selenium-server-standalone-3.141.59。jar,commons-lang3-3.9。jar,client-co

    • 问题内容: 如何使用Python的文档字符串使用参数记录方法? 编辑: PEP 257给出了这个例子: 这是大多数Python开发人员使用的约定吗? 我期待一些更正式的东西,例如 环境 :Python 2.7.1 问题答案: 根据我的经验,numpy的文档字符串公约(PEP257超集)是最广泛的传播 遵循 惯例,它们也通过工具,如支持的狮身人面像。 一个例子:

    • 我试图实现事件处理函数,以避免每次组件和时创建新函数。 场景1: 如果我像下面那样在构造函数中绑定函数,并且在中没有参数,那么它只会在bundle文件中创建一个新函数一次 场景2: 但是,当我想将以及传递给函数时,我相信每当组件和 所以 如何更好地编写场景2,使新函数在bundle文件中只创建一次,而不是每次组件渲染和重新渲染时都创建一次?可能吗? 编辑: param1和param2是我自己的自定

    • 问题内容: 我想在过滤器/ servlet中拦截请求,并向其中添加一些参数。但是,该请求不会公开’setParameter’方法,并且该参数映射在被操纵时会抛出错误,表明已被锁定。有没有其他我可以尝试的方法? 问题答案: 子类化并覆盖方法。该类的描述为: 提供HttpServletRequest接口的便捷实现,希望希望使请求适应Servlet的开发人员可以将其子类化。 在过滤器中,将请求包装在子类

    • 本文向大家介绍Python函数中参数是传递值还是引用详解,包括了Python函数中参数是传递值还是引用详解的使用技巧和注意事项,需要的朋友参考一下 在 C/C++ 中,传值和传引用是函数参数传递的两种方式,在Python中参数是如何传递的?回答这个问题前,不如先来看两段代码。 代码段1: 看了代码段1的同学可能会说参数是值传递。 代码段2: 看了代码段2,这时可能又有人会说,参数是传引用,那么问题