Java日志—logback+slf4j基础教程
- 前言
- 一、日志简介
- 二、日志
- 1.maven
- 2.jar包
- 3.slf4j
- 4.logback
- 三、各种配置以及常见问题
- 1.设置jdk
- 2.logback.xml里的常用配置
- 四、打jar包
- 五:细节问题
- 1.如何把txt也打入jar包
- 2.lombok@Test爆红
- 3.常见打印日志错误
- 总结
前言
本人太菜,只学会了slf4j+logback,而且只学会了皮毛
一、日志简介
- 日志实现:JUL,logback,Log4j,Log4j2
- 日志门面(接口):JCL,slf4j
- 为了解决不同日志实现之间的没有关联才出现的日志门面
- 目前最流行(可能是几年前了)的搭配是slf4j+logback
二、日志
1.maven
- Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
- maven可以用来解决依赖的问题(不用自己手动的导入jar包,而且还能管理jar包)
- idea里自带maven,当然也可以用自己的maven
2.jar包
- jar 是 Java ARchive 的缩写。jar包是别人已经写好的一些类,然后将这些类打包,如果想用,直接把包引入项目,就可以直接用了
3.slf4j
- 五个级别:error、warn、info、debug、trace
- 获取日志记录器
public static final Logger LOGGER= LoggerFactory.getLogger(slf4j_test.class);
- 导入的一定是这两个包
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
try {
int i=1/0;
}catch (Exception e){
LOGGER.error("...",e);//不要e.print...
}
- 添加slf4j-api的依赖
- slf4j有且仅有一个日志实现框架的绑定(也就是logback.classic和slf4j-log4j2、slf4j-simple不能同时出现)
4.logback
- logback分为三个模块
- logback-core 其他两个模块的基础模块
- logback-classic 是log4j的一个改良版本,同时完整的实现了slf4j API
- logback-access 访问模块与。。。。。
- 添加依赖
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.26</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
- 在resources下面创建logback.xml文件,在里面可以配置
- 日志输出配置
- 日志级别
- Appender类型
- 文件输出路径
- 同步日志和异步日志
- 自定义logger实现输出的灵活控制
- 所有logger都是root logger(debug)的后代(继承)
- 打印日志用占位符,避免字符串拼接,避免level判断。
log.debug("Current count is {}" , count);
占位符{}允许接收任何object,并且调用其toString方法来记录日志。 - 模板
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class test {
public static void main(String[] args) {
//方法1:构造LOGGER
Logger LOGGER = LoggerFactory.getLogger(test.class);
LOGGER.info("done");
//方法2:lombok
log.info("done");
}
}
三、各种配置以及常见问题
1.设置jdk
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>16</source>
<target>16</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
2.logback.xml里的常用配置
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--日志输出格式-->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c %M %L [%thread] %m%n"></property>
<!--文件输出路径-->
<property name="log_dir" value="SGS"></property>
<!--控制台输出-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!--控制输出流对象-->
<target>System.err</target>
<!--日志消息格式 也就是自定义Layout-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!--文件日志输出-->
<appender name="file" class="ch.qos.logback.core.FileAppender">
<!--日志文件保存路径-->
<file>${log_dir}/SGS.log</file>
<!--日志消息格式-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<root level="ALL">
<appender-ref ref="console"/>
<appender-ref ref="file"/>
</root>
</configuration>
四、打jar包
这不是唯一打jar包的方法,其他方法我还不会操作, 引入第三方jar包 的问题困扰了我很久
如果不引入第三方jar包会出现一个奇奇怪怪的错误
但是百度上的方法都解决不了,而且并没有解释清楚是因为什么出错
- 打开项目结构,按照一下步骤点开
- 添加主类点确定
- 最后成这样子
- 项目-构建工件
- 最后在这个目录下就出来了jar包了
- 打开cmd,到jar包所在目录,然后java -jar xxx.jar就可以运行了
五:细节问题
1.如何把txt也打入jar包
- 在resources里加入xxx.txt
- 用一下方法读取文件就可以了
InputStream is=this.getClass().getResourceAsStream("/wujiang.txt");
BufferedReader br=new BufferedReader(new InputStreamReader(is));
2.lombok@Test爆红
- 添加依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
- 导入的一定是这个
import org.junit.Test;
3.常见打印日志错误
- 不要使用 System.out.print…,这东西只会打印到控制台
- 不要使用 e.printStackTrace(),同上
- 不要抛出异常后又输出日志
如捕获异常后又抛出了自定义业务异常,此时无需记录错误日志,由最终捕获方进行异常处理。不能又抛出异常,又打印错误日志,不然会造成重复输出日志。
try {
// ...
} catch (Exception e) {
// 错误
LOG.error("xxx", e);
throw new RuntimeException();
}
- 没有输出全部错误信息
try {
// ...
} catch (Exception e) {
// 错误
LOG.error('XX 发生异常', e.getMessage());
// 正确
LOG.error('XX 发生异常', e);
}
- 不要使用错误的日志级别
try {
// ...
} catch (Exception e) {
// 错误
LOG.info("XX 发生异常...", e);
}
总结
- 持续更新中…