JAVA日志相关整理学习

施自珍
2023-12-01

JAVA日志相关整理学习

​ Java关于日志我们常见的有commons-loging、log4j、slf4j、LogBack。

Commons-logging:apache最早提供的日志的门面接口。避免和具体的日志方案直接耦合。类似于JDBC的api接口,具体的的JDBC driver实现由各数据库提供商实现。通过统一接口解耦,不过其内部也实现了一些简单日志方案。

Log4j:经典的一种日志解决方案。内部把日志系统抽象封装成Logger、appender、pattern等实现。我们可以通过配置文件轻松的实现日志系统的管理和多样化配置。

Slf4j: 全称为Simple Logging Facade for JAVA:java简单日志门面。是对不同日志框架提供的一个门面封装。可以在部署的时候不修改任何配置即可接入一种日志实现方案。和commons-loging应该有一样的初衷。个人感觉设从计上更好一些,没有commons那么多潜规则。

Logback: Lack作为一个通用可靠、快速灵活的日志框架,将作为Log4j的替代和SLF4J组成新的日志系统的完整实现。官网上称具有极佳的性能,在关键路径上执行速度是log4j的10倍,且内存消耗更少。

SLF4J+Log4J的使用:

​ 需要的配置文件和组件包,下面三个 jar 文件和一个 properties 文件都是要放在项目的 ClassPath 上。

  1. slf4j-api-1.5.11.jar

  2. slf4j-log4j12-1.5.11.jar

  3. log4j-1.2.15.jar

  4. log4j.properties

### set log levels ###
log4j.rootLogger = DEBUG , C , D , E 
 
### console ###
log4j.appender.C = org.apache.log4j.ConsoleAppender
log4j.appender.C.Target = System.out
log4j.appender.C.layout = org.apache.log4j.PatternLayout
log4j.appender.C.layout.ConversionPattern = [mybatis_study][%p] [%-d{yyyy-MM-dd HH\:mm\:ss}] %C.%M(%L) | %m%n
 
### log file ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = ../logs/mybatis_study.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = INFO 
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = [mybatis_study][%p] [%-d{yyyy-MM-dd HH\:mm\:ss}] %C.%M(%L) | %m%n
 
### exception ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = ../logs/mybatis_study_error.log 
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR 
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = [mybatis_study][%p] [%-d{yyyy-MM-dd HH\:mm\:ss}] %C.%M(%L) | %m%n
 
###mybatis show sql###
log4j.logger.com.ibatis=debug
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug
 
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug

SLF4J+Logback的使用:

​ 需要的配置文件和组件包,下面三个 jar 文件和一个 xml文件都是要放在项目的 ClassPath 上。

  1. slf4j-api-1.5.11.jar
  2. logback-core-0.9.20.jar
  3. logback-classic-0.9.20.jar
  4. logback.xml
<configuration>
  <include resource="org/springframework/boot/logging/logback/base.xml"/>
  <jmxConfigurator/>
  <substitutionProperty name="logbase" value="${catalina.base}/logs/" />

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoder 默认配置为PatternLayoutEncoder -->
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <appender name="SERVERFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

    <file>${logbase}/extractor-server.log</file>

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!--日志文件输出的文件名-->
      <FileNamePattern>${catalina.home}/logs/extractor-server.%d{yyyy-MM-dd}-%i.log</FileNamePattern>
      <!--日志文件保留天数-->
      <MaxHistory>2</MaxHistory>
      <TimeBasedFileNamingAndTriggeringPolicy
        class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <MaxFileSize>200MB</MaxFileSize>
      </TimeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>

    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
      <charset class="javarm .nio.charset.Charset">UTF-8</charset>
    </encoder>
  </appender>

  <logger name="studio.raptor.extractor.segment" level="info" additivity="false">
    <appender-ref ref="SERVERFILE"/>
  </logger>

  <logger name="studio.raptor.hub" level="info" additivity="false">
    <appender-ref ref="SERVERFILE"/>
  </logger>

  <root level="ERROR">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

log4j.properties有工具可以转换成logback.xml ,地址:

https://logback.qos.ch/translator/

SLF4J怎样定位到具体用哪个log

​ 在应用中,通过LoggerFactory类的静态getLogger()获取logger。通过查看该类的代码可以看出,最终是通过StaticLoggerBinder.SINGLETON.getLoggerFactory()方法获取LoggerFactory然后,在通过该具体的LoggerFactory来获取logger的。类org.slf4j.impl.StaticLoggerBinder并不在slf4j-api-1.5.2.jar包中,仔细查看每个与具体日志系统对应的jar包,就会发现,相应的jar包都有一个org.slf4j.impl.StaticLoggerBinder的实现,不同的实现返回与该日志系统对应的LoggerFactory,因此就实现了所谓的静态绑定,达到只要选取不同jar包就能简单灵活配置的目的

平时在使用springboot的时候,只导了slf4j-api的包,却可以使用logback.xml,是因为:

spring-boot-starter里有日志依赖spring-boot-starter-logging,可以通过

 <dependency>
     <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
           </exclusions>
 </dependency>

来排除。

spring-boot-starter-logging是SpringBoot应用将自动使用logback作为应用日志框架,另外可以自己添加

#log4j
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logg4j</artifactId>
</dependency>

#log4j2
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

本文部分参考:https://blog.csdn.net/kobejayandy/article/details/17335407

本文地址:https://blog.csdn.net/renhuan28/article/details/83657834

 类似资料: