当前位置: 首页 > news >正文

输出日志信息的两种方式比较:日志框架SLF4J和System.out.println

Java中用于输出日志或信息的两种不同方式:

基于日志框架(SLF4J)输出

基于System调用输出

先说观点:从性能角度考虑,使用日志框架输出日志通常比直接使用System.out.println更加高效。日志框架可以通过配置和优化来降低对系统性能的影响,同时还能提供更多的功能和灵活性。而System.out.println每次调用都会进行IO操作,可能会产生较大的性能开销,特别是在高频率输出时。

为什么System.out.println会进行IO操作且开销不可控

System.out.println会进行IO操作是因为它是通过标准输出流(Standard Output Stream)向控制台输出信息。如果对标准输出流不太好理解,那么再往下看,System通过调用out用于向标准输出流写入数据。而out是一个PrintStream对象,PrintStream又是OutputStream的子类,追踪到OutputStream,就可以从根本上理解,每次调用System.out.println,都会进行一次IO操作。

System.out.println的IO操作由Java虚拟机(JVM)和操作系统负责执行。每次调用System.out.println都会立即触发IO操作,可能引起频繁的IO开销

日志框架输出配置讲解,如缓冲区大小和刷新频率,异步输出

默认情况下会使用SLF4J (Simple Logging Facade for Java)作为日志框架,而具体的日志实现则会根据项目中所引入的日志框架而定,比如Logback或者Log4j2。SLF4J提供了统一的接口,而具体的日志实现则负责执行实际的日志操作。

在默认情况下,SLF4J并不会提供对缓冲区大小、刷新频率和异步输出的直接配置。这些功能是由具体的日志实现(比如Logback)来支持和管理的。下面是一些相关概念的讲解:

在Logback中,默认配置是针对每种Appender(输出目标,比如控制台或文件)的,默认缓冲区大小和刷新频率是不同的。这些默认配置可以通过Logback的XML配置文件进行修改。

缓冲区大小和刷新频率:

对于ConsoleAppender(控制台输出)和FileAppender(文件输出),Logback的默认缓冲区大小是 256 KB,刷新频率是每次写入事件时都会刷新缓冲区。这意味着当日志事件达到一定量或者达到一定时间间隔时,缓冲区的内容将被刷新到实际的输出设备(比如控制台或文件)中。

异步输出:

Logback默认情况下不启用异步输出,但可以通过AsyncAppender来实现异步输出。AsyncAppender可以配置一个队列,日志事件会先进入队列,然后由后台线程异步地处理和输出日志。这样可以减少对主线程的影响,并提高性能。
如果需要对缓冲区大小、刷新频率和异步输出进行自定义配置,可以在Logback的XML配置文件中针对具体的Appender进行配置。例如,可以通过设置和来调整缓冲区大小和刷新频率,通过配置来引用AsyncAppender以实现异步输出。

总的来说,Logback提供了灵活的配置选项,可以根据具体的需求来调整缓冲区大小、刷新频率和是否启用异步输出,从而达到更好的性能和适应特定的应用场景

相关文章:

  • 【flutter项目类型】project type如何区分
  • Python基础(二十九、pymsql)
  • 如何快速搭建个人博客
  • c++线程thread示例
  • qt5-入门
  • UE4 CustomDepthMobile流程小记
  • 业务逐字稿
  • 在探最大模定理
  • TR-069/TR-369设备管理
  • vue3 el-pagination 将组件中英文‘goto’ 修改 为 中文到‘第几’
  • Google Chrome 中出现 ERR_SSL_KEY_USAGE_INCOMPATIBLE 错误
  • yolov5 deepsort 行人/车辆(检测 +计数+跟踪+测距+测速)
  • 在数字化营销的大背景下,企业微信营销的挑战与应对策略
  • 【C++】wxWidgets编程的程序入口点
  • 桥接模式解析
  • CentOS 7 修改主机名
  •  D - 粉碎叛乱F - 其他起义
  • javascript 哈希表
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • PHP的Ev教程三(Periodic watcher)
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • SpiderData 2019年2月16日 DApp数据排行榜
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • uni-app项目数字滚动
  • yii2中session跨域名的问题
  • 产品三维模型在线预览
  • 欢迎参加第二届中国游戏开发者大会
  • 技术胖1-4季视频复习— (看视频笔记)
  • 你不可错过的前端面试题(一)
  • 配置 PM2 实现代码自动发布
  • 前言-如何学习区块链
  • 驱动程序原理
  • 一个SAP顾问在美国的这些年
  • 用 Swift 编写面向协议的视图
  • 怎么将电脑中的声音录制成WAV格式
  • ​TypeScript都不会用,也敢说会前端?
  • ​ubuntu下安装kvm虚拟机
  • # centos7下FFmpeg环境部署记录
  • # Redis 入门到精通(一)数据类型(4)
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (55)MOS管专题--->(10)MOS管的封装
  • (C语言)共用体union的用法举例
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (一)80c52学习之旅-起始篇
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转)visual stdio 书签功能介绍
  • .axf 转化 .bin文件 的方法
  • .gitignore
  • .NET BackgroundWorker
  • .NET C# 使用 iText 生成PDF
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .Net FrameWork总结