当前位置:首页 > 科技  > 软件

日志打印的这10个坑,你至少踩过一个...

来源: 责编: 时间:2024-06-27 07:57:17 265观看
导读前言大家好,我是捡田螺的小男孩.我们日常开发中,经常需要打印日志.但是不当的日志使用可能会导致各种问题。整理了日志打印的10个坑,希望大家都能避坑~~1.忽视日志级别,反手就是INFO常见的日志级别有5种,分别是error、

前言

大家好,我是捡田螺的小男孩.VYC28资讯网——每日最新资讯28at.com

我们日常开发中,经常需要打印日志.但是不当的日志使用可能会导致各种问题。整理了日志打印的10个坑,希望大家都能避坑~~VYC28资讯网——每日最新资讯28at.com

1.忽视日志级别,反手就是INFO

常见的日志级别有5种,分别是error、warn、info、debug、trace。日常开发中,我们需要选择恰当的日志级别,不要反手就是打印info哈~VYC28资讯网——每日最新资讯28at.com

  • ERROR:错误日志,指比较严重的错误,对正常业务有影响,需要运维配置监控的;
  • WARN:警告日志,一般的错误,对业务影响不大,但是需要开发关注;
  • INFO:信息日志,记录排查问题的关键信息,如调用时间、出参入参等等;
  • DEBUG:用于开发DEBUG的,关键逻辑里面的运行时数据;
  • TRACE:最详细的信息,一般这些信息只记录到日志文件中

2.过度日志记录

  • 问题:记录了过多的日志信息,导致日志文件过大,难以管理和分析。

比如这个例子(过度记录DEBUG级别的日志):VYC28资讯网——每日最新资讯28at.com

// 过度记录DEBUG级别的日志public void processData() {    logger.debug("Entering processData method.");    // 业务逻辑    logger.debug("Exiting processData method.");}

正例应该这样(仅记录必要的日志信息)VYC28资讯网——每日最新资讯28at.com

// 仅在异常和重要步骤中记录日志public void processData() {    try {        logger.info("Start processing data.");        // 业务逻辑        logger.info("Finished processing data.");    } catch (Exception e) {        logger.error("Error occurred while processing data: ", e);    }}

我们应当根据日志的重要性设置不同的日志级别(如ERROR、WARN、INFO、DEBUG),只记录必要的日志信息,避免日志打印处理成流水账.VYC28资讯网——每日最新资讯28at.com

3.将debug日志直接带到生产环境

有些伙伴乱用日志级别,甚至将DEBUG级别的日志用于生产环境。VYC28资讯网——每日最新资讯28at.com

反例(将DEBUG级别的日志直接用于生产环境):VYC28资讯网——每日最新资讯28at.com

logger.debug("This is a debug message,should not be logged in production");

正例 (debug日志级别,最好判断一下是否开启):VYC28资讯网——每日最新资讯28at.com

if(log.isDebugEnable()){  logger.debug("This is a debug message,should not be logged in production"); }

4.日志缺少上下文信息

大家可以看下这行日志,觉得有啥问题VYC28资讯网——每日最新资讯28at.com

logger.info("User login request");

很明显,日志缺少上下文信息,并不方便排查.比如说,你想知道是哪个用户的登录请求嘛? 至少把userId 打印出来吧,如下:VYC28资讯网——每日最新资讯28at.com

logger.info("User login request,userId:{}",userId);

5.同步IO导致性能问题

同步日志记录会阻塞主线程,影响系统性能。因此使用异步日志框架(比如Log4j 2的异步日志记录器)来减少对性能的影响。VYC28资讯网——每日最新资讯28at.com

// 使用Log4j 2的异步日志<Configuration status="WARN">    <Appenders>        <Console name="Console" target="SYSTEM_OUT">            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>        </Console>        <Async name="AsyncConsole">            <AppenderRef ref="Console"/>        </Async>    </Appenders>    <Loggers>        <Root level="info">            <AppenderRef ref="AsyncConsole"/>        </Root>    </Loggers></Configuration>

6.日志配置不合理:

有些日志配置文件复杂,难以维护;配置文件中存在硬编码路径。如下:VYC28资讯网——每日最新资讯28at.com

// log4j.properties 示例log4j.rootLogger=INFO, filelog4j.appender.file=org.apache.log4j.RollingFileAppenderlog4j.appender.file.File=/var/log/tianluoboy.log

应当使用灵活的配置VYC28资讯网——每日最新资讯28at.com

// logback.xml 示例<configuration>    <property name="LOG_HOME" value="${LOG_HOME:-/var/log/myapp}"/>    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">        <file>${LOG_HOME}/tianluoboy.log</file>        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">            <fileNamePattern>${LOG_HOME}/tianluoboy.%d{yyyy-MM-dd}.log</fileNamePattern>            <maxHistory>30</maxHistory>        </rollingPolicy>        <encoder>            <pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>        </encoder>    </appender>    <root level="info">        <appender-ref ref="FILE"/>    </root></configuration>

7.日志内容泄露敏感信息

日志中记录了用户的敏感信息(如密码、信用卡号),存在安全风险。VYC28资讯网——每日最新资讯28at.com

logger.info("User password: {}", password);

这都把用户的密码打印出来了...解决方法就是,不能打印密码这些关键信息,如果是手机号、邮箱等敏感信息,则可以脱敏、或者掩码处理。VYC28资讯网——每日最新资讯28at.com

8.日志文件轮转和归档配置不当。

如果日志文件过大时未能及时轮转,就很坑.VYC28资讯网——每日最新资讯28at.com

// 简单的日志配置,没有轮转策略log4j.appender.file.File=tianluoboy.log

日志要配置合理的轮转和归档策略,避免文件过大.VYC28资讯网——每日最新资讯28at.com

// logback.xml 示例<configuration>    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">        <file>tianluoboy.logg</file>        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">            <fileNamePattern>tianluoboy.%d{yyyy-MM-dd}.log</fileNamePattern>            <maxHistory>30</maxHistory>        </rollingPolicy>        <encoder>            <pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>        </encoder>    </appender>    <root level="info">        <appender-ref ref="FILE"/>    </root></configuration>

9.日志框架漏洞的问题

有些日志框架,在低版本,可能会存在安全漏洞问题.甚至有些可能会存在漏洞还没被发现.VYC28资讯网——每日最新资讯28at.com

我们如何做呢? 如果是低版本存在安全漏洞的日志框架,我们要尽快升级到最新版本.VYC28资讯网——每日最新资讯28at.com

比如Log4Shell 是Log4j 2.x中一个严重的远程代码执行(RCE)漏洞。攻击者可以通过特制的日志消息来触发JNDI查找请求,从而在受影响的系统上执行任意代码。VYC28资讯网——每日最新资讯28at.com

可以升级到Log4j 2.17.0或更高版本,这些版本已经修复了该漏洞。VYC28资讯网——每日最新资讯28at.com

尚未被发现的漏洞,也可能潜在地影响应用程序的安全性。我们要使用成熟的日志框架,并且要定时更新和维护.VYC28资讯网——每日最新资讯28at.com

10.错误配置LevelFilter造成日志重复记录

错误配置LevelFilter可能导致日志重复记录的问题.比如你这样配置:VYC28资讯网——每日最新资讯28at.com

<Configuration status="WARN">    <Appenders>        <Console name="ConsoleAppender" target="SYSTEM_OUT">            <PatternLayout pattern="%d [%t] %-5level: %msg%n%throwable"/>            <Filters>                <LevelFilter level="INFO" notallow="ACCEPT" notallow="DENY"/>            </Filters>        </Console>        <File name="FileAppender" fileName="app.log">            <PatternLayout pattern="%d [%t] %-5level: %msg%n%throwable"/>            <Filters>                <LevelFilter level="INFO" notallow="ACCEPT" notallow="DENY"/>            </Filters>        </File>    </Appenders>    <Loggers>        <Root level="INFO">            <AppenderRef ref="ConsoleAppender"/>            <AppenderRef ref="FileAppender"/>        </Root>    </Loggers></Configuration>

在上述配置中,由于两个appender的LevelFilter条件相同,导致每条INFO级别的日志都会同时被两个appender记录,产生了重复日志。VYC28资讯网——每日最新资讯28at.com

可以使用不同的过滤器策略来确保日志只被一个appender记录:VYC28资讯网——每日最新资讯28at.com

<Configuration status="WARN">    <Appenders>        <Console name="ConsoleAppender" target="SYSTEM_OUT">            <PatternLayout pattern="%d [%t] %-5level: %msg%n%throwable"/>            <Filters>                <LevelFilter level="INFO" notallow="ACCEPT" notallow="DENY"/>            </Filters>        </Console>        <File name="FileAppender" fileName="app.log">            <PatternLayout pattern="%d [%t] %-5level: %msg%n%throwable"/>            <Filters>                <LevelFilter level="DEBUG" notallow="ACCEPT" notallow="DENY"/>                <LevelFilter level="INFO" notallow="DENY" notallow="DENY"/>            </Filters>        </File>    </Appenders>    <Loggers>        <Root level="DEBUG">            <AppenderRef ref="ConsoleAppender"/>            <AppenderRef ref="FileAppender"/>        </Root>    </Loggers></Configuration>

在这个配置中,ConsoleAppender只记录INFO级别及以上的日志,而FileAppender记录DEBUG级别但排除INFO级别的日志。这样可以避免INFO级别的日志被两个appender同时记录。VYC28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-96759-0.html日志打印的这10个坑,你至少踩过一个...

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 避免消息积压的终极指南:四个关键技巧

下一篇: 一文搞懂大厂商品中心设计!

标签:
  • 热门焦点
  • 小米降噪蓝牙耳机Necklace分享:听一首歌 读懂一个故事

    在今天下午的小米Civi 2新品发布会上,小米还带来了一款新的降噪蓝牙耳机Necklace,我们也在发布结束的第一时间给大家带来这款耳机的简单分享。现在大家能见到最多的蓝牙耳机
  • 7月安卓手机性价比榜:努比亚+红魔两款新机入榜

    7月登场的新机有努比亚Z50S Pro和红魔8S Pro,除了三星之外目前唯二的两款搭载超频版骁龙8Gen2处理器的产品,而且努比亚和红魔也一贯有着不错的性价比,所以在本次的性价比榜单
  • Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • 一年经验在二线城市面试后端的经验分享

    忠告这篇文章只适合2年内工作经验、甚至没有工作经验的朋友阅读。如果你是2年以上工作经验,请果断划走,对你没啥帮助~主人公这篇文章内容来自 「升职加薪」星球星友 的投稿,坐
  • 梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对&ldquo;势&rdquo;的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • 冯提莫签约抖音公会 前“斗鱼一姐”消失在直播间

    来源:直播观察提起&ldquo;冯提莫&rdquo;这个名字,很多网友或许听过,但应该不记得她是哪位主播了。其实,作为曾经的&ldquo;斗鱼一姐&rdquo;,冯提莫在游戏直播的年代影响力不输于现
  • AMD的AI芯片转单给三星可能性不大 与台积电已合作至2nm制程

    据 DIGITIMES 消息,英伟达 AI GPU 出货逐季飙升,接下来 AMD MI 300 系列将在第 4 季底量产。而半导体业内人士表示,近日传出 AMD 的 AI 芯片将转单给
  • iQOO Neo8 Pro评测:旗舰双芯加持 最强性能游戏旗舰

    【Techweb评测】去年10月,iQOO推出了一款Neo7手机,该机搭载了联发科天玑9000+,配备独显芯片Pro+,带来了同价位段最佳的游戏体验,一经上市便受到了诸多用
Top