网易首页 > 网易号 > 正文 申请入驻

开发Java应用时如何用好Log

0
分享至

本篇文章,主要介绍应用如何正确使用日志系统,帮助用户从依赖、输出、清理、问题排查、报警等各方面全面掌握。

日志相关的包的种类及使用

日志系统与日志框架

每个应用为了方便排查问题都要输出日志,大家经常使用:log4j、logback等。我们先搞明白日志系统的整套体系是如何运作的。

  • 日志系统

直接负责打印输出日志,提供完整的日志输出能力:

  1. JUL

  • java.util.logging.*,java自带的日志系统简称JUL。目前除了Java自身代码很少被生态系统类库使用。

Log4j

  • https://logging.apache.org/ ,目前已经发展到2.x版本(2.x版本有超越logback的趋势),早期的1.x版本非常成功。开创日志系统模型(Logger\Appender\Level等概念)并被各种日志框架采用,且一直沿用至今

  • log4j可直接使用,也可配合日志框架一起使用

Logback

  • http://logback.qos.ch/ ,Log4j作者的另一个作品,(比Log4j1.x新,Log4j2.x旧)吸取多年经验教训重新设计的一套日志系统,使用更方便、功能更强、性能更好。

  • logback不能单独使用,需配置日志框架SLF4J一起使用


  • 日志框架

为了克服各种日志系统标准混乱,诞生了日志框架,日志框架不提供日志输出的功能,它定义标准,提供标准接口API,日志框架+日志系统=输出日志。

写代码过程中使用日志框架的好处:编码的时候调用日志框架API,部署的时候可根据不同的环境在多种日志系统中随意切换。

  1. JCL

  • https://commons.apache.org/proper/commons-logging/ ,前几年最流行的日志框架,由Apache社区维护,大量的老牌知名框架版本都在使用,比如Spring(甚至新版本依然在使用)。

SLF4J

  • https://www.slf4j.org/ ,Log4j作者推出,这几年最流行的日志框架,特别是配合Logback使用。

  • 当然也可以配合log4j使用

目前在Java生态趋势主要是使用:SLF4J+Logback组合。

如何正确组合使用日志系统和日志框架

上一节我们介绍了日志框架和日志系统,因为存在多套,所以:如何在系统中正确使用是我们的重点。

  • 日志系统之间互斥


  1. 日志框架:JCL和JCL-over-SLF4J桥接包直接互斥

  2. 日志系统:logback和slf4j-log4j12互斥,不能共存

我们大概可枚举出如下几种组合:

类型

slf4j+logback

目前最主流的玩法,除了依赖slf4j、logback,还需要考虑把二方库和三方库内部使用的jcl和log4j桥接到slf4j上来,并避免依赖反桥接的包

slf4j+log4j

不推荐。需要把slf4j桥接到log4j,并把jul桥接到slf4j

jcl+log4j

不推荐。这需要你直接使用jcl接口来编码,并把把slf4j桥接到log4j

log4j

不推荐。直接依赖日志系统

  • slf4j+logback组合

下面列出一个正确的slf4j+logback依赖,这个环节很重要,很多应用因为依赖搞不清楚经常出现日志丢失问题:


${xxxx}${yyyyy}

commons-loggingcommons-logging999-not-existcom.alibaba.externaljakarta.commons.logging999-not-existorg.slf4jslf4j-log4j12999-not-existcom.alibaba.externalorg.slf4j.slf4j-log4j12999-not-existorg.slf4jslf4j-nop999-not-existorg.slf4jslf4j-simple999-not-existcom.alibaba.externalorg.slf4j.slf4j-simple999-not-existlog4jlog4j999-not-existorg.slf4jslf4j-api${slf4j.version}org.slf4jslf4j-ext${slf4j.version}org.slf4jjcl-over-slf4j${slf4j.version}org.slf4jjul-to-slf4j${slf4j.version}org.slf4jlog4j-over-slf4j${slf4j.version}ch.qos.logbacklogback-core${logback.version}ch.qos.logbacklogback-classic${logback.version}


org.slf4jslf4j-apiorg.slf4jslf4j-extorg.slf4jjcl-over-slf4jorg.slf4jjul-to-slf4jorg.slf4jlog4j-over-slf4jch.qos.logbacklogback-corech.qos.logbacklogback-classic

  1. 先将依赖全部写在节点中,这样可影响间接依赖,如果只当初的使用dependencies节点,只会应用直接依赖

  2. 使用999-not-exist这样的版本:欺骗maven,直接依赖一个空包占位,这样Maven就不会再去依赖相同坐标的真实依赖,间接起到排包的作用

logback配置

  • 文件名和位置

应用类型

文件名

文件配置(启动模块)

spring-boot

logback-spring.xml

src/main/resources/

支持从spring-boot配置文件中直接读取property

普通java应用

logback.xml

src/main/resources/

WAR应用

logback.xml

src/main/webapp/WEB-INF/

需要依赖slf4j-ext,然后在web.xml里使用监听器挂载这个文件

单元测试和集成测试

logback-test.xml

src/test/resources/

  • 配置样例



class="ch.qos.logback.core.rolling.RollingFileAppender">${LOG_FILE}${LOG.PATTERN}${LOG.CHARSET}${LOG_FILE}.%d{yyyy-MM-dd}.%i.log750MB20GB









  1. 使用SizeAndTimeBasedRollingPolicy使日志可以根据大小和日期进行滚动

  2. 日志编码请使用UTF-8

  3. 请正确使用日志级别,不要统统输出error

  • 日志级别根据不同环境可配

  1. 如果是Pandora-boot或spring-boot可以直接在配置里使用property读取application.properties,application.properties在不同环境下使用-Dspring.profiles.active进行切换

  2. 普通应用和WAR应用:请使用autoconfig-maven-plugin插件

一些实用的日志技巧


动态修改日志级别

场景:应用在运行中,默认日志配置的打印级别是error,但是我现在想针对某个包或者某个类输出下info日志。

使用Arthas:https://arthas.aliyun.com/doc/logger.html,该工具提供了动态修改日志的能力。

追加业务信息到日志中,并格式化输出:追加MDC信息,方便排查问题

这是日志系统的一个扩容能力,可以把一些额外的信息输出到日志里,只需要在MDC上下文中写入kv,https://logback.qos.ch/manual/mdc.html

例如:


public static void main(String[] args) {//代码里使用MDC.put写入key为traceId的值//在logback.xml里就可以使用%X{traceId}进行输出MDC.put("traceId", UUID.randomUUID().toString().replace("-", ""));


配置定时日志磁盘占用清理

一定要配置合理的日志清理策略,避免磁盘被打爆,可借助日志框架自身能力,或借助可用的日志清理系统(如果有)

在logback.xml配置中,可通过配置带有清理作用的rollingPolicy来完成日志定时清理和滚动,例如:SizeAndTimeBasedRollingPolicy


这段配置的含义是:最多保留7天,单个文件最大50MB,该日志(包括滚动的)最大只能保存20GB。

不要封装一个日志Util,而应该直接使用日志框架进行输出

反例:LogUtil.log("通过封装的日志工具打印日志");

正例:log.info("直接使用日志框架的api进行日志输出");

理由:在日志输出的时候,日志系统会打印日志产生的原始位置:比如哪个包的哪个类,以及第几行(如果配置了[%L]),如果你使用LogUtil等自己封装的工具,所有的日志输出打印的位置都是LogUtil的,这样不便于做日志问题定位

系统日志打不出来或者丢日志排查思路

目前没有现成的工具帮你一键做好这个事情,下面给出一个排查思路

  1. 先明确该系统到底使用的是什么日志框架+日志系统组合,这个很重要,必须搞清是何种组合才可有针对性的处理后续步骤

  2. 如果是slf4j+logback组合,则可根据第一章列出的maven依赖进行排包处理,优先保证依赖的包没有错误,90%的情况下都是包依赖混乱导致的日志丢失

  3. 排查自己的logback配置文件是否放在正确的路径下、文件名是否正确,配置文件位置不对也会导致日志输出的不对甚至丢失

  4. 检查logback配置文件内部每个logger及其level配置是否正确,避免自己期望打印info,却配置了error

总结

日志系统的正确使用,对于应用的日常维护和问题排查尤为重要,所谓:工欲善其事,必先利其器。本篇文章重点讲解了日志系统的结构和包如何正确依赖,这是很多同学最容易犯的错误,需要格外注意并认真阅读,只有正确理解其中的含义才可以更好的使用日志系统,在日常使用中大家要不断总结经验。

最后希望文章提供的内容能够在日常开发和维护中为大家提供到切实的帮助。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
刘强东夫妇现身法国,31岁章泽天演奏会现场撒娇,背15万包包

刘强东夫妇现身法国,31岁章泽天演奏会现场撒娇,背15万包包

阿桥侃娱乐
2024-04-28 15:49:25
笑晕了!女子吐槽一个肥肠串8根签签,四川文旅回应,评论笑疯了

笑晕了!女子吐槽一个肥肠串8根签签,四川文旅回应,评论笑疯了

娱乐洞察点点
2024-04-27 17:30:12
回顾:男子在民政局门口捡漏,一见到离婚女人就问:要不结个婚?

回顾:男子在民政局门口捡漏,一见到离婚女人就问:要不结个婚?

佑宛故事汇
2024-04-27 16:19:17
四川失踪女老师已找到!失踪真相令网友愤怒,网友:她不配做老师

四川失踪女老师已找到!失踪真相令网友愤怒,网友:她不配做老师

酷小子玩体彩
2024-04-28 16:37:03
死亡直播:百万人观看女子死亡瞬间,镜头之外的丈夫也离奇毙命

死亡直播:百万人观看女子死亡瞬间,镜头之外的丈夫也离奇毙命

悬疑故事会
2023-01-04 15:37:52
凯特抢救细节曝光,要威廉解释

凯特抢救细节曝光,要威廉解释

娱乐圈的笔娱君
2024-04-28 20:08:04
哈格里夫斯:卡塞米罗的头球回顶难以置信,不知道他在想什么

哈格里夫斯:卡塞米罗的头球回顶难以置信,不知道他在想什么

懂球帝
2024-04-28 08:39:35
养老金调整总算敲定,农民、企退、事退养老金能涨多少钱?

养老金调整总算敲定,农民、企退、事退养老金能涨多少钱?

社保小达人
2024-04-28 08:45:45
这幅图不知骗了多少国人,关羽穿着铠甲点着蜡烛看线装书,合理吗

这幅图不知骗了多少国人,关羽穿着铠甲点着蜡烛看线装书,合理吗

作家李楠枫
2024-04-26 23:10:42
山东6人拟任副厅级

山东6人拟任副厅级

凤凰网青岛
2024-04-28 17:35:47
WCBA总决赛打完还不到一周 内蒙古外援琼斯就回到WNBA备战新赛季

WCBA总决赛打完还不到一周 内蒙古外援琼斯就回到WNBA备战新赛季

直播吧
2024-04-28 15:03:11
尘埃落定,肖战回归执教王曼昱?悬念揭晓,刘国梁的选择没错

尘埃落定,肖战回归执教王曼昱?悬念揭晓,刘国梁的选择没错

东球弟
2024-04-28 17:16:10
巧合还是泄密?西方国家每次都能提前知道中国最新消息,为什么呀

巧合还是泄密?西方国家每次都能提前知道中国最新消息,为什么呀

娱乐洞察点点
2024-04-28 16:00:42
祸害人三年的新冠消失了,四大奇怪现象却出现了,很多人没察觉

祸害人三年的新冠消失了,四大奇怪现象却出现了,很多人没察觉

李昕言温度空间
2024-04-19 21:12:55
掘金彻底慌了!湖人爆冷拿下G4,本场比赛曝出7大不可思议!

掘金彻底慌了!湖人爆冷拿下G4,本场比赛曝出7大不可思议!

小豆豆赛事
2024-04-28 21:00:25
广东男子卖肾为女友治病,女友康复后嫁他人,3年后报应惨重

广东男子卖肾为女友治病,女友康复后嫁他人,3年后报应惨重

一个人讲故事
2024-02-18 22:11:16
大批“爱国者”导弹正在到来!英国防部称已击落100多架俄军战机

大批“爱国者”导弹正在到来!英国防部称已击落100多架俄军战机

鹰眼Defence
2024-04-27 17:42:20
周鸿祎:试了库里南 才明白问界M9真是一千万以内最好SUV

周鸿祎:试了库里南 才明白问界M9真是一千万以内最好SUV

手机中国
2024-04-26 14:04:09
河南女孩爸爸暴打校霸后续:男孩母亲遭全网痛批,女孩舅舅爆内情

河南女孩爸爸暴打校霸后续:男孩母亲遭全网痛批,女孩舅舅爆内情

历史有些冷
2024-04-28 06:10:03
2.33亿美金!我必须帮助哈登,乔治给出G4承诺,伦纳德也有新动作

2.33亿美金!我必须帮助哈登,乔治给出G4承诺,伦纳德也有新动作

巴叔GO聊体育
2024-04-28 16:14:40
2024-04-28 21:56:49
开源中国
开源中国
每天为开发者推送最新技术资讯
6243文章数 34189关注度
往期回顾 全部

科技要闻

特斯拉生死时速,马斯克西天取经

头条要闻

周鸿祎的二手迈巴赫以990万元成交 半个车圈到场

头条要闻

周鸿祎的二手迈巴赫以990万元成交 半个车圈到场

体育要闻

赢了!詹皇末节14分制胜咆哮 压力给到KD

娱乐要闻

张杰谢娜发文为何炅庆生,亲如家人!

财经要闻

上财万字报告深度解读Q1经济

汽车要闻

鸿蒙首款行政旗舰轿车 华为享界S9实车亮相车展

态度原创

教育
健康
艺术
家居
手机

教育要闻

孩子长大能赚多少钱,看父母就知道

春天野菜不知不识莫乱吃

艺术要闻

共度北京108小时 北京当代2024“凝聚”全球36座城市100余家艺术机构

家居要闻

光影之间 空间暖意打造生活律动

手机要闻

苹果警告:睡觉时切勿将iPhone放枕头、身体下充电

无障碍浏览 进入关怀版