1. 简介
下图来源于slf4j官网,从图中来看,可以得到如下信息:
slf4j是接口;
log4j、logback、java.util.logging、slf4j-simple、slf4j-nop是slf4j接口的一种的实现;
从图片的第三行观察可以发现(通过图表的颜色进行区分):
logback、slf4j-simple、slf4j-nop直接原生实现了slf4j的接口;
log4j、java.util.logging没有直接实现slf4j接口,所以需要的适配类将slf4j接口和具体实现进行绑定。
如果要开发一个libraray或者SDK供别人使用,最好的方式是只在dependency中添加slf4j-api.jar包,这样最后使用哪个日志就是用户自己来决定的。用户只需在自己的程序的classpath中提供不同的Jar包即可采用不同的日志实现方法
2. SpringBoot 整合 log4j
2.1 依赖
<!--集成log4j-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.3.8.RELEASE</version>
</dependency>
如果项目中别的依赖中也包含了slf4j,那么需要排除掉,如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
2.2 配置输出格式
可以使用以下两种方式对日志系统的输出格式、记录级别、输出方式等进行配置:
- 使用properties文件方式
- 使用xml文件方式
1) log4j.properties 配置文件
log4j.logger.com.ibatis=WARN
log4j.logger.org.springframework=WARN
log4j.rootLogger = INFO, stdout, D, ERROR
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d [%p] [%t] - %m%n
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = /var/log/info.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = INFO
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %d [%p] [%t] - %m%n
log4j.appender.ERROR = org.apache.log4j.DailyRollingFileAppender
log4j.appender.ERROR.File = /var/log/error.log
log4j.appender.ERROR.Append = true
log4j.appender.ERROR.Threshold = ERROR
log4j.appender.ERROR.layout = org.apache.log4j.PatternLayout
log4j.appender.ERROR.layout.ConversionPattern = %d [%p] [%t] - %m%n
2)xml文件方式
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<!-- 应用名称 -->
<property name="APP_NAME" value="logtest" />
<!--日志文件的保存路径-->
<property name="LOG_HOME" value="/var/log}" />
<!-- 日志输出格式:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<property name="ENCODER_PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80} - %msg%n" />
<contextName>${APP_NAME}</contextName>
<!-- 控制台日志:输出全部日志到控制台 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>${ENCODER_PATTERN}</Pattern>
</encoder>
</appender>
<!-- 文件日志:输出全部日志到文件 -->
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/output.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${ENCODER_PATTERN}</pattern>
</encoder>
</appender>
<!-- 错误日志:用于将错误日志输出到独立文件 -->
<appender name="ERROR_FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${ENCODER_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
</appender>
<!-- 独立输出的同步日志 -->
<appender name="SYNC_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/sync.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${ENCODER_PATTERN}</pattern>
</encoder>
</appender>
<logger name="log.sync" level="DEBUG" addtivity="true">
<appender-ref ref="SYNC_FILE" />
</logger>
<root>
<level value="DEBUG" />
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
</configuration>
1)Loggers
Loggers组件在此系统中被分为五个级别:DEBUG、INFO、WARN、ERROR和FATAL。这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,分别用来指定这条日志信息的重要程度,明白这一点很重要,Log4j有一个规则:只输出级别不低于设定级别的日志信息,假设Loggers级别设定为INFO,则INFO、WARN、ERROR和FATAL级别的日志信息都会输出,而级别比INFO低的DEBUG则不会输出。
2)Appenders禁用和使用日志请求只是Log4j的基本功能,Log4j日志系统还提供许多强大的功能,比如允许把日志输出到不同的地方,如控制台(Console)、文件(Files)等,可以根据天数或者文件大小产生新的文件,可以以流的形式发送到其它地方等等。
常使用的类如下:
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
配置模式:
log4j.appender.appenderName = className
log4j.appender.appenderName.Option1 = value1
…
log4j.appender.appenderName.OptionN = valueN
3)Layouts有时用户希望根据自己的喜好格式化自己的日志输出,Log4j可以在Appenders的后面附加Layouts来完成这个功能。Layouts提供四种日志输出样式,如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式。
常使用的类如下:
org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息)
配置模式:log4j.appender.appenderName.layout =className
log4j.appender.appenderName.layout.Option1 = value1
…
log4j.appender.appenderName.layout.OptionN = valueN
日志信息格式中几个符号所代表的含义
- -X号: X信息输出时左对齐;
- %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
- %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
- %r: 输出自应用启动到输出该log信息耗费的毫秒数
- %c: 输出日志信息所属的类目,通常就是所在类的全名
- %t: 输出产生该日志事件的线程名
- %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.java:10)
- %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
- %%: 输出一个”%”字符
- %F: 输出日志消息产生时所在的文件名称
- %L: 输出代码中的行号
- %m: 输出代码中指定的消息,产生的日志具体信息
- %n: 输出一个回车换行符,Windows平台为”\r\n”,Unix平台为”\n”输出日志信息换行
2.3 springboot 集成 log4j 显示数据库打印信息
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
<Properties>
<Property name="LOG_PATTERN">
%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${hostName} --- [%15.15t] %-40.40c{1.} : %m%n%ex
</Property>
</Properties>
<Appenders>
<Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
</Appenders>
<Loggers>
<Logger name="#{com.cigna.hmc.material.mapper}" level="trace" additivity="false">
<AppenderRef ref="ConsoleAppender" />
</Logger>
<Root level="info">
<AppenderRef ref="ConsoleAppender" />
</Root>
</Loggers>
</Configuration>
Application.yml
logging:
level:
com.cigna.hmc.material.mapper.*: debug
3. logback 使用
精彩3000字!给讲得明明白白:配置 logback_头顶假发的博客-CSDN博客
以下内容转载路径:Logback 使用详解 - 迷走神经 - 博客园
3.1 依赖
创建一个 SpringBoot 项目即可直接使用 Logback 进行日志打印,只需引入 spring-boot-starter-web,该jar依赖 spring-boot-starter-logging 都已经引用好了。SpringBoot 在方法 org.springframework.boot.logging.AbstractLoggingSystem#initializeWithConventions 进行了默认日志的配置
由于有默认配置,所以使用的时候直接引用包 lombok.extern.slf4j.Slf4j; 就可以使用了。
3.2 日志级别
TRACE < DEBUG < INFO < WARN < ERROR,使用的日志级别越小,打印的日志越多,比如设置的日志级别是
DEBUG
,那么项目中的所有大于DEBUG
的日志都会打印。如果设置的日志级别是 ERROR ,那其他四个日志就都不会打印。
- TRACE:级别最小的日志,所有的日志都进行打印,一般不使用。
- DEBUG:此日志级别一般用作调试使用,比如新开发的功能,还不是太放心,就开启此日志级别。
- INFO: 最常使用的日志级别,比如打印产生分支的信息,比如一个 if 的条件,让开发能通过日志排查问题。
- WARN:警告日志,代码走到比较让人需要注意的地方打印此级别。
- ERROR:发生错误时打印。
横排是项目配置的日志级别。竖排是项目中打印日志使用的日志级别。
3.2 xml 配置
配置文件:
#设置应用的日志级别 logback-spring.xml中使用
logging:
level:
com:
janet: INFO
xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!--debug:当此属性设置为 true 时,将打印出 logback 内部日志信息,实时查看 logback 运行状态。默认值为 false。-->
<!--scan:当此属性设置为 true 时,配置文件如果发生改变,将会被重新加载,默认值为 true。-->
<!--scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位:毫秒。当 scan 为 true 时,此属性生效。默认的时间间隔:1分钟。-->
<configuration debug="false" scan="true" scanPeriod="30 minutes">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<property name="LOG_PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/>
<property name="LOG_HOME" value="/var/log/tomcat/janet_test_application"/>
<!--从配置文件中加载日志level-->
<springProperty scope="context" name="LOG_LEVEL_INFO" source="logging.level.com.janet"/>
<!--子节点 appender,主要负责写日志的组件,具有两个属性:① name:起个名字,方便别处使用。② class:指定一个具体的 Appender 实现,此实现方式影响日志输出的目的地,比如是控制台、指定文件等。知道一些常用的就行了。-->
<!-- 控制台输出日志 属性:class = ch.qos.logback.core.ConsoleAppender :Appender 的一种实现,作用是把日志输出到控制台。 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${LOG_LEVEL_INFO}</level>
</filter>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!--属性:class = ch.qos.logback.core.rolling.RollingFileAppender:Appender 的一种实现,作用是把日志输出到指定文件中,当文件达到一定规则时,在触发规则时会做不同的事,此规则受 rollingPolicy 和 triggeringPolicy 的影响。-->
<!-- 文件输出日志 (文件大小策略进行文件输出,超过指定大小对文件备份) -->
<!-- 按照每天生成日志文件 -->
<appender name="RollingFileInfo" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<!--临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${LOG_LEVEL_INFO}</level>
</filter>
<!--file:要写入的文件绝对路径,这里的路径没有设置盘符,Linux 和 Mac 好理解,如果是 Windows,那即是当前项目所在盘符根目录开始。-->
<file>${LOG_HOME}/info.log</file>
<!--rollingPolicy:滚动策略。-->
<!--SizeAndTimeBasedRollingPolicy 是 TimeBasedRollingPolicy 的子类,具有 TimeBasedRollingPolicy 的特性,新增了一个属性 maxFileSize,在 TimeBasedRollingPolicy 的基础上,增加一个文件大小的判断,fileNamePattern 上要增加 %i 的配置。-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--fileNamePattern:日志文件输出的文件名。%i 是在触发 triggeringPolicy 时递增用来命名文件使用。-->
<fileNamePattern>${LOG_HOME}/info.log.%d{yyyy-MM-dd}</fileNamePattern>
<!-- 日志在磁盘上保留的天数 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!--encoder:对要输出的日志格式化使用-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>${LOG_PATTERN}</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 错误日志 appender : 按照每天生成日志文件 -->
<appender name="RollingFileError" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<!-- 过滤器,只记录 error 级别的日志 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<!-- 日志名称 -->
<file>${LOG_HOME}/error.log</file>
<!-- 每天生成一个日志文件,保存30天的日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名:按天回滚 daily -->
<FileNamePattern>${LOG_HOME}/error.log.%d{yyyy-MM-dd}</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--root:作用与 logger 一般无二,只是它没有 name、additivity 两个属性,没有 name 是因为它代表的就是根目录,所以不需要,根目录自然也不需要使用 additivity 进行叠加。-->
<root level="ALL">
<appender-ref ref="STDOUT"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileError"/>
</root>
<!-- 定制化某些包的日志输出级别: 过滤掉spring和mybatis的一些无用的DEBUG信息 -->
<!--name:指定某个包下或者具体类的日志级别。比如:com、org、io、java.lang.String等-->
<!--level:用来设置打印级别,大小写无关:ALL、TRACE、DEBUG、INFO、WARN、ERROR、OFF,还有一个特殊值 INHERITED 或者同义词 NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前 logger 将会继承上级的级别。-->
<logger name="org.mybatis" level="INFO"/>
<logger name="org.springframework" level="INFO"/>
<!-- 将sql语句输出到具体的日志文件中 -->
<!-- <logger name="com.alipay.sofa.cloudplatform.common.dao" level="DEBUG" additivity="false">-->
<!-- <appender-ref ref="SQL-APPENDER"/>-->
<!-- </logger>-->
</configuration>
4. SpringBoot 基于 Aop 自定义 Slf4j 日志输出格式
SpringBoot基于Aop自定义Slf4j日志输出格式_码霸霸的博客-CSDN博客_slf4j 自定义
转载链接参考:
SpringBoot集成log4j,解决log4j.properties不生效问题 - 袁骞骞 - 博客园
Log4J日志整合及配置详解 - yufan123 - 博客园
SpringBoot基于Aop自定义Slf4j日志输出格式_码霸霸的博客-CSDN博客_slf4j 自定义
slf4j,log4j,logback之间的关系_小小本科生的博客-CSDN博客_log4j logback slf4j