使用log4j记录日志

介绍

最近,我正在为一个客户端工作,试图为大型精心制作的Java系统消除一些GC暂停。 经过分析后,我意识到大部分垃圾都是通过日志记录产生的! 是否有一种简单的方法来删除所有分配? 原来有:)

我应该使用哪个框架进行GC免费日志记录?

让我们将注意力转向使用哪个日志记录框架的古老问题。

通常的候选人是

  • log4j2
  • 登回
  • java.util.logging
  • slf4j(简单)

除非您做的是超级时髦的东西,否则您可能不会认为这会给您带来很大的改变。

已经进行了许多比较性能的研究,如果您在超低延迟的竞技场中玩,那当然很重要。 ( 请参阅对Java日志记录框架进行基准测试 )

但是我担心的是分配!

请参阅我之前有关分配的弊端的文章“性能优化的第一条规则”。

在典型的系统中,所有分配的30%-50%可以记录在日志中! 因此,即使大多数人不介意在一个框架中进行日志记录的时间比在另一个框架中花费几毫秒的时间,他们几乎肯定会在乎日志框架所产生的垃圾导致的长时间GC暂停。

而且所有这些日志记录分配都可以通过简单的配置删除。 从2.6开始的Log4J2是免费分配的,因此没有任何借口不利用它:)

让我们看看它的作用

提出免分配索赔是一回事,但让我们看看这在实践中是否成立。

考虑下面的这个简单的日志记录代码:请注意,我在代码中使用了slf4j,因此只需更改配置即可在不同的日志记录框架中运行。 这样做是个好主意,因为尽管log4j2可能是目前最好的框架,但谁知道明天会带来什么……

package test;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;public class GCLogger {private final static Logger LOGGER = LoggerFactory.getLogger(GCLogger.class);public static void main(String[] args) throws InterruptedException {List<String> list = IntStream.range(0,(int)1e6).mapToObj(i->"" + i).collect(Collectors.toList());//Log 1 million lines in a loop sleeping 1 second between each iteration of the loop//to allow time to run Flight Recorder.for (int i = 0; i < 1000; i++) {list.forEach(s->LOGGER.info("Logging [{}]", s));Thread.sleep(1000);}}
}

使用log4j2运行–无分配

如果我们使用以下Maven配置将程序配置为与log4j2一起运行:

<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.25</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.9.1</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.9.1</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>2.9.1</version>
</dependency>

我们使用此log4j2配置

xml version="1.0" encoding="UTF-8" ?><Configuration status="INFO"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss:SSS} [%t] %-5level %logger[36] %msg%n"></PatternLayout></Console><File name="MyFile" fileName="all.log" immeadiateFlush="false" append="false"><PatternLayout pattern="%d{dd MMM yyyy HH:mm:ss,SSS} [%t] %-5level %logger[36] %msg%n"></PatternLayout></File></Appenders><Loggers><Root level="debug"><AppenderRef ref="MyFile"></AppenderRef></Root></Loggers>
</Configuration>

然后我们得到0分配!

我们可以通过在程序上运行Flight Recorder来证明这一点(见下文):

唯一分配的内存归因于Flight Recorder(通过配置FR的方式,这样就不会发生这种情况)。

使用登录运行

使用Logback尝试完全相同。

使用此Maven配置

<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version>
</dependency>

使用此注销配置:

<configuration><appender name="FILE" class="ch.qos.logback.core.FileAppender"><file>myApp.log</file><encoder><pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern></encoder></appender><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%msg%n</pattern></encoder></appender><root level="debug"><appender-ref ref="FILE" /></root>
</configuration>

当我们使用Flight Recorder运行时,我们会看到一个拥抱量分配!

但是有一点警告……。

您需要完全按照文档中的说明使用log4j2配置,请参阅支持的布局 。 如果您甚至更改日期格式,则略微分配将再次猖ramp。

摘要

  • 使用slf4j,以便您可以轻松更改日志记录实现
  • 使用log4j2避免分配
  • 确保使用支持的格式来支持免费分配日志记录

翻译自: https://www.javacodegeeks.com/2017/10/allocation-free-logging-log4j2.html

使用log4j记录日志

使用log4j记录日志_使用log4j2免费分配日志记录相关推荐

  1. 使用log4j2免费分配日志记录

    介绍 最近,我正在为一个客户端工作,试图为大型精心制作的Java系统消除一些GC暂停. 经过分析后,我意识到大部分垃圾都是通过日志记录产生的! 是否有一种简单的方法来删除所有分配? 原来有:) 我应该 ...

  2. mysql下日志_浅谈mysql下日志记录

    1,如何查看mysql执行命令历史 #.mysql_history     此文件记录了在mysql中执行命令的历史 2,事务日志: transaction log:事务型存储引擎自行的管理和使用. ...

  3. 华为交换机记录日志_从S5700交换机获取日志文件

    诊断日志文件实现 随着网络规模的扩大和网络复杂度的提高,设备产生的日志信息越来越多,为了节省存储空间,减少写盘次数,增加设备上日志的存储量和存储的时间跨度,提高日志的处理效率,延长存储设备的寿命.诊断 ...

  4. 安装程序未能打开日志文件_工地开工,安全日志记录这样写才规范!

    一.安全日志的理解 施工安全日志是从工程开始到竣工,由专职安全员对整个施工过程中的重要生产和技术活动的连续不断的详实记录.是项目每天安全施工的真实写照,也是工程施工安全事故原因分析的依据,施工安全日记 ...

  5. log4j 记录日志,数据插入到数据库

    本文未写拦截器 ,   利用session 将信息存到  MDC中 log4j.properties  配置文件 log4j.rootLogger = DEBUG, DB log4j.rootLogg ...

  6. 开源日志记录工具log4j

    前言:当我们进行大的项目书写的时候或者我们选择维护程序的时候,想知道几点几时我们录入的数据有bug是那么我们就采用--------------------------->log4j记录日志的信息 ...

  7. log4j配置_是时候了解一下log4j2各种配置的含义了!

    来源:http://i7q.cn/54K3Uw 1.日志框架 日志接口(slf4j) slf4j是对所有日志框架制定的一种规范.标准.接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具 ...

  8. 带你理清 Java 混乱的日志体系 - log4j、logback、log4j2、jcl、SLFJ 究竟是啥关系?

    1.JAVA混乱的日志体系 换乱的java日志体系 case: SLF4J-JCL LOG4J-CORE LOGBACK SLF4J-SIMPLE JCL-OVER-SLF4J LOGBACK-COR ...

  9. 常见日志框架介绍和对比(log4j,logback,log4j2)

    文章目录 1. 什么是slf4j? 2. log4j简介和配置 2.1 log4j介绍 2.2 log4j三大组件 2.3 log4j pom依赖引入 2.4 配置log4j 3. logback简介 ...

最新文章

  1. 【hadoop】20.MapReduce-InputFormat数据切片机制
  2. Python requests请求禁止跳转重定向(判断是否为原请求链接)
  3. unity3d android hdr,Unity3d 中的 HDR_BLOOM
  4. SQL语句关于数据库安全性
  5. ORACLE RAC运行在300G内存以上需要考虑的东西
  6. Java对接萤石云平台海康摄像头视频监控
  7. 《计算机网络 自顶向下方法》(第7版)答案(第九章)
  8. html日历页面节假日_基于jquery实现可查询节假日万年历代码
  9. 单片机c语言设计奥运五环,用C语言程序来设计奥运五环图案
  10. Centos7重置密码后采用密钥登陆
  11. 高项_第九章人力资源管理
  12. 为什么员工辞职时,领导都要象征性挽留一下?
  13. 链表的头插法和尾插法——头插尾插交替插入
  14. CentOS 6.5 安装使用iscsi-initiator
  15. java 搭建ota服务器_OTA配置服务器
  16. ie11对象不支持此属性和方法 ie11的缓存问题
  17. ArcGIS数字地形分析
  18. 《Improving Deep Neural Networks》的理论知识点
  19. EESoft Flexnet Licence Server 服务无法启动(2023.1.31 update)
  20. 神奇宝贝HTML游戏代码,口袋妖怪魂银金手指代码

热门文章

  1. [CF 526 F] Pudding Monsters(单调栈 + 线段树)
  2. 不止代码:机器分配(动态规划)
  3. 题解: 区间合并(opj 2-4-7620)
  4. nssl1452-排行榜【数论】
  5. P4777-[模板]扩展中国剩余定理(EXCRT)
  6. 欢乐纪中某B组赛【2019.1.29】
  7. jzoj3508-好元素【hash,优雅的暴力】
  8. vijos1237-隐形的翅膀【离散化】
  9. ssl初一组周六模拟赛【2018.3.17】
  10. ssl1626-花店橱窗布置【日常dp】