为什么要使用日志?
使用日志的原因很多种。
比如:
- 追查项目存在的问题(bug)
- 方便调试(debug)
- 等…
可能有人就说了,为什么要使用日志而不使用System.out.println();呢,不都是输出到控制台吗?使用sout(简称)功能方便没有日志多,比如:
1、不能形成文件,只是简单控制台输出而已。
2、不便于追查
3、不能选择性的输出记录 比如:我只要输入error级别的日志
等…
常见的日志框架有哪些?
1、log4j
log4j作者现在不维护了
2、log4j2
很优秀、超高性能
3、logback
logback是log4j的升级版本
4、slf4j
springboot自带slf4j和logback
日志级别?
package org.slf4j.event;
public enum Level
ERROR(40, "ERROR"),
WARN(30, "WARN"),
INFO(20, "INFO"),
DEBUG(10, "DEBUG"),
TRACE(0, "TRACE");
从上到下可以看到日志的级别最高为error>warn>info>debug>trace 上面代码表示:数值越大级别越高,表示事态越严重。
日志使用注意事项
case1
private final Logger logger = LoggerFactory.getLogger(PayController.class);
比如:一个类PayController中,使用日志进行输出的一定得使用PayController.class,而不能写PayController2.class,
否则:导致的问题在出现问题的时候,会导致错误信息定位不正确。
一定得写当前类!!!
当然如果想避免这个问题可以使用一个小工具:lombok,然后在每个类型加上注意即可:@Slf4j
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
既解决了不会写错的问题,也可以避免了繁琐的在每个类都要写private final Logger logger = LoggerFactory.getLogger(xxx.class);这的日志声明。
项目中日志配置使用
在这么我们使用的是logback
在日志配置方式有两种:
- 简单配置
简单配置就是通过xxxx.propertis或者application.yml进行配置,虽说配置简单,但是功能少不能满足众多需求。
所以推荐使用xml进行配置使用日志…
比如:每天要产生一个日志文件(按日志归类)简单配置是不能进行实现的
简单日志配置详细讲解1:
//配置日志控制台输出格式 %d(输出日期)%msg(输出消息) %n(换行)
//控制台会输出的信息为 日期-内容 并且每输出一行后换行输出
logging:
pattern:
console: "%d - %msg%n"
简单日志配置详细讲解2:
//path 表示日志输出到那个文件夹中并形成文件
logging:
pattern:
console: "%d - %msg"
path: c:temp/logs/
简单日志配置详细讲解3:
//file与path 的区别是 path是在指定的logs文件中创建一个日志文件(默认为spring.log),而file是在指定的文件夹中创建logs2日志文件记录
logging:
pattern:
console: "%d - %msg"
file: c:/temp/logs2
简单日志配置详细讲解4:
// level: debug 控制台输出的日志级别只有debug级别其它的都不输出
logging:
level: debug
pattern:
console: "%d - %msg"
file: c:/temp/logs2/
简单日志配置详细讲解5:
// level: 指定到某个类中级别为info
logging:
level:
com.bopai.dataobject.mapper: info
pattern:
console: "%d - %msg"
file: c:/temp/logs2/
- xml配置
为了满足真实项目的需求,需要通过配置xml才能实现。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!-- 配置的控制台输出-->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<!-- layout 展现形式-->
<layout class="ch.qos.logback.classic.PatternLayout">
<!-- 输出格式 %d为输出的时间 %msg为输出的内容 %n为换行-->
<pattern>
%d - %msg%n
</pattern>
</layout>
</appender>
<!--配置日志输出到文件只输出info级别的 RollingFileAppender滚动输出每天-->
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--进行过滤其他级别的输出-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch> <!-- 禁止(如果是匹配到error就禁止,否则ACCEPT(使用这条规则))-->
<onMismatch>ACCEPT</onMismatch> <!-- 命中这条规则-->
</filter>
<encoder>
<!-- 输出格式 %d为输出的时间 %msg为输出的内容 %n为换行-->
<pattern>
%msg%n
</pattern>
</encoder>
<!--滚动策略 按时间进行滚动 每天一个日志文件-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 配置生成文件的路径,并加上文件的名称(info.%d.log) %d为时间-->
<fileNamePattern>
/var/log/tomcat/ivs-100/info.%d.log
</fileNamePattern>
</rollingPolicy>
</appender>
<!--配置日志输出到文件 只输出error级别的 RollingFileAppender滚动输出每天-->
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--进行过滤其他级别的输出-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!-- 配置只输出error级别的日志-->
<level>ERROR</level>
</filter>
<encoder>
<!-- 输出格式 %d为输出的时间 %msg为输出的内容 %n为换行-->
<pattern>
%msg%n
</pattern>
</encoder>
<!--滚动策略 按时间进行滚动 每天一个日志文件-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 配置生成文件的路径,并加上文件的名称(error.%d.log) %d为时间-->
<fileNamePattern>
/var/log/tomcat/ivs-100/error.%d.log
</fileNamePattern>
</rollingPolicy>
</appender>
<!--放到root中表示整个项目都适用 级别为info-->
<root level="info">
<!-- 控制台输出级别为info并且输出格式为日期+内容换行输出,启动项目的时候可以观察效果 -->
<appender-ref ref="consoleLog"/>
<!-- 日志输出到文件中级别为:info并且输出格式为日期+内容换行输出,每天一个日志文件并且过滤了其他级别的日志并指定了日志生成路径
日志文件名称为info+日期.log -->
<appender-ref ref="fileInfoLog"/> <!-- -->
<!-- 日志输出到文件中级别为:error并且输出格式为日期+内容换行输出,每天一个日志文件并且过滤了其他级别的日志并指定了日志生成路径
日志文件名称为error+日期.log -->
<appender-ref ref="fileErrorLog"/> <!-- -->
</root>
</configuration>