日志打印应该避免的10个坑

805 阅读1分钟

1. 日志级别选择不当

  • 常见日志级别:errorwarninfodebugtrace
  • 应根据情况选择恰当级别,避免默认使用info

2. 过度日志记录

  • 问题:记录过多日志导致文件过大,难以管理。
  • 示例:
    // 避免过度记录DEBUG级别日志
    public void processData() {
        logger.debug("Entering processData method.");
        // 业务逻辑
        logger.debug("Exiting processData method.");
    }
    

3. DEBUG日志用于生产环境

  • 应避免将DEBUG级别日志用于生产环境。
  • 示例:
    if(log.isDebugEnable()){
        logger.debug("This is a debug message, should not be logged in production");
    }
    

4. 日志缺少上下文信息

  • 问题:日志未提供足够上下文,不便排查问题。
  • 示例:
    logger.info("User login request, userId:{}", userId);
    

5. 同步IO导致性能问题

  • 同步日志记录可能阻塞主线程。
  • 解决方案:使用异步日志框架,如Log4j 2的异步日志记录器。

6. 日志配置不合理

  • 问题:配置文件复杂,存在硬编码路径。
  • 示例:
    <!-- 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>
            <!-- 配置省略 -->
        </appender>
        <root level="info">
            <appender-ref ref="FILE"/>
        </root>
    </configuration>
    

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

  • 问题:记录敏感信息如密码,存在安全风险。
  • 解决方案:不记录敏感信息,对敏感信息进行脱敏或掩码处理。

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

  • 问题:未配置轮转策略,导致日志文件过大。
  • 示例:
    <!-- logback.xml示例 -->
    <configuration>
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 配置省略 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>tianluoboy.%d{yyyy-MM-dd}.log</fileNamePattern>
                <maxHistory>30</maxHistory>
            </rollingPolicy>
        </appender>
        <root level="info">
            <appender-ref ref="FILE"/>
        </root>
    </configuration>
    

9. 日志框架漏洞问题

  • 问题:低版本日志框架可能存在安全漏洞。
  • 解决方案:升级到最新版本,使用成熟的日志框架,并定时更新维护。

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

  • 问题:配置不当导致日志重复记录。
  • 示例:
    <Configuration status="WARN">
        <Appenders>
            <Console name="ConsoleAppender" target="SYSTEM_OUT">
                <!-- 配置省略 -->
                <Filters>
                    <LevelFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
                </Filters>
            </Console>
            <File name="FileAppender" fileName="app.log">
                <!-- 配置省略 -->
                <Filters>
                    <LevelFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
                    <LevelFilter level="INFO" onMatch="DENY" onMismatch="DENY"/>
                </Filters>
            </File>
        </Appenders>
        <Loggers>
            <Root level="DEBUG">
                <AppenderRef ref="ConsoleAppender"/>
                <AppenderRef ref="FileAppender"/>
            </Root>
        </Loggers>
    </Configuration>