日志框架:
一套能够实现日志输出的工具包;
日志定义:能够描述系统运行状态的所有时间都可以算作日志;例如:用户下线,接口超时,数据库崩溃等等。
日志框架能力:
定制输出目标,定制输出格式,携带上下文信息,运行时的选择性输出,灵活的配置,优异的性能。
常见的日志框架有:JCL、JUL、Log4j、Log4j2、Logback、SLF4j、jboss-logging等等。
其中:
日志门面:JCL、SLF4j、jboss-logging
日志实现:JUL、Log4j、Log4j2、Logback
关于日志的选择:一般情况下一个日志由日志门面加上日志实现组成。通常选择SLF4j+Logback的组合进行日志的开发。
日志的使用:
方法一:在该类中写明:
private final Logger logger = LoggerFactory.getLogger(LoggerTest.class);
GetLogger()中的参数为要打印日志的类的类名;需要打印时就使用logger.info(“info”)等相关进行级别(日志共有5个级别)打印;
方法二:注解:
在需要打印日志的类上加入@Slf4j这个注解,具体通过
log.info("info");
相关依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
PS:如果导入依赖还使用log报错,那么就是IDEA没有下载lombok插件,通过setting->plugins->搜索lombok插件下载->重启IDEA即可。
日志的变量输出::
日志中输出变量可以通过
log.info(“name:{} , password:{}”,name,password);
该方式类似C语言的printf的输出,但是不用取地址符号;并且{}表示占位符,变量的顺序和占位符的顺序保持一致。例如变量name是一个,那么输出时就在第一个占位符{}处显示变量name的值。
Logback的配置(这里以SpringBoot为例):
在application.yml中进行配置(只能做简单配置,这里用properties的写法方便观看):
1.一般用与设置日志存放的位置(logging.file.path)
2.打印到控制台的格式
3.调整日志的级别(logging.level)日志级别可以指定到某个类,只需要指明包名和类名就可以了。
在logback-spring.xml进行配置(可以做复杂配置)
比较流行的需求为:区分info和error日志、每天产生一个日志文件,具体操作配置如下:
在这个配置可对info和error日志的分别打印:
对于error:
appender name="fileError" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--根据范围来过滤,只接受这个及以上级别的日志;这个只能用于ERROR,因为ERROR为最高级别的-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>
%d - %msg%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>C:\Users\ASUS\Desktop\copy-422-master\copy-422\doc\error.%d.log</fileNamePattern>
</rollingPolicy>
</appender>
对于INFO:
<appender name="fileInfo" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--只拦截-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--表示如果有ERROR就拒绝,其他就接受。也是根据默认级别(INFO)以上为判断还有一个“中立的参数”,直接忽略这段拦截-->
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<pattern>
%d - %msg%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>C:\Users\ASUS\Desktop\copy-422-master\copy-422\doc\info.%d.log</fileNamePattern>
</rollingPolicy>
</appender>
不论是哪一种appender配置都要对其进行激活使用(Ref为 appender的name属性值):
<root level="info">
<appender-ref ref="consoleLog" />
<appender-ref ref="fileInfo" />
<appender-ref ref="fileError" />
</root>
logback的详细配置:
1.启动时指定某个路径下的配置,就会优先加载
2.如果没有配置这个属性,就加载classpath类路径下的logback.grove
3.如果扔没找到,就加载统计目录下的logback-test.xml这个文件
4.如果也没有,就加载logback.xml这个文件
5.如果都没找到上述文件的话:
(1)Jkd>1.6:会调用一个ServiceLoad的,去查找com.qos.logback.classic.spi.Configurator这个接口的第一个实现类,在这个类上硬编码上相关的配置,这样他就自动调用这个类做相关的配置了。
(2)如果上面都没有的话就使用ch.qos.logback.classic.BasicConfigurator这样的实现类,这个实现类的功能就是在这个控制台上直接输出控制,也就是说如果不做相关配置的话,就将日志直接输出到控制台中。
详情
第一个标签为(最外层标签)
<configuration scan=”true” scanPerid=”60 seconds” debug=”false”>
参数信息:
scan=”true”:表示当配置文件发生更改后,会自动重新加载;默认值为true
scanPerid=””:设置监测配置文件是否有修改时间的时间间隔;默认单位是毫秒,默认值是每分钟,每分钟就去扫一下看配置文件有没有发生变化
debug如果设置为true,它将打印出logback内部的日志信息,实时查看logback的运行状态。因为logback很稳定了,因此设置为false
定义参数常量 :
日志级别:
TRACE < DEBUG < INFO < WARN < ERROR
New 出一个logger实例,会依次调用trace
logger.trace("msg")或 logger.debug...
如果指定logger的级别为INFO的话,那么INFO一下的就不会被打印出来,只显示INFO上的;实际开发一般只用DEBUG INFO ERROR 这三个级别的日志存在三个文件中。
<property name="log.level" value="debug" />
文件要保留多长时间
<property name="log.maxHistory" value="30" />
日志存储根路径,通过查看服务启动日志可以得到
${catalina.base}:tomcat实例跟目录
<property name="log.filePath" value="${catalina.base}/logs/webapps" />
日志展现的格式:
%d:时间格式 年月日,小时分钟秒毫秒
[%thread]%:表示这个程序是属于哪个线程执行的
-5:缩进五位,从左显示五个字符宽度
Level:显示日志级别
%logger{50}}-%msg:表示哪个类输出的相关的日志信息
%n:换行符
<property name="log.pattern" value="%d{yyyy-MM-dd
HH:mm:ss.SSS}[%thread]%-5level%logger{50}-%msg%n" />
控制台设置 :
//类似layout,但layout仅仅是将一个event时间转换成一个字符串的功能。
encoder出了event时间转换成byte数组,还会将转换后的byte数组输出到文件中。
即encoder既负责转换字符串,也负责将日志输出到文件中
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
定义log输出的格式
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
debug日志信息配置:
name随便定义
<!-- 随着size的增大滚动出新的日志,或随着日期变化,滚出新的日志文件-->
<appender name="debugAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--文件路径 -->
<file>${log.filePath}/debug.log</file>
<!-- 滚动策略,基于事件滚蛋 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件名称,随着日期的变化,非当日的日志会被打包成.gz文件 -->
<fileNamePattern>${log.filePath}/debug/debug.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<!--最大的保存历史数量,保存对应的天-->
<maxHistory>${log.maxHistory}</maxHistory>
</rollingPolicy>
既将日志信息输出成字符串,又将字符串输出到文件里面
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
过滤器,过滤掉非DEBUG日志
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
符合DEBUG级别的日志信息,那么就记录下来
<onMatch>ACCEPT</onMatch>
如果不是,就过滤掉
<onMismatch>DENY</onMismatch>
<!-- 如果忽略onMismatch,level和onMatch也不能生效,将保存全部的日志。 --> </filter>
</appender>
存放日志对象,告诉logback需要关注哪一个包下的信息,name就是要关注的包。
level用来告诉logback,我们log仅记录哪个以上的信息。(前面已经赋值DEBUG了,那么日志将从DEBUG开始打印)
<logger name="com.csj2018.o2o" level="${log.level}" additivity="true">
<!-- name需要关注那个package下的信息 -->
<!-- level:用来告诉logback,log仅记录那个level以上的信息 -->
<!-- additivity:当为true时,logger就会将父类root下的appender-ref放到logger里面来,即logger也支持在控制台输出相关的日志信息,并且它的level不是按照root指定的level输出日志信息 ,在控制台将按照logger指定的level指定的level输出日志信息,因为他是基于同一个标签的那个level的 -->
<!-- 业务里面,一个类只能对应一个logger,也就是说这个类的日志信息,要么在这个logger里面输出,要么是往root里面去写。由于我们指定了packageName,package下面所有的类都和logger是对象的, 只在这个logger里面输出 -->
<appender-ref ref="debugAppender" />
<appender-ref ref="infoAppender" />
<appender-ref ref="warnAppender" />
<appender-ref ref="errorAppender" />
</logger>
<root level="info">
<!-- 如果logger中的level没有指定,就会继承root下的level,仅输出info级别以上的信息 -->
<appender-ref ref="consoleAppender" />
</root>
另外,今天在找一些资料的时候发现一篇文章写得非常详细一起贴上:
https://www.cnblogs.com/warking/p/5710303.html