百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

java日志框架(java 日志框架)

ccwgpt 2024-10-01 08:11 34 浏览 0 评论



看了一本书,叫做《java工程师修炼之道》,第107页讲了各种日志框架及其配置。平时我们开发,都是在控制台输出日志。可以使用日志框架进行日志输出,也可以使用System.out.println(xxx)进行日志输出。这里非常不推荐使用System.out.println(xxx),一是不容易控制,当只需要更高级别的日志输出的时候,就只有注释代码了。并且输出没有指定的格式和提供更多信息,只有开发本人知道在哪里输出的日志,干什么用的。还有一点就是System.out 这句话,其实会有上下文切换,由用户态切换到内核态,频繁的切换开销太大。所以, 啰嗦了这么多,日志框架是一定要用的。它不仅可以输出到控制台,也可以输出到文件,文件可以按指定方式生成,比如每天一个,超过某个大小生成等等。指定不同的日志级别输出到不同的文件,或者某个包的日志单独输出。个别日志框架为了提高性能,还会有日志缓冲,日志异步输出等方法。
下面呢,就是原书中的摘抄,或者我自己的理解了,有兴趣可以看原书,这比二手知识更加准确和成体系。
目前java提供的日志框架有:
JDK Logging
Apache Log4j
Logback
ApacheLog4j2
此外,还有两个用于实现日志统一的框架Apache Commons Logging、SLFJ。与上述框架不同,这两个框架只是一个门面,并没有日志框架的具体实现,可以认为是日志接口框架。

1 JDK Logging是JDK自带的日志框架,性能不高,所以开发用得少,略。

2 Log4j是使用的很广泛的日志框架,支持xml,properties配置。
它的properties的配置,例如:

log4j.rootLogger=INFO,appenderA

按照我的理解,句话是说日志框架的根配置,默认的日志级别是INFO,也就是只有INFO日志级别及其以上的才会被输出,逗号后面跟着的是appender,这个我们在后续需要对它进行配置,也就是输出的目的地,格式等等信息。可以跟多个appender,逗号分隔。这样就是一份日志输出到不同的地方。最后我们可以指定其余的logger,它是类似于继承自rootLogger,除了自身的日志进行输出,rootLogger的日志也会输出到子logger的appender中。当然我们也可以不让它输出。
上面的appenderA的定义可以是下面这样的:

log4j.appender.appenderA = org.apache.log4j.ConsoleAppender
log4j.appender.appenderA.Target = System.out
log4j.appender.appenderA.layout = org.apache.log4j.PatternLayout
log4j.appender.appenderA.layout.ConversionPattern =  %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n

这个appenderA是输出到控制台的。那么INFO及其以上的日志信息就会输出到控制台。

我们再来配置一个子logger,比如:

log4j.logger.order=DEBUG,DRF
log4j.appender.DRF = org.apache.log4j.DailyRollingFileAppender
log4j.appender.DRF.layout=org.apache.log4j.PatternLayout
log4j.appender.DRF.layout.ConversionPattern=%p[%t]%d{yyy-MM-dd HH:mm:ss,SSS} %m%n
log4j.appender.DRF.File =./logs/log.log
log4j.appender.DRF.DatePattern = '.'yyyy-ww'.log' 
log4j.appender.DRF.Append = true
log4j.appender.DRF.Encoding = UTF-8

这个是子logger的配置,它输出DEBUG及其以上的信息,输出到文件,这个文件每天生成一个。
这个子logger会输出哪些内容到文件呢:自身的DEBUG及其以上的信息会输出,然后rootLogger的INFO及其以上的信息会输出。也就是INFO及其以上的日志信息会重复输出,这不仅冗余,而且也对分析日志造成了困扰,我们不想要rootLogger的信息输入,怎么办呢,在子logger的配置中加入:

log4j.additivity.order=false

使用:

import org.apache.log4j.Logger;

public class TestA {
    private static final Logger LOG = Logger.getLogger(this.getClass());
    public void methodA(){
        if(LOG.isDebugEnabled()){// 当不启用debug级别的时候,就不走日志打印的逻辑,减少不必要的运算。
            LOG.debug("xxx");
        }
    }
}

为了应对某一个时间内,大量日志信息进入appender中,可以配置缓冲,让日志在appender中累积,等足够量了,再一次性写入,减少I/O操作:

log4j.appender.DRF.BufferedIO=true
#Buffer单位为字节,默认是8K,IO BLOCK大小默认也是8K
log4j.appender.DRF.BufferSize=8192

除了缓冲,还可以使用AsyncAppender来做异步日志:

 <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">  
     <param name="BufferSize" value="512"/>  
     <appender-ref ref="DRF"/>
 </appender>

3 Logback
是Log4j的创始人设计的又一个开源日志组件,改进了Log4j。
同样提供异步缓冲等功能。日志可以使用占位符。

4 Log4j2
2015年8月,官方正式宣布Log4j 1.x系列声明终结,推荐用户升级到Log4j2,并号称在修正了Logback固有的架构问题的同时,改进了Logback的功能。Log4j2 不兼容Log4j,Log4j2 不仅提供了日志的实现,也提供了门面,目的是为了统一日志框架。
Log4j2支持xml,json,yaml,不再支持properties。
配置方法可以到网上随便一找都有,跟Log4j配置思路大同小异。同样也有缓冲和异步日志。
相比之前需要先判断日志级别再输出,Lo4j2提供了占位符功能,所以可以直接写:


LOG.debug("错误:{}",msg);

上面提到的4个框架是实际的日志框架,每种都有不同的写法,对于开发者而言,跟代码绑定死了,实际上限制了日志框架的自由切换。如果日志框架按照统一的日志接口编程那么,我们就可以做到无缝切换日志框架了,这就是Apache Commons Logging 与SLFJ的初衷。
Apache Commons Logging简称为JCL,是Apache开源的日志门面框架,Sppring中使用的日志框架就是JCL。使用如下:

import org.apache.commons.LogFactory;
private static final Log LOG = LogFactory.get(this.getClass());
LOG.info("xxx");
maven引入JCL的依赖:commons-logging

JCL检测到类路径下的日志实现框架,然后使用该日志框架作为实现。在maven中最好排除其余的日志包,以免造成日志框架的循环依赖。

相关推荐

自己动手写Android数据库框架_android开发数据库搭建

http://blog.csdn.net/feiduclear_up/article/details/50557590推荐理由关于Android数据库操作,由于每次都要自己写数据库操作,每次还得去...

谷歌开源大模型评测工具LMEval,打通谷歌、OpenAI、Anthropic

智东西编译|金碧辉编辑|程茜智东西5月28日消息,据科技媒体TheDecoder5月26日报道,当天,谷歌正式发布开源大模型评测框架LMEval,支持对GPT-4o、Claude3.7...

工信部:着力推动大模型算法、框架等基础性原创性的技术突破

工信部新闻发言人今日在发布会上表示,下一步,我们将坚持突出重点领域,大力推动制造业数字化转型,推动人工智能创新应用。主要从以下四个方面着力。一是夯实人工智能技术底座。通过科技创新重大项目,着力推动大模...

乒乓反复纠结“框架不稳定”的三个小误区

很多球友由于对框架的认知不清晰,往往会把“框架不稳定”当成一种心理负担,从而影响学球进度,其典型状态就是训练中有模有样,一旦进入实战,就像被捆住了手脚。通过训练和学习,结合“基本功打卡群”球友们交流发...

前AMD、英特尔显卡架构师Raja再战GPU,号称要全面重构堆栈

IT之家8月5日消息,知名GPU架构师拉贾科杜里(RajaKoduri)此前曾先后在AMD和英特尔的显卡部门担任要职。而在今日,由Raja创立的GPU软件与IP初创企...

三种必须掌握的嵌入式开发程序架构

前言在嵌入式软件开发,包括单片机开发中,软件架构对于开发人员是一个必须认真考虑的问题。软件架构对于系统整体的稳定性和可靠性是非常重要的,一个合适的软件架构不仅结构清晰,并且便于开发。我相...

怪不得别人3秒就知道软考案例怎么做能50+

软考高级统一合格标准必须三科都达到45分,案例分析也一直是考生头疼的一门,但是掌握到得分点,案例能不能50+还不是你们说了算吗?今天就结合架构案例考点,分享实用的备考攻略~一、吃透考点,搭建知识框架从...

UML统一建模常用图有哪些,各自的作用是什么?一篇文章彻底讲透

10万+爆款解析:9大UML图实战案例,小白也能秒懂!为什么需要UML?UML(统一建模语言)是软件开发的“蓝图”,用图形化语言描述系统结构、行为和交互,让复杂需求一目了然。它能:降低沟通成本避...

勒索软件转向云原生架构,直指备份基础设施

勒索软件组织和其他网络犯罪分子正越来越多地将目标对准基于云的备份系统,对久已确立的灾难恢复方法构成了挑战。谷歌安全研究人员在一份关于云安全威胁演变的报告中警告称,随着攻击者不断改进数据窃取、身份泄露和...

ConceptDraw DIAGRAM:释放创意,绘就高效办公新未来

在当今数字化时代,可视化工具已成为提升工作效率和激发创意的关键。ConceptDrawDIAGRAM,作为一款世界顶级的商业绘图软件,凭借其强大的功能和用户友好的界面,正逐渐成为众多专业人士的首选绘...

APP 制作界面设计教程:一步到位_app界面设计模板一套

想让APP界面设计高效落地,无需繁琐流程,掌握“框架搭建—细节填充—体验优化”三步法,即可一步到位完成专业级设计。黄金框架搭建是基础。采用“三三制布局”:将屏幕横向三等分,纵向保留三...

MCP 的工作原理:关键组件_mcp部件

以下是MCP架构的关键组件:MCP主机:像ClaudeDesktop、GitHubCopilot或旅行助手这样的AI智能体,它们希望通过MCP协议访问工具、资源等。MCP主机会...

软件架构_软件架构师工资一般多少

软件架构师自身需要是程序员,并且必须一直坚持做一线程序员。软件架构应该是能力最强的一群程序员,他们通常会在自身承接编程任务的同时,逐渐引导整个团队向一个能够最大化生产力的系统设计方向前进。软件系统的架...

不知不觉将手机字体调大!老花眼是因为“老了吗”?

现在不管是联系、交友,还是购物,都离不开手机。中老年人使用手机的时间也在逐渐加长,刷抖音、看短视频、发朋友圈……看手机的同时,人们也不得不面对“视力危机”——老花眼,习惯眯眼看、凑近看、瞪眼看,不少人...

8000通用汉字学习系列讲座(第046讲)

[表声母字]加(续)[从声汉字]伽茄泇迦枷痂袈笳嘉驾架咖贺瘸(计14字)嘉[正音]标准音读jiā。[辨形]上下结构,十四画。会意形声字,从壴从加,加也表声。注:从壴,字义与鼓乐有关;从加,字义与...

取消回复欢迎 发表评论: