log4j----slf4j---logback从知道到编写配置文件

明天要去学习的

1.学习springBoot的自动装配,并且知道spring是如何自动去加载log4j的流程

https://blog.csdn.net/satomiyo/article/details/100040235 log4j配置文件

了解日志-->slf4j的介绍-->log4j的介绍-->logback的介绍-->springboot中slf4j+log4j的使用-->springboot中slf4j+logback的使用

一、前言

我觉得能够加强自己的开发能力,首先必须学会去配置一些文件,而不是crud。在springBoot项目中,一般会有log4j.properties的配置文件,该配置文件是记录项目中的日志的配置信息。

日志是一个项目中必不可少的灵魂,没有日志的项目是没有灵魂的,因此掌握基础的日志编写是非常有必要的。

二、为什么需要日志

我们最开始使用的是System.out.prinlt()进行输出我们的调代码的信息,用来监控具有什么信息,System.out.println()其实是对业务无关的代码,这些对业务无关的代码都是对业务代码的一些intercupt。

我们必须要明确,日志不仅仅System.out.prinlt(s) ,s的信息,同时日志包括一些额外的上下文,上下文信息是非常重要的,这些信息具有 访问时间、对应的类、行、产生的线程等。因此日志功能可以总结如下功能。

日志功能: 调试代码、定位错误、信息统计

三、需要输出什么日志(我们需要什么日志信息)

在系统中应该包括sql日志、异常日志也叫error级别日志、业务日志info级别、调试日志是debug模式仅仅是在开发阶段进行开启的,用来调试track代码。

1.SQL日志:记录系统执行的sql语句。
2.异常日志:记录系统运行中发生的异常事件。
3.业务日志:记录系统运行过程,如用户的登录,操作记录。

四、日志系统可以为我们编写的日志提供什么功能?

你或许很好奇,日志系统能为我们提供什么日志的管理功能。

1)日志级别分类管理 track\debug\info...

2)可以配置日志输出file console gui html等等

3)可以提供日志的上下文信息

比如Log4j的介绍

Log4J(log for java)是我们常用的日志管理小助手,它是 Apache的 一个开源项目,我们可以通过这个小助手很方便的将日志信息输出到控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等,而且也能控制每一条日志的输出格式,并且设置每一条日志信息的级别,这样我们能够更加细致地控制日志的生成过程。最令人兴奋的就是,这些所有的配置都可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

五、Slf4j的介绍

在我们java应用中,我们会使用mysql作为数据库也可能使用sql server作为数据库,但是我们使用java的时候从来没有直接去调用mysql的接口,而是通过jdbc这个统一的访问去实现数据库的交互。

在日志介绍中具有如下的名词。

                类似我们jdbc的抽象接口调用                                                                常用的日志系统        (不同的数据库)                                                 
SLF4J log4j\JUL\Jboss-logging\JCL\logBack\log4j2

 

我们如果直接使用log4j作为日志系统,当然也是可以的,只不过我们在代码中,可以是这样写的(仅仅是比如,并不是真实的方法)

log.doInfo("这是log4j的记录信息")如果使用logback或许是这样写的log.writeInfo("这个是logback的记录信息")

这些语句是存在java代码中的,如果我们后来因为log4j的性能不是很好或者不支持xx功能,需要更换为logback的日志系统,那么你就需要把log.doInfo的代码改为writeInfo。这样是万万不能的,因此就需要SLF4j提供一个统一的接口,那么更换日志系统,仅仅需要更换配置信息就可以,绑定驱动就可以。

六、log4j的使用

log4j是比较早期好用的日志系统,现在出现logback 、log4j2的日志系统,这些系统比log4j系统的性能好很多,但是logback\log4j2、log4j的作者好像是同一个人,因此先了解log4j的使用是使用其他的日志系统的前提了。

Log4j的类图,由此可知道有一个Configuration会生成Appender ,Appender中具有Layout

 

 

 

6.1 首先配置jar

如果使用springboot项目的话,springBoot从xx版本之后就会默认使用logback ,因此需要使用exclusion移除logback,加上log4j jar。spring-boot-starter-log4j是包括slf4j的jar的

<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.2.5.RELEASE</version>
</dependency>

6.2 写配置文件

在spring启动的时候,会去resouce中加载log的配置文件,有一个加载顺序,可以使用log4j.properties 。spring启动会去加载这个配置文件,然后生成对应的Appender对象。

Log4j.properties如何写?记录以下的知识内容。

1. 日志系统是具有三个域输出的,root根输出、logger匹配包以及设置对应包的appender对象、具体Appender对象。

## 需求任务,把sql查询的语句打印到文件中 sql文件 --> 把sql 操作insert update select分类进行打印
## 执行了什么接口,接口带了什么参数,返回了什么结果 打印到 access文件
#log4j.rootLogger = debug , filelog
#log4j.appender.filelog = org.apache.log4j.DailyRollingFileAppender
#appender.filelog.layout = org.apache.log4j.TTCCLayout
#log4j.appender.filelog.layout.File = sql.txt
#log4j.appender.filelog.layout.Append = true
### 配置根 ###
log4j.rootLogger = info,errorFile
### 配置logger
log4j.logger.com.xx.demo.service=Info,dailyRollingFile
log4j.additivity.com.xx.demo.service=false
log4j.logger.org.apache.ibatis=Info,dailyRollingFile


## 配置输出
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.Target = System.out
log4j.appender.console.layout.conversionPattern = %-d{yyyy-MM-dd } [ %t:%r ] - [ %p ] %M%n

## 根 定义 输出对象 , logger.对应的包 == 输出级别 , 输出对象的配置,配置中的一些值
log4j.appender.dailyRollingFile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyRollingFile.File = logs/a.log
log4j.appender.dailyRollingFile.Append = true
log4j.appender.dailyRollingFile.Threshold= INFO
log4j.appender.dailyRollingFile.layout = org.apache.log4j.PatternLayout
log4j.appender.dailyRollingFile.layout.ConversionPattern = %F %-d{yyyy-MM-dd } [ %t:%r ] - [ %p ] %m%n


## 根 定义 输出对象 , logger.对应的包 == 输出级别 , 输出对象的配置,配置中的一些值
log4j.appender.errorFile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorFile.File = logs/xx.log
log4j.appender.errorFile.Append = true
log4j.appender.errorFile.Threshold= info
log4j.appender.errorFile.layout = org.apache.log4j.PatternLayout
log4j.appender.errorFile.layout.ConversionPattern = %-d{yyyy-MM-dd } [ %t:%r ] - [ %p ] %m%n

首先一个日志记录是必须要去匹配一个具体的输出对象的,首先会去logger是不是指定了对应的文件输出,如果没有指定那么就去log4j.rootLogger中查找输出对象,然后使用符合的对象。log4j.additivity.com.xx.demo.service=false //表示不向上传递,也就是说我找到了包指定的输出的文件,如果写false就不会去根里面去使用其他的了,如果默认写true,那么不仅仅会在指定的输出对象进行输出,而且还会在root配置的输出对象进行输出。

2.appender是输出对象,包括不同对应的类

  • appenderName是日志输出位置的配置的命名
  • log4j.appender.appenderName = fully.qualified.name.of.appender.class中fully.qualified.name.of.appender.class应换上以下信息输出的目的地
  1. org.apache.log4j.ConsoleAppender(控制台)
  2. org.apache.log4j.FileAppender(文件)
  3. org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
  4. org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
  5. org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

appender具有layout的对象是定义输出格式的

  1. org.apache.log4j.HTMLLayout(以HTML表格形式布局)
  2. org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
  3. org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
  4. org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

具体配置文件需要写什么我觉得下面这个网址介绍很全

https://blog.csdn.net/satomiyo/article/details/100040235 log4j配置文件

 

七、logback的配置文件

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

<contextName>logback</contextName>
<!--定义参数,后面可以通过${app.name}使用-->
<property name="app.name" value="logback_test"/>
<!--ConsoleAppender 用于在屏幕上输出日志-->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<!--定义了一个过滤器,在LEVEL之下的日志输出不会被打印出来-->
<!--这里定义了DEBUG,也就是控制台不会输出比ERROR级别小的日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
<!-- encoder 默认配置为PatternLayoutEncoder -->
<!--定义控制台输出格式-->
<encoder>
<pattern>%d [%thread] %-5level %logger{36} [%file : %line] - %msg%n</pattern>
</encoder>
</appender>

<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--定义日志输出的路径-->
<!--这里的scheduler.manager.server.home 没有在上面的配置中设定,所以会使用java启动时配置的值-->
<!--比如通过 java -Dscheduler.manager.server.home=/path/to XXXX 配置该属性-->
<file>${scheduler.manager.server.home}/logs/${app.name}.log</file>
<!--定义日志滚动的策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--定义文件滚动时的文件名的格式-->
<fileNamePattern>${scheduler.manager.server.home}/logs/${app.name}.%d{yyyy-MM-dd.HH}.log.gz
</fileNamePattern>
<!--60天的时间周期,日志量最大20GB-->
<maxHistory>60</maxHistory>
<!-- 该属性在 1.1.6版本后 才开始支持-->
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<!--每个日志文件最大100MB-->
<maxFileSize>100MB</maxFileSize>
</triggeringPolicy>
<!--定义输出格式-->
<encoder>
<pattern>%d [%thread] %-5level %logger{36} [%file : %line] - %msg%n</pattern>
</encoder>
</appender>

<!--root是默认的logger 这里设定输出级别是debug-->
<root level="trace">
<!--定义了两个appender,日志会通过往这两个appender里面写-->
<appender-ref ref="stdout"/>
<appender-ref ref="file"/>
</root>

<!--对于类路径以 com.example.logback 开头的Logger,输出级别设置为warn,并且只输出到控制台-->
<!--这个logger没有指定appender,它会继承root节点中定义的那些appender-->
<logger name="com.example.logback" level="warn"/>

<!--通过 LoggerFactory.getLogger("mytest") 可以获取到这个logger-->
<!--由于这个logger自动继承了root的appender,root中已经有stdout的appender了,自己这边又引入了stdout的appender-->
<!--如果没有设置 additivity="false" ,就会导致一条日志在控制台输出两次的情况-->
<!--additivity表示要不要使用rootLogger配置的appender进行输出-->
<logger name="mytest" level="info" additivity="false">
<appender-ref ref="stdout"/>
</logger>

<!--由于设置了 additivity="false" ,所以输出时不会使用rootLogger的appender-->
<!--但是这个logger本身又没有配置appender,所以使用这个logger输出日志的话就不会输出到任何地方-->
<logger name="mytest2" level="info" additivity="false"/>
</configuration>

 与log4j的原理类似。

 

 

posted @ 2019-11-22 18:08  逆水不进则退  阅读(385)  评论(0)    收藏  举报