slf4j是外观模式的典型应用。slf4j只是一个日志标准,并不是日志系统的具体实现。slf4j能够提供日志接口,提供获取具体日志对象的方法。
slf4j-simple、logback都是slf4j的具体实现,log4j虽然不直接实现slf4j,但是有专门的一层桥接slf4j-log412来实现slf4j。

一、应用示例

1、引入依赖

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13-beta-3</version>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.30</version>
</dependency>

slf4j-simple、logback应用比较简单,不需要配置,log4j需要进行配置。

<!-- logback依赖 -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>
<!-- slf4j-simple依赖 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>2.0.0-alpha1</version>
</dependency>

2、测试

@Test
public void test(){
    Logger logger = LoggerFactory.getLogger(Object.class);
    logger.info("123");
}

打印出:
[main] INFO java.lang.Object - 123

二、注解@Slf4j

使用注解,不需要每次都生成Logger对象。
1、安装lombok依赖
可以在线安装,File->Settings->Plugins->Marketplace,搜索安装即可。下图是已经安装了。
在这里插入图片描述
也可以去IDEA的插件网下载。下载后将其解压放到IDEA安装文件的plugins目录下,比如:C: \IntelliJ IDEA 2020.1\plugins,重启IDEA。
2、引入lombok依赖

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.20</version>
</dependency>

3、使用log进行日志打印

@Slf4j
public class Slf4jTest {
    @Test
    public void test(){
        log.info("123");
    }
}

打印出:
[main] INFO com.laosun.test.Slf4jTest – 123

三、将日志保存至数据库

1、添加依赖

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.2.3</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.45</version>
</dependency>
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.4</version>
</dependency>

2、创建数据库logback_test,以及三个表logging_event_property, logging_event_exception, logging_event:
建表的SQL语句在图中位置可以找到
在这里插入图片描述

CREATE DATABASE logback_test;
USE logback_test;

BEGIN;
DROP TABLE IF EXISTS logging_event_property;
DROP TABLE IF EXISTS logging_event_exception;
DROP TABLE IF EXISTS logging_event;
COMMIT;

BEGIN;
CREATE TABLE logging_event 
  (
    timestmp         BIGINT NOT NULL,
    formatted_message  TEXT NOT NULL,
    logger_name       VARCHAR(254) NOT NULL,
    level_string      VARCHAR(254) NOT NULL,
    thread_name       VARCHAR(254),
    reference_flag    SMALLINT,
    arg0              VARCHAR(254),
    arg1              VARCHAR(254),
    arg2              VARCHAR(254),
    arg3              VARCHAR(254),
    caller_filename   VARCHAR(254) NOT NULL,
    caller_class      VARCHAR(254) NOT NULL,
    caller_method     VARCHAR(254) NOT NULL,
    caller_line       CHAR(4) NOT NULL,
    event_id          BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY
  );
COMMIT;

BEGIN;
CREATE TABLE logging_event_property
  (
    event_id	      BIGINT NOT NULL,
    mapped_key        VARCHAR(254) NOT NULL,
    mapped_value      TEXT,
    PRIMARY KEY(event_id, mapped_key),
    FOREIGN KEY (event_id) REFERENCES logging_event(event_id)
  );
COMMIT;

BEGIN;
CREATE TABLE logging_event_exception
  (
    event_id         BIGINT NOT NULL,
    i                SMALLINT NOT NULL,
    trace_line       VARCHAR(254) NOT NULL,
    PRIMARY KEY(event_id, i),
    FOREIGN KEY (event_id) REFERENCES logging_event(event_id)
  );
COMMIT;

3、在src/main/resources目录下创建logback.xml和mchange-log.properties。
logback.xml

<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true">
    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
            </pattern>
        </encoder>
    </appender>
    <!-- 写入到数据库 -->
    <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
            <dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">
                <driverClass>com.mysql.cj.jdbc.Driver</driverClass>
                <jdbcUrl>jdbc:mysql://127.0.0.1:3306/logback_test</jdbcUrl>
                <user>root</user> <!-- 数据库用户名 -->
                <password>123</password> <!-- 密码 -->
            </dataSource>
        </connectionSource>
    </appender>
    <!-- 控制日志输出级别 -->
    <root level="debug">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="DB" />
    </root>
</configuration>

mchange-log.properties

com.mchange.v2.log.MLog=com.mchange.v2.log.FallbackMLog
com.mchange.v2.log.FallbackMLog.DEFAULT_CUTOFF_LEVEL=OFF

4、测试

@Slf4j
public class Slf4jTest {
    @Test
    public void test(){
        log.info("123");
        log.debug("456");
    }
}

在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐