首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当我们打开或关闭一些日志位置时,log4j实际上在做什么?

当我们打开或关闭一些日志位置时,log4j实际上在做什么?
EN

Stack Overflow用户
提问于 2010-02-09 07:29:47
回答 3查看 2K关注 0票数 10

我们知道我们可以配置log4j,通过它的属性/配置文件关闭特定位置的日志(在Java中的类或包)。以下是我的问题:

  1. log4j实际上在为这些标志做什么?
  2. 是否仍然调用log4j中的日志语句,但只是因为该标志而没有被写入文件或控制台?那么仍然会对性能产生影响吗?
  3. 是否类似于在编译时生效的C++中的#ifdef,从而可以限制性能影响?

谢谢,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-09 07:31:33

是的,日志语句仍将被执行。这就是为什么首先检查日志级别是一个很好的模式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (log.isInfoEnabled()) {
    log.info("My big long info string: " + someMessage);
}

这是为了避免在日志级别不支持String语句时为info INFO重新分配空间。

它不像#ifdef - #ifdef是编译器指令,而Log4J配置是在运行时处理的。

编辑:我讨厌因为无知而被降级,所以这里有一篇文章支持我的答案。

来自http://surguy.net/articles/removing-log-messages.xml

中的Log4J,如果您在调试级别记录消息,并且当前的附录被设置为只记录信息级别及以上的消息,那么消息将不会显示。调用日志方法本身的性能损失最小-几纳秒。但是,计算日志方法的参数可能需要更长的时间。例如:

Logger.debug(“大对象是"+largeObject.toString());

计算largeObject.toString()可能很慢,并且在调用记录器之前对其进行评估,因此记录器不能阻止对其进行计算,即使它不会被使用。

编辑2:来自log4j手册本身(http://logging.apache.org/log4j/1.2/manual.html):

用户应该知道以下性能问题。

关闭日志记录时,

  1. 日志记录性能。当日志记录完全关闭或仅关闭一组级别时,日志请求的成本由一个方法调用和一个整数比较组成。在233个MHz奔腾II型机器上,这一成本通常在5到50纳秒的范围内。

然而,方法调用涉及到参数构造的“隐藏”成本。

例如,对于一些伐木猫,写作,

Logger.debug(“条目编号:”+i+“是”+String.valueOf(Entryi)“);

这将导致构造消息参数的成本,即将整数i和entryi转换为字符串,并连接中间字符串,而不管消息是否将被记录。这一参数建设成本可能相当高,这取决于所涉及的参数的大小。

为了避免参数的施工成本,写:

if(logger.isDebugEnabled() {logger.debug(“条目编号:”+i+“”是“+String.valueOf(Entryi)”);}

如果禁用调试,这将不会导致参数构造的成本。另一方面,如果记录器启用了调试,则评估是否启用记录器将花费两倍的成本:一次在debugEnabled中,一次在调试中。这是一个微不足道的开销,因为评估记录器所需的时间约为实际日志所需时间的1%。

票数 16
EN

Stack Overflow用户

发布于 2010-02-09 08:02:47

我运行了一个简单的基准测试。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    for (int j = 0; j < 5; j++) {
        long t1 = System.nanoTime() / 1000000;
        int iterations = 1000000;
        for (int i = 0; i < iterations; i++) {
            int test = i % 10;
            log.debug("Test " + i + " has value " + test);
        }
        long t2 = System.nanoTime() / 1000000;
        log.info("elapsed time: " + (t2 - t1));

        long t3 = System.nanoTime() / 1000000;
        for (int i = 0; i < iterations; i++) {
            int test = i % 10;
            if (log.isDebugEnabled()) {
                log.debug("Test " + i + " has value " + test);
            }
        }
        long t4 = System.nanoTime() / 1000000;
        log.info("elapsed time 2: " + (t4 - t3));
    }

elapsed time: 539
elapsed time 2: 17
elapsed time: 450
elapsed time 2: 18
elapsed time: 454
elapsed time 2: 19
elapsed time: 454
elapsed time 2: 17
elapsed time: 450
elapsed time 2: 19

对于1.6.0_18,这让我感到惊讶,因为我以为内衬会阻止这件事。也许有转义分析的Java 7会。

但是,我仍然不会将调试语句包装在if子句中,除非时间的改进(半微秒级)变得重要了!

票数 5
EN

Stack Overflow用户

发布于 2010-02-09 07:41:52

  1. log4j将处理日志语句,并检查是否在特定日志记录级别启用了特定的记录器。如果不是,那么语句将不会被记录。
  2. 这些检查比实际写入磁盘(或控制台)要便宜得多,但它们仍然有影响。
  3. no,java没有像#ifdef这样的概念(反正有java预编译器)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2230180

复制
相关文章
如何在VimVi中显示行号
Vim/Vi是许多软件开发人员和Linux系统管理员首选的文本编辑器。 默认情况下,Vim不显示行号,但可以轻松打开它们。Vim支持三种行编号模式,可帮助你浏览文件。除了标准的绝对行编号之外,Vim还支持相对行和混合行编号模式。 绝对行号 绝对行号是标准行号,它在每行文本旁边显示适当的行号。 要激活行编号,请设置数字标志: 按Esc键切换到命令模式。 按:(冒号),光标将移动到屏幕的左下角。输入set number或set nu,然后按Enter。 :set number 行号将显示在屏幕的左侧: 要禁用
入门笔记
2022/06/02
3.6K0
使用Visio Viewer载入数据库中的Visio图
需求很简单,在SQL Server数据库中存放用户上传的Visio文件,然后使用Visio Viewer在IE中直接显示用户上传的Visio文件的内容。
深蓝studyzy
2022/06/16
1.1K0
使用Visio Viewer载入数据库中的Visio图
数组或对象中的内容间隔显示
总结:间隔显示,不要使用for 循环,原因是for循环是同步,setTimeout是异步,同步执行完再执行异步。
tianyawhl
2019/11/07
4.3K0
商业PoE网络中的关键IT设备
在当今商业环境中,稳定高效的网络基础设施至关重要。以太网供电(PoE)技术因其能够通过单根网线同时传输数据和电源,已成为现代企业网络的核心。其不仅简化了安装过程,降低了成本,还提升了网络部署的灵活性。如果您计划搭建或升级商业PoE网络,了解所需的关键设备至关重要。本文将为您介绍商业PoE网络必备的IT设备。
通信产品推荐官
2025/03/24
720
商业PoE网络中的关键IT设备
如何在js中创建对象
七夕临近了,没有对象的来创建一个吧 使用对象字面量: const o = { name: "zehan", greeting() { return `Hi, 我是${this.name}`; } }; o.greeting(); // "Hi, zehan" 使用构造函数: function Person(name) { this.name = name; } Person.prototype.greeting = function () { return `Hi, 我是
ZEHAN
2020/09/23
7.6K0
如何在 JavaScript 中克隆对象
JavaScript 处理对对象的赋值的方式与处理基本值的方式不同。它不是保存值,而是使用指向内存中值的指针。
泽霖
2023/11/12
2340
金融科技的「背面」
当金融科技的发展进入到全新的发展阶段,仅仅只是按照传统意义上的平台逻辑,业已无法获得长久的发展。单单看看玩家们对于金融科技新模式的探索,我们就可以看出一些端倪。如果对玩家们的金融科技新模式的探索进行一个总结的话,回归实体和产业,无疑是一个重要方面。
孟永辉
2022/11/16
4210
金融科技的「背面」
如何在Openharmony中实现USB复合设备
如何让Openharmony设备HDC接口(OTG接口)作为一个复合设备,实现HDC(HDC:鸿蒙设备连接器) + CDC ACM(USB 虚拟串口),而设备本身支持HDC。所以需要增加CDC ACM(USB 虚拟串口)。
Rice加饭
2024/06/06
4170
如何在Openharmony中实现USB复合设备
如何在iPhone设备中查看崩溃日志
本文介绍了如何在iPhone设备中查看崩溃日志,以便调查崩溃的原因。我们将展示三种不同的方法,包括使用克魔助手查看崩溃日志。
iOS Magician
2024/01/03
4860
如何在iPhone设备中查看崩溃日志
《嵌入式设备端的网络报文在wireshark显示》-- 应用
摘要 前面一篇文章把整个SP2WS工具的原理描述了,这一篇来描述这个操作怎么玩。 应用说明 这个工具提供了两条命令,可以同时对wifi模块和主控进行监控 对于wifi模块端命令: 参数-com[port_num]:wifi模块端对应的调试串口 参数-wifi_slave:wifi模块端对应的管道名字 SP2WS.py com[port_num] wifi_slave 例如: SP2WS.py com1 wifi_slave 对于主控端命令: 参数-com[port_num]:主端对应的调试串口 参数-
Rice加饭
2022/05/10
2380
《嵌入式设备端的网络报文在wireshark显示》-- 应用
Confluence 如何在页面中显示目录
在默认情况下,Confluence 是不能在页面中显示目录和当前页面中的内容导航的。
HoneyMoose
2021/12/14
2K0
Discourse 如何在首页中显示 Box 的子分类
如果你不选择上门的选项的话,下面的列表是不会显示的,你可以通过这个自行确定如何显示子项目。
HoneyMoose
2020/05/30
2.1K0
Discourse 如何在首页中显示 Box 的子分类
Confluence 如何在页面中显示目录
在默认情况下,Confluence 是不能在页面中显示目录和当前页面中的内容导航的。
HoneyMoose
2022/01/11
2.5K0
Confluence 如何在页面中显示目录
如何在Java中判断对象的真正“死亡”
在Java编程中,对象的生命周期管理是一项重要的任务。当对象不再被使用时,及时释放其占用的内存资源是一个有效的优化手段。而为了准确地判断对象是否真正“死亡”,我们需要理解Java的垃圾回收机制以及对象的引用关系。本文将详细介绍在Java中如何判断对象的真正“死亡”,并提供一些实例来帮助读者更好地理解。
疯狂的KK
2023/07/02
1920
如何在Java中判断对象的真正“死亡”
如何在 JS 中“深冻结”对象?
1.如果咱们想要确保对象被深冻结,就必须创建一个递归函数来冻结对象类型的每个属性:
程序狗
2021/09/15
1.7K0
金融科技洗牌的背面
金融科技并未像互联网玩家们所预想的那个方向发展,而是朝着另外一个方向迈进。按照互联网玩家们对于它的规划,所谓的金融科技应当成为互联网玩家将自身利益最大化的工具和手段。因为无论是从互联网的角度来看,还是从金融的角度来讲,两者都具备与人们的生产和生活深度融合的特质,而将两者结合在一起,无疑可以实现「躺赚」的终极目的。
孟永辉
2022/06/27
2570
金融科技洗牌的背面
背面入射的光栅耦合器
这篇笔记分享一篇光栅耦合器的最新进展,IMEC与Ghent大学的研究小组在硅光芯片背面加工出微透镜(microlens), 将光场的MFD提高到32um, 其1dB的对准容差可以提高到±7um,为硅光
光学小豆芽
2021/03/15
1.2K0
背面入射的光栅耦合器
Linux小技巧:如何在 Vim 中显示行号?
Vim 是一款出色的编辑器,大多数 Linux/UNIX 系统管理员每天都喜欢并使用它。
网络技术联盟站
2022/03/02
11.5K0
Linux小技巧:如何在 Vim 中显示行号?
如何在有限资源设备上部署深度网络(下)
近年来,深度神经网络模型在计算机视觉识别、语音识别、自然语言处理等领域取得了巨大的成功。但是受限于较高的计算复杂度和较大的存储需求,深度模型的部署在有限资源设备上面临着诸多挑战,因此相继出现了各种模型压缩和加速技术。其中知识蒸馏是一种典型的方法,它能从一个大的教师模型中学习到一个小的学生模型,受到了工业界和学术界的广泛关注。
绿盟科技研究通讯
2023/12/18
2360
如何在有限资源设备上部署深度网络(下)
如何在有限资源设备上部署深度网络(上)
近年来,深度神经网络模型在计算机视觉识别、语音识别、自然语言处理等领域取得了巨大的成功。但是受限于较高的计算复杂度和较大的存储需求,深度模型的部署在有限资源设备上面临着诸多挑战,因此相继出现了各种模型压缩和加速技术。其中知识蒸馏是一种典型的方法,它能从一个大的教师模型中学习到一个小的学生模型,受到了工业界和学术界的广泛关注。
绿盟科技研究通讯
2023/11/27
2220
如何在有限资源设备上部署深度网络(上)

相似问题

如何在Visio中映射网络?

30

Visio网络布线模板

30

网络图,替代Visio

60

免费的,基于网络的替代Visio?

20

如何在网络上查找静态IP和MAC地址(或拒绝任何请求(如ping)的设备)

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文