普通使用只要声明SLF4J包下的Logger类就可以直接使用了
maven依赖加上:
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency>
@RunWith(SpringRunner.class)
@SpringBootTest
public class test {
private final Logger logger = LoggerFactory.getLogger(test.class);
//所在类类名和路径,如果写其他类,打印输出的时候就会显示其他类的类名
@Test
public void test1(){
logger.info("info-----------");
logger.debug("debug----------");
logger.error("error-----------");
}
}
yml中配置日志等级后可以查看到debug信息:logging.level.root: debug
否者只能看到info和error信息;因为系统默认的日志级别是info,日记级别 > info可以输出,debug level < info 所以要在yml中配置等级后才可以输出。
在windows下的idea中默认搜索快捷键,ctrl+shift+n,搜索SLF4J包下的Level类就可以看到所有的日志等级。
日志等级
yml中配置日志等级为debug后的console输出信息
或者用更方便的方式,用注解的形式来声明;
同样先加上maven依赖,这是个小工具
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
</dependency>
//选择版本的时候在maven reposiry中捞一个使用人数最多的就行,不然会踩中一脸懵逼的坑
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j //注解可以省去手动声明Logger类,并且在LoggerFactory.getLogger中默认当前类
public class test {
@Test
public void test3(){
log.debug("debg---------------");
log.info("info-------------------");
log.error("error----------------------");
//输出变量,用{}做占位符,类似C中的printf
String name = "qqq";
String password = "qqq";
log.info("info-------------------name:{},password:{}",name ,password );
}
}
既然都用上注解了,当然还有更好玩的;logback可以自定义配置;而配置又分为:application.yml和logback-spring.xml两种方式。前者配置简单,后者可以进行复杂的配置。
yml中简单配置
logging:
pattern:
#日志输出格式,%d日期;%msg日志信息;%n换行
console: "%d - %msg%n"
#日志文件的存放目录
#path: d:/tomcat
#path和file二者只需要一个,默认叫spring.log
file: d:/tomcat/temp.log
#日志级别
#level: debug
#或者针对某一个类设置日志级别
level:
com.chan.wechatshop.impl.test: debug
真实项目中用第二种方式logback-spring.xml比较常见
在resources路径下新建logback-spring.xml文件
<?xml version="1.0" encoding="utf-8" ?> <configuration>
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<layout clas="ch.qos.logback.classic.PatternLayout">
<pattern>
%d - %msg%n
</pattern>
</layout>
</appender>
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--<!–过滤输出到日志文件的日志内容–>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>
<!–只配置这个还是会输出ERROR等级的日志,因为error level > info level;拦截的是>=info等级的内容–>
INFO
</level>
</filter>-->
<!--要用下面这种方式才能过滤输出到日志文件的ERROR信息,类似switch case,onMatch和onMisMatch中的指令在LevelFilter类的FilterReply中可以看到-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<!--匹配到上面level的ERROR等级日志时,禁止输出到日志文件中-->
<onMatch>DENY</onMatch>
<!--匹配到上面的ERROR日志时,输出到日志文件中,(还有一个指令NEUTRAL,代表当前这条策略不做操作,让下一条策略去匹配)-->
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<pattern>
%msg%n
</pattern>
</encoder>
<!--滚动策略,按照时间滚动-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径要先去建好,不然会报错,linux/Mac下要给予可写权限,sudo chmod -R 777 /var/log/tomcat
windows 类似,D:\log\tomcat-->
<fileNamePattern>
<!--在文件名中带上时间,配置完后要在下面root level中指定这个配置-->
D:\tomcat\info.%d.log
</fileNamePattern>
</rollingPolicy>
</appender>
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--过滤输出到日志文件的日志内容-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>
ERROR
</level>
</filter>
<encoder>
<pattern>
%msg%n
</pattern>
</encoder>
<!--滚动策略,按照时间滚动,每天创建一个文件-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径要先去建好,不然会报错,linux/Mac下要给予可写权限,sudo chmod -R 777 /var/log/tomcat
windows 类似,D:\log\tomcat-->
<fileNamePattern>
<!--在文件名中带上时间,配置完后要在下面root level中指定这个配置-->
D:\tomcat\error.%d.log
</fileNamePattern>
</rollingPolicy>
</appender>
<!--root代表整个项目的日志等级-->
<root level="info">
<!--上面配置的appender中的name-->
<appender-ref ref="consoleLog"/>
<appender-ref ref="fileInfoLog"/>
<appender-ref ref="fileErrorLog"/>
</root>
</configuration>
或者可以参考springboot自己的日志设置
logbackxml demo2
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 -->
<property name="LOG_HOME" value="/workspace/logs" />
<property name="APPLICATION_NAME" value="blank_hand" />
<!--<property name="COLOR_PATTERN" value="%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta( %replace(%caller{1}){'\t|Caller.{1}0|\r\n', ''})- %gray(%msg%xEx%n)" />-->
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}:%L) - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名 -->
<FileNamePattern>${LOG_HOME}/${APPLICATION_NAME}-%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志文件保留天数 -->
<MaxHistory>30</MaxHistory>
<maxFileSize>10MB</maxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>
</encoder>
</appender>
<!-- 生成 error html格式日志开始 -->
<appender name="HTML" class="ch.qos.logback.core.FileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!--设置日志级别,过滤掉info日志,只输入error日志-->
<level>ERROR</level>
</filter>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<pattern>%p%d%msg%M%F{32}%L</pattern>
</layout>
</encoder>
<file>${LOG_HOME}/error-log.html</file>
</appender>
<!-- 生成 error html格式日志结束 -->
<!-- 每天生成一个html格式的日志开始 -->
<appender name="FILE_HTML" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名 -->
<FileNamePattern>${LOG_HOME}/${APPLICATION_NAME}-%d{yyyy-MM-dd}.%i.html</FileNamePattern>
<!--日志文件保留天数 -->
<MaxHistory>30</MaxHistory>
<MaxFileSize>10MB</MaxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<pattern>%p%d%msg%M%F{32}%L</pattern>
</layout>
</encoder>
</appender>
<!-- 每天生成一个html格式的日志结束 -->
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
<appender-ref ref="HTML" />
<appender-ref ref="FILE_HTML" />
</root>
</configuration>
有新的理解再补上,菜鸡奔跑中~~~~~~~
运行异常信息丢失,没有输出到error日志文件中(情况1)
当一个运行时的异常没有被try
catch捕获的时候,此时如果之前配置的info日志文件剔除了error日志消息,这个时候error日志中不会写入这个报错。这个错误信息就会丢失。
所以在写代码的时候,如果不能保证没有异常,最好外面加个try catch以便在以后出问题的时候可以捕获这个异常
yml中指定logback文件
logging:
config: classpath:log/logback-dev.xml