明天要去学习的
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对象。
### 配置根 ###log4j.rootLogger = info,errorFile
### 配置loggerlog4j.logger.com.xx.demo.service=Info,dailyRollingFilelog4j.additivity.com.xx.demo.service=false
## 配置输出log4j.appender.console = org.apache.log4j.ConsoleAppenderlog4j.appender.console.layout = org.apache.log4j.PatternLayoutlog4j.appender.console.Target = System.outlog4j.appender.console.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应换上以下信息输出的目的地
- org.apache.log4j.ConsoleAppender(控制台)
- org.apache.log4j.FileAppender(文件)
- org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
- org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
- org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
appender具有layout的对象是定义输出格式的
- org.apache.log4j.HTMLLayout(以HTML表格形式布局)
- org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
- org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
- 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的原理类似。