乐趣区

关于java:java日志打印使用指南

一、简介

  • 日志打印是 java 代码开发中不可短少的重要一步。
  • 日志能够排查问题,能够收集数据

二、罕用日志框架

比拟罕用的日志框架就是 logback, 一些老我的项目会应用 log4j,他们用的都是 slf4j-api 对立接口。

(1) 应用 log4j

log4j 应用:1. slf4j-api-1.5.11.jar
2. slf4j-log4j12-1.5.11.jar
3. log4j-1.2.15.jar
4. log4j.properties

代码中

import  org.slf4j.Logger;
import  org.slf4j.LoggerFactory;
Logger logger = LoggerFactory.getLogger(xx.class);

(2) 应用 logback

logback 应用:1. slf4j-api-1.5.11.jar
2. logback-core.jar
3. logback-classic.jar
4. logback.xml

代码同 log4j

import  org.slf4j.Logger;
import  org.slf4j.LoggerFactory;
Logger logger = LoggerFactory.getLogger(xx.class);

三、日志级别

TRACE < DEBUG < INFO < WARN < ERROR

日常应用较多的是 error, info , debug

四、logback 简略介绍

简略介绍下罕用的 logback,logback 长处:

  • 比 log4j 更快
  • 和 log4j 应用了同一个接口,slf4j-api,能够十分不便切换
  • 定义了性能十分丰盛的 appender
  • 反对日志压缩

logback 要正确理解 xml 配置文件

  • configuration:总的父节点
  • property:自定义属性
  • appender:输入控制器,能够输入到控制台,自定义文件等
  • logger:日志级别
  • root:控制器级别

一个例子:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">

    <contextName>XXXXXXXX</contextName>
    <property name="log.path" value="./log/"/>
    <!-- 日志最大的历史 30 天 -->
    <property name="maxHistory" value="30"/>

    <property name="log.pattern"
              value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId}] [%-5level] [%logger{30}:%line] %msg%n"/>

    <!-- 输入到控制台 -->
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 此日志 appender 是为开发应用,只配置最底级别,控制台输入的日志级别是大于或等于此级别的日志信息 -->
        <!--LevelFilter:级别过滤器,依据日志级别进行过滤。如果日志级别等于配置级别,过滤器会依据 onMath 和 onMismatch 接管或回绝日志。-->
        <!-- 例如:将过滤器的日志级别配置为 INFO,所有 INFO 级别的日志交给 appender 解决,非 INFO 级别的日志,被过滤掉。-->
        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">-->
        <!--<level>INFO</level>-->
        <!--<onMatch>ACCEPT</onMatch>-->
        <!--<onMismatch>DENY</onMismatch>-->
        <!--</filter>-->

        <!--ThresholdFilter:临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回 NEUTRAL;当日志级别低于临界值时,日志会被回绝。-->
        <!-- 过滤掉所有低于 DEBUG 级别的日志,留下 DEBUG 及以上级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>

    <!-- 工夫滚动输入 level 为 INFO 日志 -->
    <appender name="errorFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--LevelFilter:级别过滤器,依据日志级别进行过滤。如果日志级别等于配置级别,过滤器会依据 onMath 和 onMismatch 接管或回绝日志。-->
        <!-- 例如:将过滤器的日志级别配置为 INFO,所有 INFO 级别的日志交给 appender 解决,非 INFO 级别的日志,被过滤掉。-->
        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">-->
        <!--<level>INFO</level>-->
        <!--<onMatch>ACCEPT</onMatch>-->
        <!--<onMismatch>DENY</onMismatch>-->
        <!--</filter>-->

        <!--ThresholdFilter:临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回 NEUTRAL;当日志级别低于临界值时,日志会被回绝。-->
        <!-- 过滤掉所有低于 DEBUG 级别的日志,留下 DEBUG 及以上级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>

        <!-- 正在记录的日志文件的门路及文件名 -->
        <file>${log.path}/error.log</file>

        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档门路以及格局 -->
            <fileNamePattern>${log.path}/error-%d{yyyyMMdd}.%i.log.zip</fileNamePattern>
            <!-- 日志文件保留天数 -->
            <maxHistory>${maxHistory}</maxHistory>
            <!-- 日志总保留量为 2GB -->
            <totalSizeCap>2GB</totalSizeCap>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 文件达到 最大 100MB 时会被压缩和切割 -->
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>

    <!-- 工夫滚动输入 level 为 INFO 日志 -->
    <appender name="infoFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--LevelFilter:级别过滤器,依据日志级别进行过滤。如果日志级别等于配置级别,过滤器会依据 onMath 和 onMismatch 接管或回绝日志。-->
        <!-- 例如:将过滤器的日志级别配置为 INFO,所有 INFO 级别的日志交给 appender 解决,非 INFO 级别的日志,被过滤掉。-->
        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">-->
        <!--<level>INFO</level>-->
        <!--<onMatch>ACCEPT</onMatch>-->
        <!--<onMismatch>DENY</onMismatch>-->
        <!--</filter>-->

        <!--ThresholdFilter:临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回 NEUTRAL;当日志级别低于临界值时,日志会被回绝。-->
        <!-- 过滤掉所有低于 DEBUG 级别的日志,留下 DEBUG 及以上级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>

        <!-- 正在记录的日志文件的门路及文件名 -->
        <file>${log.path}/info.log</file>

        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档门路以及格局 -->
            <fileNamePattern>${log.path}/info-%d{yyyyMMdd}.%i.log.zip</fileNamePattern>
            <!-- 日志文件保留天数 -->
            <maxHistory>${maxHistory}</maxHistory>
            <!-- 日志总保留量为 10GB -->
            <totalSizeCap>2GB</totalSizeCap>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 文件达到 最大 100MB 时会被压缩和切割 -->
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>

    <!-- 工夫滚动输入 level 为 INFO 日志 -->
    <appender name="debugFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--LevelFilter:级别过滤器,依据日志级别进行过滤。如果日志级别等于配置级别,过滤器会依据 onMath 和 onMismatch 接管或回绝日志。-->
        <!-- 例如:将过滤器的日志级别配置为 INFO,所有 INFO 级别的日志交给 appender 解决,非 INFO 级别的日志,被过滤掉。-->
        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">-->
        <!--<level>INFO</level>-->
        <!--<onMatch>ACCEPT</onMatch>-->
        <!--<onMismatch>DENY</onMismatch>-->
        <!--</filter>-->

        <!--ThresholdFilter:临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回 NEUTRAL;当日志级别低于临界值时,日志会被回绝。-->
        <!-- 过滤掉所有低于 DEBUG 级别的日志,留下 DEBUG 及以上级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>

        <!-- 正在记录的日志文件的门路及文件名 -->
        <file>${log.path}/debug.log</file>

        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档门路以及格局 -->
            <fileNamePattern>${log.path}/debug-%d{yyyyMMdd}.%i.log.zip</fileNamePattern>
            <!-- 日志文件保留天数 -->
            <maxHistory>${maxHistory}</maxHistory>
            <!-- 日志总保留量为 2GB -->
            <totalSizeCap>2GB</totalSizeCap>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 文件达到 最大 100MB 时会被压缩和切割 -->
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>


    <logger name="com.baomidou" level="debug"/>


    <root level="info">
        <appender-ref ref="consoleAppender"/>
        <appender-ref ref="errorFileAppender"/>
        <appender-ref ref="infoFileAppender"/>
        <appender-ref ref="debugFileAppender"/>
    </root>

</configuration>

五、常见问题

  • 1、日志打的少,不好排查问题?
 咱们常常会遇到一个生产问题,去看日志,啥都没有,只能从新加日志,发包,再排查问题;所以咱们要养成打日志的习惯,开发环境能够 debug 看,生产看不了,只能加日志,在开发的时候就把必要的日志加上;比拟重要的是接口的入参,返回,重要节点开始,完结,mq 发送接管等。
  • 2、error, info , debug 别离都什么时候应用?
error: 捕捉异样的时候应用,这个没有异议
info: 比拟重要的信息,应用频次不是十分高的场景,比方入参出参
debug: 一个是不是特地重要的信息,然而又不能少,还有数据量大的数据,比方大量 mq 信息,拜访频繁的接口入参出参 
  • 3、开启 debug 好多无用的 debug 信息怎么办?
 把我的项目的目录定为 debug, 其它定成 info。这样只有本我的项目的 debug 日志会打印了
logging.level.root=info
logging.level.cn.mypackage=debug
  • 4、须要自定义日志文件吗?
logback 能够把日志写进自定义文件,debug,info,error 离开存储,历史数据还能压缩;按本人我的项目的需要来,大型项目倡议离开存储。
  • 5、springboot 启动命令自带的日志和自定义日志文件的日志反复怎么办?
 咱们个别启动 springboot 我的项目命令为:nohup java -jar XXXXXXXX.jar >> XXXXXXX.log 2>&1 &
这个会生成一个日志文件,logback 配置也会生成本人的日志文件,就会反复,造成空间节约,如何取舍?如果你们公司对立打包脚本的话,就用命令生成的日志文件吧,把 logback 配置去掉;如果你们公司自由度比拟高,就用 logback 生成的日志,把命令改成  >/dev/null 就能够了 
  • 6、debug 日志正确写法?
 有些人可能打 debug 日志间接 logger.debug("****");
如果我的项目的日志级别比拟高,就比拟节约性能,能够加一个
if (log.isDebugEnabled()) {log.debug("XXXXXXXXXXXXX");
}
  • 7、动静日志级别?
 有些公司反对动静配置文件,比方 diamond,nacos 等,能够批改配置文件的级别,动静失效
logging.level.root=info
#logging.level.root=debug

日常开在 info, 出了问题开 debug 找, 资源无限能够这样做,不举荐生产应用 

欢送关注微信公众号:丰极,更多技术学习分享。

退出移动版