Java# 在项目中使用SLF4J+Logback来记录日志
Posted LRcoding
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java# 在项目中使用SLF4J+Logback来记录日志相关的知识,希望对你有一定的参考价值。
1. 简介
1.1 SLF4J概述
SLF4J 代表 Simple Logging Facade for Java。相当于一个门面,提供了 Java 中所有日志框架的简单抽象。
- 使用 SLF4J 框架,可以在部署时,迁移到所需的日志记录框架(如 Log4j, JUL, Simple logging,NOP等)
- SLF4J 支持参数化日志记录消息
- SLF4J提供了一个简单的Java工具,称为迁移器。
日志严重程度:
序号 | 严重程度 | 描述 |
---|---|---|
1 | Fatal | 导致应用程序终止的严重问题 |
2 | ERROR | 运行时错误 |
3 | WARNING | 大多数情况下,这种级别的错误是由于使用了已弃用的API |
4 | INFO | 运行时发生的事件 |
5 | DEBUG | 有关系统流程的信息 |
6 | TRACE | 有关系统流程的更多详细信息 |
SLF4J 和 Log4j的关系:
1.2 Logback概述
Logback 分为三个不同的模块,logback-core
(核心代码模块),logback-classic
(log4j的一个改良版本,同时实现了slf4j
的接口,这样如果之后要切换其他日志组件也是一件很容易的事),logback-access
(访问模块与Servlet容器集成提供通过Http来访问日志的功能)
Logger
和 LoggerFactory
是 SLF4J包中的类 , LoggerContext
的作用是获得内部状态信息
logback在启动的时候,会按照下面的顺序加载配置文件(只要获取到配置之后就不再继续获取了)
- 如果Java程序启动时指定了
logback.configurationFile
属性,就用该属性指定的配置文件。- 如
java -D logback.configurationFile=/path/myLogback.xml Test
,这样执行Test类的时候就会加载/path/myLogback.xml配置
- 如
- 在classpath(resources目录下)中查找 logback.groovy 文件
- 在classpath中查找 logback-test.xml 文件
- 在classpath中查找
logback.xml
文件 - 如果是 JDK6+,那么会调用ServiceLoader 查找 com.qos.logback.classic.spi.Configurator接口的第一个实现类
- 自动使用 ch.qos.logback.classic.BasicConfigurator 在控制台输出日志
2. 项目中进行使用
使用 Maven进行快速开发
2.1 导入依赖
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version> <!-- 请根据情况选择合适的版本 -->
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version> <!-- 请根据情况选择合适的版本 -->
</dependency>
2.2 在resources目录下添加logback.xml
示例文件:
<?xml version="1.0" encoding="UTF-8"?>
<!--
debug(默认false):要不要打印 logback内部日志信息
scan(默认true):配置发生改变时,要不要重新加载
scanPeriod(默认1 seconds):检测配置发生变化的时间间隔。如果没给出时间单位,默认时间单位是毫秒
-->
<configuration debug="true" scan="true" scanPeriod="1 minutes">
<!-- 日志存放路径 -->
<property name="log.path" value="./logs" />
<!-- 控制台输出 -->
<!-- 日志输出格式 -->
<property name="console.pattern" value="%dHH:mm:ss.SSS [%thread] %-5level %logger20 - [%method,%line] - %msg%n" /> <!--定义参数,后面可以通过$console.pattern使用-->
<!--ConsoleAppender 用于在屏幕上输出日志-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder 默认配置为PatternLayoutEncoder -->
<!--定义控制台输出格式-->
<encoder>
<pattern>$console.pattern</pattern>
</encoder>
</appender>
<!-- 系统日志输出 -->
<!-- 日志输出格式 -->
<property name="log.pattern" value="%dHH:mm:ss.SSS [%thread] %-5level %logger20 - [%method,%line] - %msg%n" />
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>$log.path/sys-info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>$log.path/sys-info.%dyyyy-MM-dd.log</fileNamePattern>
<!-- 日志最大的历史 30天 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>$log.pattern</pattern>
</encoder>
<!-- 定义了一个过滤器,在level之下的日志输出不会被打印出来 -->
<!-- 这里定义了INFO,也就是控制台不会输出比INFO级别小的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>$log.path/sys-error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>$log.path/sys-error.%dyyyy-MM-dd.log</fileNamePattern>
<!-- 日志最大的历史 40天 -->
<maxHistory>40</maxHistory>
</rollingPolicy>
<encoder>
<pattern>$log.pattern</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 系统模块日志级别控制 -->
<!--对于类路径以 com.xxxx 开头的Logger,输出级别设置为debug,并且只输出到控制台-->
<!--这个logger没有指定appender,它会继承root节点中定义的那些appender-->
<logger name="com.lwclick" level="debug" /> <!-- 需要根据自己的包名进行修改 -->
<!--root是默认的logger 这里设定输出级别是info-->
<root level="info">
<!-- 引用了一个appender,日志会往这个appender里面写 -->
<appender-ref ref="console" />
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info" />
<appender-ref ref="file_error" />
</root>
</configuration>
2.3 代码中使用
public class Main
static final Logger logger = LoggerFactory.getLogger(Main.class);
public static void main(String[] args)
logger.info("", "测试信息");
以上是关于Java# 在项目中使用SLF4J+Logback来记录日志的主要内容,如果未能解决你的问题,请参考以下文章
log4j+slf4j管理日志项目迁移logback+slf4j
IDEA项目搭建九——使用slf4j和logback进行日志记录