笔者的回首掏:重新梳理、纠正之前欠妥的地方2019-08-09 10:44:00。
SpringBoot会默认使用logback作为日志框架。
SpringBoot会默认加载classpath:logback.xml或者classpath:logback-spring.xml或者classpath:logback-spring.groovy等文件作为日志配置文件。
注:也可以在系统配置文件中指定SpringBoot加载哪一个文件作为日志配置文件,在application.properties文件
中增加:logging.config=classpath:xxx.xml 即可指定xxx.xml为日志配置文件。
如果是SpringBoot的项目的话,直接把logback-spring.xml配置文件放在src/main/resources文件夹下即可,如:
注:只要引入了spring-boot-starter-parent依赖,那么其会自动引入logback的相关依赖。
注:logback-spring.xml如何配置,见下文。
声明:下面的配置较基本,如果实际运用时,感觉下述配置不满足需求,那么请查阅相关文档了解更多。
logback-spring.xml配置示例:
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36}:%L- %msg%n
UTF-8
${log-dir}/${log-name}.log
${log-dir}/${log-name}.%d{yyyy-MM-dd}.%i.log
7
5MB
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36}:%L- %msg%n
UTF-8
给出上述配置在指定文件夹位置生成的log文件示例:
注:最新的日志,都在logFile.log文件中。
注:虽然我们限制了单个log文件的大小,但是其并不是严格的,即:一般会在超过界限大小不多后,进行日志文件的
拆分。
注:上述配置有两个“淘汰”,第一个是“非当天的日志,淘汰”;第二个是“超过了指定大小的日志,淘汰”;由于本人
测试时间的原因,这里只体现了第二个;其实第一个也是有效的。
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.alibaba.fastjson.JSON;
import com.aspire.mapper.JavaAnnotationMapper;
import com.aspire.model.Employee;
import com.aspire.util.ExceptionUtil;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = { AbcLogbackDemoApplication.class })
public class AbcLogbackDemoApplicationTests {
/** 自动装配 */
@Autowired
JavaAnnotationMapper javaAnnotationMapper;
/** Logger实例 */
static final Logger logger = LoggerFactory.getLogger(AbcLogbackDemoApplicationTests.class);
/**
* logback测试
*
* @date 2018年7月26日 下午4:12:56
*/
@Test
public void logbackTest() {
logger.info("进入logbackTest方法了!");
try {
Employee employee = new Employee("邓某", 24, "男");
logger.info("employee对象的相应参数为:" + JSON.toJSONString(employee));
javaAnnotationMapper.singleInsertAutoGetKey(employee);
Integer id = employee.getId();
logger.info("向表中插入employee对象的数据后,自动获取到的主键为:" + id);
// System.out.println(1 / 0);
} catch (Exception e) {
logger.error("出错咯!错误信息:" + e.getMessage(), e.getCause());
// 打印出错误堆栈信息
e.printStackTrace();
}
logger.info("SpringBoot使用logback示例。");
logger.info("logbackTest方法执行完毕!");
}
}
注:e.printStackTrace()只能将错误堆栈信息输出到console不能将错误堆栈信息输出到日志文件中;使用logback框架
时,如果既想将错误堆栈信息输出到console,又想将错误堆栈信息输出到日志文件中,那么在传参时,需要将
Throwable异常实例也一起传过去:
给出两个示例:
示例一(不使用marker标记站位,直接写msg):
示例二(使用marker标记站位写msg):
注:如果用户实现了Marker接口,这里也可以直接写Marker接口的实例。
启动jar包时,可这样指定日志级别,如:
java -jar logback-demo-0.0.1-SNAPSHOT.jar --logging.level.root=info --logging.level.com.szlzcl.abc=debug
在配置文件(如:.properties文件)中,可这样指定日志级别,如:
# 指定root的级别
logging.level.root=info
# 指定com.szlzcl.abc对应的logger的日志级别
logging.level.com.szlzcl.abc=debug
注:当有多处指定了同一logger的level时,会选择使用优先级最高的配置,优先级:
启动jar包时 > xxx.properties/xxx.yml中 > 日志xml配置文件中。
如果有的日志框架不能将e.printStackTrace()的信息打印到日志文件中,那么我们可以使用下面这个工具类,将错误栈信息转化为字符串,然后手动打印到日志文件中。
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
/**
* 异常工具类
*
* @author JustryDeng
* @date 2018年7月27日 上午1:32:44
*/
public class ExceptionUtil {
/**
* 将异常堆栈 信息 转换为字符串
*
* @param e
* 异常
* @return 该异常的错误堆栈信息
* @date 2018年7月27日 上午1:35:27
*/
public static String getStackTraceMessage(Exception e) throws IOException {
try (StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw)) {
// 将异常的的堆栈信息输出到printWriter中
e.printStackTrace(pw);
pw.flush();
sw.flush();
return sw.toString();
}
}
}
提示:如果是普通Java项目使用logback的话,那么需要引入以下依赖
同时,要将logback-spring.xml改名为logback.xml(因为普通java项目默认能识别logback.xml而不能识别logback-spring.xml),放入classpath下,如:
提示:个人认为,要想对日志框架有比较熟悉的了解,还需要掌握xml中logger标签的级别继承、基本选择原则等
基础知识,此处读者可自行查阅相关文档。