Java日志规范

记录一次@Slf4j log.info 日志信息未输出到日志文件的问题 配置文件不论是使用 bootstrap.yml 还是application.yml,均需要指定环境,需和 logback-spring.xml 中 springProfile 配置的name匹配,会选择指定的日志等级。是在Spring应用程序启动的早期加载的配置文件,它用于进行系统级别的配置,例如连接到配置服务器、配置加密等。在Spring Boot中,默认使用的是SLF4J(Simple Logging Facade for Java)作为日志抽象层,并且使用Logback作为默认的日志实现。 阅读详情

        一、日志级别

        org.apache.log4j.Level的日志级别总共有8种,从All到Off,日志输出优先级依次变高。通过日志级别,可以控制到应用程序中相应级别的日志信息的开关。比如应用中定义日志级别是Info,那么在Info级别以下的日志就不会输出,即Debug、Trace等级别的日志不会被输出。

日志级别的含义:

  1. OFF:最高级别,关闭日志,不打印日志。
  2. FATAL:致命日志,指明非常严重的可能会导致应用终止执行错误事件。
  3. ERROR:错误日志,这种级别的错误是系统无法容忍的。比如:空指针异常,数据库不可用等。
  4. WARN:警告日志,可能潜在的危险状况。比如:"当前数据不可用,使用缓存数据"。
  5. INFO:信息日志,指明描述信息,从粗粒度上描述了应用运行过程。
  6. DEBUG:调试日志,指明细致的事件信息,对调试应用最有用。该级别日志主要用于在开发、测试阶段输出。该级别的日志应尽可能地详尽,开发人员可以将各类详细信息记录到 DEBUG 里,起到调试的作用,包括参数信息,调试细节信息,返回值信息等等。
  7. TRACE:跟踪日志,指明程序运行轨迹,比DEBUG级别的粒度更细。
  8. ALL:所有日志级别,包括定制级别。

 二、日志规范

        代码中的日志输出需要注意一些事项:

1、使用lombok的@Slf4j注解

        推荐使用lombok的@Slf4j注解,它可以自动生成日志变量实例。

public class TestClass {
    private static final Logger log = LoggerFactory.getLogger(TestClass.class);
}

2、输出Exception里的全部Throwable信息

        打印错误日志时,需要将错误的堆栈全部打印出来,不能将堆栈信息打印成文本。

//正例
try {
    a();
} catch (Exception e) {
    log.error("invoke error ", e);
    //log.error("invoke msg:{} ", ex.getMessage(),e);
}

//反例
try {
    a();
} catch (Exception e) {
    log.error("invoke error errorMessage:{}", e.getMessage());
}

 3、禁止记录日志后又抛出异常

        记录日志后又抛出异常会导致多次打印错误日志,浪费磁盘空间。

//正例
try {
    b();
} catch (Exception e) {
    throw new BizException("方法异常", e);
}

//反例
try {
    b();
} catch (Exception e) {
    log.error("invoke error ", e);
    throw new BizException("方法异常", e);
}

4、禁止出现System print

         代码里禁止使用System.out.println和System.error.println语句。因为调用这两个方法没法将日志信息统一打印到日志文件里,导致日志丢失。

5、禁止出现printStackTrace

        代码里不允许出现printStackTrace,printStackTrace打印出的堆栈日志跟正常输出或者业务代码执行日志是交错混合在一起的,在并发大日志输出多的情况下,查看异常日志就变更的非常困难,因为一块日志都不在一起了。而且刷控制台的时候如果堆栈信息过多,可能导致内存浪费。

//反例
try {
    b();
} catch (Exception e) {
    e.printStackTrace();
}

6、 需要考虑日志性能

        如果代码较为核心,并且执行频率也高,可以考虑使用低优先级的级别,如使用info,debug等。或者加条件判断。如下所示:

if (log.isDebugEnabled) {
    log.debug("XXX {}", "mss");
}

7、info日志中,建议使用占位符替换字符串拼接

        使用字符串拼接不仅影响效率,更影响代码可读性。

//正例
log.info("invoke success userId:{}, userName:{}", userId, userName);
//反例
log.info("invoke success userId:" + userId + ", userName:" + userName);

8、禁止在循环语句中打印日志

        在循环语句中打印日志会造成打印日志时的多次IO,从而降低代码性能。如果非要将for循环中的信息打印出来,建议在内存中统一记录,在循环外进行打印。

//正例
int successCount = 0;
for(int i=0; i<2000; i++) {
    //省略代码
    if (success) {
        successCount++;
    }
}
log.info("成功{}次", successCount);

//反例
int successCount = 0;
for(int i=0; i<2000; i++){
    //省略代码
    if (success) {
        successCount++;
    }
    log.info("第{}次调用,成功{}次", i, successCount);
}

9、禁止打印集合信息

        有时候方法接口可能返回一个集合信息,而集合中的每个元素可能包含了很多字段,这样就导致大量信息被打印,造成内存和磁盘的消耗,有时候可能会导致内存溢出,磁盘耗尽。建议打印集合的id信息(如果userIds太大,比如超过几百上千的,也要避免打印)或者只打印入参信息。

//正例
private List<User> getUserList(String param) {
    List<User> userList = getUserListFromDB(param);
    List<Long> userIds = extractUserIds(userList);
    //如果userIds太大也要避免打印
    log.inf(" userIds:{}", JSON.toString(userIds));
    return userList;
}
//或者只打印入参
private List<User> getUserList(String param) {
    List<User> userList = getUserListFromDB(param);
    log.inf(" param:{}", param);
    return userList;
}

//反例
private List<User> getUserList(String param) {
    List<User> userList = getUserListFromDB(param);
    log.inf(" userList:{}", JSON.toString(userList));
    return userList;
}

10、禁止打印敏感信息

        日志中尽量不要包含敏感信息,对于敏感信息如用户身份证号码,密码可以加密后存储;以防止日志文件不慎外泄时保全用户的数据安全。

11、禁止打印没有意义的日志

        不记录对于排查故障毫无意义的日志信息,日志信息一定要带有业务信息。

//正例
public void handleLogic(Long userId) {
   log.info("handleLogic begin userId:{}", userId);
   //...
}

//反例
public void handleLogic(Long userId) {
   log.info("handleLogic begin ");
   //...
}

12、禁止打印日志的代码出现bug

        打印日志的时候,代码不能有bug,否则影响正常业务。如NPE等。

//正例
public void handleLogic(User user) {
   //user判空
   log.info("handleLogic begin userId:{}", user != null ? user.getId() : "");
   //...
}

//反例
public void handleLogic(User user) {
   //此处如果user为null会报NPE,导致后续业务无法执行
   log.info("handleLogic begin userId:{}", user.getId());
   //...
}

13、区别对待日志

        常用的日志级别有Debug、Info、Warn、Error。

        Error日志:记录系统逻辑错误、异常或违反重要业务规则的日志信息(需要人工干预)。

        Warn日志:记录一些业务异常可以通过引导重试就能恢复正常的日志信息,如用户输入参数错误。

        Info日志:记录系统关键信息,如初始化系统配置、业务状态变化,或者用户业务流程中的核心处理等,方便日常运维工作以及错误回溯时上下文场景复现。

        Debug日志:主要用于在开发、测试阶段输出。该级别的日志应尽可能将各类详细信息记录到 Debug 里,起到调试的作用,包括参数信息,调试细节信息,返回值信息等,禁止在线上环境使用Debug日志。

java 订单日志log.info存入数据库 解耦 以及自定义数据参数 项目组有一个需求 要记录所有的订单日志进入数据库 方便在后台直接查看分析 目前项目已经定型 所有日志都是通过logback的log.info进行打印的 阅读详情

相关推荐

系统日志规范及最佳实践

日志,维基百科中对其的定义是一个或多个由服务器自动创建和维护的日志文件,其中包含其所执行活动的列表。一个打印良好的日志文件可为开发人员提供精确的系统记录,可辅助开发人员定位到系统错误发生的详情及根源。在 Java 应用程序中,通常使用日志文件来记录应用程序运行过程中的重要逻辑参数及异常错误,辅之日志采集系统(ELK、DTM)构建系统监控体系。

zhangkaixuan456的博客 3246

java日志(log)使用笔记

java日志(log)使用笔记

enthan809882的博客 7070

java日志总结系列1-日志规范

最近在公司做日志标准化治理,准备总结一些日志相关的文档。 文章目录java日志总结系列1-日志规范日志级别日志内容日志注意事项 java日志总结系列1-日志规范 日志是系统的重要组成部分,用于记载系统的执行记录、审计、排查问题、数据采集等。日志需要持久化,通常日志仅仅需要持久化到磁盘,或者存储到ES,有些场景也需要将日志存储到MySQL中,例如重要的请求日志、用户抽奖的执行记录、提现操作等。 本系列主要讲述java系统中存储到文件、ES中的日志。 日志级别 由高到低可分为error、warn、info、de

gentlezuo的博客 636

java日志处理log

SpringBoot日志处理一.安装Lombok二.使用三.log填坑 一.安装Lombok 使用idea下载Lombok插件 File—>Setting----->plungin 搜索Lombok插件下载,安装好后需要重启idea。 二.使用 如果想使用log.info等等时,先在类上面加个注解@Slf4j,然后就可以使用log函数了。 看起来十分简单,但是这仅仅是开始,往下走。 三.log填坑 比如这个controller层,进入时我想记录下参数,这很平常吧,我刚开始是这样做的, @A

weixin_43997548的博客 5261

Java 打印日志的规范分享

良好的日志记录规范能够大大提高系统的可维护性和可调试性。本文分享了 Java 打印日志的规范,包括选择合适的日志框架、日志级别的使用、记录上下文信息、避免敏感信息、配置日志滚动策略等最佳实践。通过遵循这些规范,您可以建立一个高效、清晰的日志记录体系,从而提升系统的可靠性和安全性。如果遇到问题或有疑问,建议查阅相关文档或寻求社区支持。

私聊前往站内信:https://i.youkuaiyun.com/#/msg/chat/weixin_44976692 1万+

ArcGIS小白必看:如何用3D Analyst工具将二维点线秒变三维模型(附详细步骤)

本文为ArcGIS初学者提供了利用3D Analyst工具将二维点、线数据快速转换为三维模型的完整指南。详细讲解了基于属性字段和数字高程模型(DEM)两种核心方法,并附上从数据准备、工具操作到三维场景可视化与问题排查的详细步骤,帮助用户轻松实现从平面到立体的空间数据建模。

nft7creator的博客 140

Java日志规范最佳实践

日志:记录程序的运行轨迹,方便查找关键信息,也方便快速定位解决问题。日志的作用就是在测试、生产环境没有Debug调试工具时开发和测试人员定位问题的手段。好的日志,可以根据日志的轨迹快速定位并解决线上问题,反之,不好的日志,不仅无法辅助定位问题反而可能会影响到程序的运行性能和稳定性。通常,我们认为日志就像写作一样应该包含5W1H每条日志对应服务中就是一个事件,我们可以将每个事件拆分成各个组成部分,而拆分的维度就很重要,其中5W1H。

weixin_42189371的博客 1746

SAP MM新手避坑指南:工厂间调拨用301还是303?手把手教你选对移动类型

本文深入解析SAP MM模块中工厂间调拨的301与303移动类型,帮助新手避开常见陷阱。通过对比一步法(301)和两步法(303+305)的核心差异、适用场景及财务影响,提供清晰的决策框架和实战技巧,确保库存调拨的准确性和效率。

weixin_29223603的博客 346

日志规范-JAVA

日志,一个或多个由服务器自动创建和维护的日志文件,其中包含其所执行活动的列表。一个打印良好的日志文件可为开发人员提供精确的系统记录,可辅助开发人员定位到系统错误发生的详情及根源。在 Java 应用程序中,通常使用日志文件来记录应用程序运行过程中的重要逻辑参数及异常错误,辅之日志采集系统ELK构建系统监控体系。

haoxin963的专栏 2460

手把手教你搭建一个属于自己的网站-适合零基础小白,文末附网站模板

手把手教你搭建一个属于自己的网站-适合零基础小白写在前面搭建需求功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 写在前面 前段时间休息想着搭一个属于自己的网站,几经尝试终于成功了,网上其实有很多教程,但很多,希望这篇文章能够帮助到

qq_46788925的博客 1万+

Cadence学习之路(六)元器件封装绘制

使用Allegro PCB Designer绘制元器件封装

qq_46757048的博客 1万+

JAVA日志规范

JAVA日志规范强调了日志级别的重要性,包括error、warn、info、debug和trace,并建议根据业务影响选择合适的级别。日志应记录方法的入参和出参,并采用包含时间戳、日志级别和线程名等信息的格式。在条件分支中,每个分支的首行应打印日志,且低级别日志需进行开关判断。推荐使用SLF4J日志框架,采用参数占位符而非字符串拼接,并建议异步输出日志以提升性能。此外,应避免使用e.printStackTrace(),并确保在线上环境关闭debug日志,以防止日志过多影响系统性能。

itboy 1691

最新Linux CSI Tools安装教程(两台主机,一发一收)(监控模式)

无线感知之CSI Tools工具安装,最新在监控模式下采集CSI数据,

h1998040218的博客 3028

【JAVA开发规范】日志规范

写好代码很重要,日记记录也非常重要。我们可以通过日志记录代码的执行流程、运行状态、关键指标。

会飞的架狗师的博客 2496

Quartus ||———基于Verilog HDL的数字秒表设计实验

Quartus ||———基于Verilog HDL的数字秒表设计实验一、实验目的二、实验步骤(一)新建工程(二)添加设计文件(三)综合分析与功能仿真1、综合分析2、功能仿真 一、实验目的 用Verilog HDL设计一个数字跑表,所需引脚和功能如下: 二、实验步骤 (一)新建工程 在创建好工程名称后,选定芯片类型 (二)添加设计文件 新建Verilog文件,键入代码如下 module n_clk_top( input clk, input rese

TBMmagic的博客 5525

AI智能体实战:从LangChain到多智能体协作的自动化新范式

在人工智能技术快速发展的今天,大语言模型(LLM)已成为推动自动化变革的核心驱动力。其原理在于通过深度学习海量文本数据,使模型能够理解、生成自然语言并执行推理任务。这一技术进步催生了AI智能体(AI Agent)这一新兴概念,它赋予自动化系统自主决策和动态规划能力,从而突破了传统脚本和RPA工具在固定流程上的局限。从技术价值看,AI智能体框架通过封装LLM调用、工具集成与流程编排,显著降低了构建复杂人机协同应用的开发门槛。在实际应用场景中,智能体尤其擅长处理信息调研、内容创作辅助、数据分析等需要处理非结构化

weixin_33730836的博客 773

Java 日志规范

前言 一个在生产环境里运行的程序如果没有日志是很让维护者提心吊胆的,有太多杂乱又无意义的日志也是令人伤神。程序出现问题时候,从日志里如果发现不了问题可能的原因是很令人受挫的。本文想讨论的是如何在Java程序里写好日志。 一般来说日志分为两种:业务日志和异常日志,使用日志我们希望能达到以下目标: 对程序运行情况的记录和监控; 在必要时可详细了解程序内部的运行状态; 对系统性能的影响尽量小 ...

路人而已的专栏 716

【OpenClaw从入门到精通】第11篇:OpenClaw 2026多模态实战全攻略:OCR/语音/图像自动化(附完整代码+双部署方案)

本文聚焦OpenClaw 2026版核心升级的多模态能力,从底层架构原理到实操落地全流程拆解。先解析“统一指令解析+多工具适配器”的核心设计逻辑,再提供阿里云规模化部署(适合批量任务)与本地汉化版部署(适合隐私数据调试)的详细步骤,含依赖安装、配置验证完整操作;随后落地三大高频实战场景——OCR合同信息结构化提取、会议录音自动转写纪要、电商商品图片智能打标,每个场景均提供可直接运行的完整代码、执行结果演示及流程说明;最后补充多模态任务避坑指南、性能优化技巧与成本控制方案。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2611

java日志规范

日志规范定义

heroguo007的专栏 1073

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【规范六】Java体系日志编写规范

规范Java研发人员的日志编写,以提高线上问题的定位和排查效率,增强系统的稳定性,降低系统风险和漏洞。

小灰~的博客 1506

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

java后台日志规范_Java日志规范(转载)

Overview一个在生产环境里运行的程序如果没有日志是很让维护者提心吊胆的,有太多杂乱又无意义的日志也是令人伤神。程序出现问题时候,从日志里如果发现不了问题可能的原因是很令人受挫的。本文想讨论的是如何在Java程序里写好日志。一般来说日志分为两种:业务日志和异常日志,使用日志我们希望能达到以下目标:对程序运行情况的记录和监控;在必要时可详细了解程序内部的运行状态;对系统性能的影响尽量小;Java...

weixin_42370434的博客 1204

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

java 日志打印规范

日志要求: 重要日志一定要打印到日志文件 日志文件应该每天滚动一次,日志多的可以每个小时滚动一次 日期必须精确到毫秒,而不是秒 确保日志是按事件顺序输出 【推荐】最好能打印调用方信息,比如访问者ip等信息 日志文件要可以方便使用grep语句查看 日志文件归档:需要告知运维归档 日志预警,通过ES实现 对于无法预知的异常,一定要打印堆栈:LOGGER.er...

时间道的博客 7195

【软件开发规范篇】JAVA后端开发日志记录规范

现在的软件项目都是团队多人合作一起开发,软件架构的复杂性也需要协同开发完成,如何高效地协同呢?无规矩不成方圆,无规范难以协同。对软件来说,适当的规范和标准绝不是消灭代码内容的创造性、优雅性,而是限制过度个性化,以一种普遍认可的统一方式一起做事,提升协作效率,降低沟通成本。一个打印良好的日志文件可为开发人员提供精确的系统记录,可辅助开发人员定位到系统错误发生的详情及根源。在Java应用程序中,通常使用日志文件来记录应用程序运行过程中的重要逻辑参数及异常错误,辅之日志采集系统(比如ELK)构建系统监控体系。

分享是一种境界,勤于分享,乐于分享! 3233
上一篇: logback-spring.xml配置详解
下一篇: mac的crontab没有执行的原因
datastructure18
博客等级 码龄19年 6粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值