logback日志详解

日志框架:

一套能够实现日志输出的工具包;

日志定义:能够描述系统运行状态的所有时间都可以算作日志;例如:用户下线,接口超时,数据库崩溃等等。

日志框架能力
定制输出目标,定制输出格式,携带上下文信息,运行时的选择性输出,灵活的配置,优异的性能。

常见的日志框架有: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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值