• 为什么要打日志?怎么打日志?打什么日志?



    公司的项目不会有e.printStackTrace();这种代码的存在。因为这打印出来的错误信息没有日期、等级等等,分析起来不方便

    为什么要用 SLF4J

    在阿里开发手册有这么一条:

    【强制】应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架 SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一

    slf4j ,即(Simple Logging Facade for Java,简单门面日志)。它是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,它只服务于各种各样的日志系统。

    slf4j 提供了统一的记录日志的接口,对不同日志系统的具体实现进行了抽象化,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过绑定具体的日志系统来实现。在项目中使用了slf4j记录日志,并且绑定了log4j(pom.xml中配置了相应的jar包依赖),则日志会以log4j的风格输出;后期需要改为以logback的风格输出日志,只需要将jar包log4j替换成logback即可,根本不需要修改日志文件的代码

    建议统一使用 Slf4j 作为日志门面,logback 作为日志实现

    日志级别

    日志常用的五个级别,根据严重程度由低到高,依次为:debug(调试 ) < info(消息) < warn(警告) < error(错误) < fatal(严重错误)。通常可以根据实际所需要的颗粒度的大小选择其中的几个,当前常用debug,info,warn,error4个级别

    在项目的yaml文件中可以配置日志级别

    logging:
      level:
        com.xyz.spring: trace
    
    • 1
    • 2
    • 3

    logging.level用来指定具体的包中应用程序日志的输出级别。上面的配置表示com.xyz.spring包下的所有日志输出级别为 trace,该级别会将操作数据库的 sql 打印出来,开发时设置成 trace 方便定位问题,在生产环境上,将这个日志级别再设置成 error 级别即可

    Springboot中日志的配置

    Springboot启动器中已经集成了 slf4j ,因此无需手动导包,如果需要,使用以下配置

    <dependency>
        <groupId>org.slf4jgroupId>
        <artifactId>slf4j-apiartifactId>
        <version>1.7.30version>
    dependency>
        <dependency>
        <groupId>org.slf4jgroupId>
        <artifactId>slf4j-log4j12artifactId>
        <version>1.7.30version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    application.yml的日志配置

    logging:
      config: logback.xml
      level:
        com.xyz: trace
    
    • 1
    • 2
    • 3
    • 4

    config表示读取日志配置的地点,将locback.xml放在pom文件同级包下即可。level表示在XXX包下的日志输出级别

    以下的xml文件只需要更改部分项目地址就能直接使用

    
    <configuration debug="false">
        
        <property name="LOG_HOME" value="D:IdeaProjects/SpringBoot-Item/springboot-slf4j/log"/>
        
        <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] [%-30.30logger{30}] %msg%n"/>
        
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
            encoder>
        appender>
        
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                
                <FileNamePattern>${LOG_HOME}/SpringBoot-Slf4j_%d{yyyy-MM-dd}.logFileNamePattern>
                
                <MaxHistory>30MaxHistory>
            rollingPolicy>
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
            encoder>
            
            <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                <MaxFileSize>10MBMaxFileSize>
            triggeringPolicy>
        appender>
    
        
        <logger name="org.springframework" level="INFO"/>
        <logger name="com" level="INFO"/>
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="FILE"/>
        root>
    configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    在使用日志的时候,在该类中加入一行代码:

    private Logger logger = LoggerFactory.getLogger(UserController.class);
    
    • 1

    或者在类之前加上lombak的注解

    @Slf4j
    
    • 1

    日志的编写位置

    1,系统/应用启动和参数变更。当系统启动时,可以将相关的参数信息进行打印,以便出现问题时,更准确地查询原因;参数信息可能并不存储在本地,需要通过配置中心获取,而参数信息有变更时,也需要将变更后的内容输出在日志中。
    2,关键操作节点。最典型的就是在关键位置添加日志,记录用户进行的某个操作。
    3,大型任务进度上报。当系统在处理某个比较大型的任务时,可以在这个过程中增加相关的日志来表明任务处理的进度,防止因为长时间没有处理而无法得知程序执行的状态,比如在定时任务中,增加当前任务完成百分比。
    4,异常。如果是通过 try-catch 处理,需要注意日志编写的位置。如果需要将日志在本层抛出,则不需要进行日志记录,否则会出现日志重复的问题。
    5,批量操作。涉及到数量的操作要打印log,比如查询数据库和批量拷贝文件、上传下载、批量格式转换等批量操作,设计到的数量要打印出来。

  • 相关阅读:
    高德地图 计算两个点之间距离
    Vue_生命周期函数
    快速获取InputBox选中区域的单个单元格引用地址
    ASP.NET Core 标识(Identity)框架系列(四):闲聊 JWT 的缺点,和一些解决思路
    【JAVA】泛型
    Ajax系列之文件上传图片即时预览
    【微电网重构】基于粒子群算法实现IEEE33节点系统进行配电网重构 前推回代计算潮流附matlab代码
    conda常用命令
    MySQL详细学习教程(建议收藏)
    webrtc终极版(一)5分钟搭建多人实时会议系统webrtc
  • 原文地址:https://blog.csdn.net/sekever/article/details/126130001