成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

日志打印的這10個坑,你至少踩過一個...

開發 前端
ConsoleAppender只記錄INFO級別及以上的日志,而FileAppender記錄DEBUG級別但排除INFO級別的日志。這樣可以避免INFO級別的日志被兩個appender同時記錄。

前言

大家好,我是撿田螺的小男孩.

我們日常開發中,經常需要打印日志.但是不當的日志使用可能會導致各種問題。整理了日志打印的10個坑,希望大家都能避坑~~

1.忽視日志級別,反手就是INFO

常見的日志級別有5種,分別是error、warn、info、debug、trace。日常開發中,我們需要選擇恰當的日志級別,不要反手就是打印info哈~

  • ERROR:錯誤日志,指比較嚴重的錯誤,對正常業務有影響,需要運維配置監控的;
  • WARN:警告日志,一般的錯誤,對業務影響不大,但是需要開發關注;
  • INFO:信息日志,記錄排查問題的關鍵信息,如調用時間、出參入參等等;
  • DEBUG:用于開發DEBUG的,關鍵邏輯里面的運行時數據;
  • TRACE:最詳細的信息,一般這些信息只記錄到日志文件中

2.過度日志記錄

  • 問題:記錄了過多的日志信息,導致日志文件過大,難以管理和分析。

比如這個例子(過度記錄DEBUG級別的日志):

// 過度記錄DEBUG級別的日志
public void processData() {
    logger.debug("Entering processData method.");
    // 業務邏輯
    logger.debug("Exiting processData method.");
}

正例應該這樣(僅記錄必要的日志信息)

// 僅在異常和重要步驟中記錄日志
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),只記錄必要的日志信息,避免日志打印處理成流水賬.

3.將debug日志直接帶到生產環境

有些伙伴亂用日志級別,甚至將DEBUG級別的日志用于生產環境。

反例(將DEBUG級別的日志直接用于生產環境):

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

正例 (debug日志級別,最好判斷一下是否開啟):

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

4.日志缺少上下文信息

大家可以看下這行日志,覺得有啥問題

logger.info("User login request");

很明顯,日志缺少上下文信息,并不方便排查.比如說,你想知道是哪個用戶的登錄請求嘛? 至少把userId 打印出來吧,如下:

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

5.同步IO導致性能問題

同步日志記錄會阻塞主線程,影響系統性能。因此使用異步日志框架(比如Log4j 2的異步日志記錄器)來減少對性能的影響。

// 使用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.日志配置不合理:

有些日志配置文件復雜,難以維護;配置文件中存在硬編碼路徑。如下:

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

應當使用靈活的配置

// 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.日志內容泄露敏感信息

日志中記錄了用戶的敏感信息(如密碼、信用卡號),存在安全風險。

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

這都把用戶的密碼打印出來了...解決方法就是,不能打印密碼這些關鍵信息,如果是手機號、郵箱等敏感信息,則可以脫敏、或者掩碼處理。

8.日志文件輪轉和歸檔配置不當。

如果日志文件過大時未能及時輪轉,就很坑.

// 簡單的日志配置,沒有輪轉策略
log4j.appender.file.File=tianluoboy.log

日志要配置合理的輪轉和歸檔策略,避免文件過大.

// 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.日志框架漏洞的問題

有些日志框架,在低版本,可能會存在安全漏洞問題.甚至有些可能會存在漏洞還沒被發現.

我們如何做呢? 如果是低版本存在安全漏洞的日志框架,我們要盡快升級到最新版本.

比如Log4Shell 是Log4j 2.x中一個嚴重的遠程代碼執行(RCE)漏洞。攻擊者可以通過特制的日志消息來觸發JNDI查找請求,從而在受影響的系統上執行任意代碼。

可以升級到Log4j 2.17.0或更高版本,這些版本已經修復了該漏洞。

尚未被發現的漏洞,也可能潛在地影響應用程序的安全性。我們要使用成熟的日志框架,并且要定時更新和維護.

10.錯誤配置LevelFilter造成日志重復記錄

錯誤配置LevelFilter可能導致日志重復記錄的問題.比如你這樣配置:

<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記錄,產生了重復日志。

可以使用不同的過濾器策略來確保日志只被一個appender記錄:

<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同時記錄。

責任編輯:武曉燕 來源: 撿田螺的小男孩
相關推薦

2025-02-26 00:33:59

Java編程程序

2025-04-29 10:17:42

2024-04-01 08:05:27

Go開發Java

2025-06-03 06:30:05

2024-05-06 00:00:00

緩存高并發數據

2023-12-14 17:34:22

Kubernetes集群K8s

2019-08-12 11:18:12

機器學習數據集模型

2019-09-25 15:30:15

2018-04-08 22:16:21

2019-05-20 09:09:44

Web前端JavaScript

2021-03-04 10:16:30

Java語言IT

2023-03-13 13:36:00

Go擴容切片

2018-09-11 09:14:52

面試公司缺點

2020-03-31 09:47:04

Vue開發代碼

2022-04-26 21:49:55

Spring事務數據庫

2020-06-12 11:03:22

Python開發工具

2017-07-17 15:46:20

Oracle并行機制

2015-06-15 09:49:22

Docker開源平臺虛擬化容器

2025-04-14 09:31:03

2019-12-12 14:32:26

SQL語句數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲三级在线 | 国产精品极品美女在线观看免费 | 在线观看国产 | 亚洲天堂久久 | 99热首页| 国产精品久久久久久久免费大片 | 天天干天天色 | 9999国产精品欧美久久久久久 | 正在播放国产精品 | 亚洲国产精品久久久久 | 亚洲精品美女视频 | 综合久久综合久久 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 中文字幕一区在线 | 欧美精品在欧美一区二区少妇 | 亚洲3级 | 成人国产免费视频 | 在线免费毛片 | 欧美精品成人一区二区三区四区 | 成人久久 | 国产精品久久久一区二区三区 | 日本中文字幕日韩精品免费 | 国产你懂的在线观看 | 久久精品免费一区二区 | 色网站在线免费观看 | 免费看国产a | 麻豆久久久9性大片 | 国产精品久久久久久妇女6080 | 91久久精品国产91久久性色tv | 成人av免费播放 | 国产精品一区二区在线观看 | 欧美三级在线 | 一级欧美视频 | 亚洲精品一区av在线播放 | 秋霞a级毛片在线看 | 亚洲人人 | 久久久九九九九 | 三级国产三级在线 | 91九色麻豆 | 国产xxxx搡xxxxx搡麻豆 | 亚洲高清在线观看 |