spring boot 系列学习记录:http://www.cnblogs.com/jinxiaohang/p/8111057.html

码云源码地址:https://gitee.com/jinxiaohang/springboot

  因为spring-boot-starter启动器包含spring-boot-starter-logging启动器并集成了slf4j日志抽象及Logback日志框架,所以不用额外的引入依赖。本次练习在之前整合Spring Data JPA基础上进行。

一、slf4j的使用

  • 方法一

@RunWith(SpringRunner.class)
@SpringBootTest
public class logTest {
// 在Java类中创建 logger 实例
private final Logger logger = LoggerFactory.getLogger(this.getClass());
// 在方法中使用日志输出,如
@Test
public void log() {
logger.debug("日志输出测试 Debug");
logger.trace("日志输出测试 Trace");
logger.info("日志输出测试 Info");
logger.error("日志输出测试 Error");
}
}

  这种方式每次都要写logger实例,会不会很麻烦,有没有更简单的方法,答案是有的,方法二。

  • 方法二

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class logTest2 { @Test
public void log(){
String name="xiaohang";
String password="123";
log.debug("日志输出测试 Debug");
log.trace("日志输出测试 Trace");
log.info("日志输出测试 Info");
log.error("日志输出测试 Error");
log.info("name:"+name+" , password:"+password);//string拼接
log.info("name:{} , password:{}",name,password);//使用占位符
}
}

  使用@Slf4j注解,这需要lombok插件的支持,然后直接使用实例好的log。

二、简单日志配置

默认的日志配置满足不了项目需求时,如何使用一些简单配置输出想要的日志。

在application.properties文件中添加如下配置:

#指定日志文件目录、名字(建议使用绝对路径)
logging.file=D:/springboot/main.log
#指定日志文件目录(默认日志名为spring.log)
logging.path=D:/springboot
#指定控制台输出日志的pattern
logging.pattern.console=%-20(%d{yyyy-MM-dd HH:mm:ss.SSS} [Thread]) %-5level %logger{80} - %msg%n
#指定日志文件输出日志的pattern
logging.file.console=%-20(%d{yyyy-MM-dd HH:mm:ss.SSS} [Thread]) %-5level %logger{80} - %msg%n
#指定整个项目(包含jdk源代码打印的日志)的日志级别
logging.level.root=degug
#指定某个类的日志级别
logging.level.com.springboot.CodeController=debug

三、自定义配置文件(logback配置)

  当基本配置也满足不了项目需求时,如:需要每日生成一个日志、info级别的和error级别的日志分开生成文件、持久化到数据库中....这就需要自定义的配置文件了,通常配置文件的命名方式:

  下面主要实现logback配置,新建logback-spring.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="D:/log" /> <!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</layout>
</appender> <!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/myApp.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</layout>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!--show parameters for hibernate sql 专为 Hibernate 定制-->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" /> <!-- 将日志写入数据库 无连接池-->
<appender name="DB-CLASSIC-MYSQL" class="ch.qos.logback.classic.db.DBAppender">
<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
<driverClass>com.mysql.jdbc.Driver</driverClass>
<url>jdbc:mysql://localhost:3306/test</url>
<user>root</user>
<password>root</password>
</connectionSource>
</appender> <!-- 将日志写入数据库 c3p0连接池-->
<appender name="DB-CLASSIC-MYSQL-POOL-C3P0" 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.jdbc.Driver</driverClass>
<jdbcUrl>jdbc:mysql://localhost:3306/test</jdbcUrl>
<user>root</user>
<password>root</password>
</dataSource>
</connectionSource>
</appender> <!-- 将日志写入数据库 DBCP2连接池-->
<appender name="DB-CLASSIC-MYSQL-POOL-DBCP" class="ch.qos.logback.classic.db.DBAppender">
<connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
<dataSource class="org.apache.commons.dbcp2.BasicDataSource">
<driverClassName>com.mysql.jdbc.Driver</driverClassName>
<url>jdbc:mysql://localhost:3306/test</url>
<username>root</username>
<password>root</password>
</dataSource>
</connectionSource>
</appender> <!-- 将日志写入数据库 DRUID连接池-->
<appender name="DB-CLASSIC-MYSQL-POOL-DRUID" class="ch.qos.logback.classic.db.DBAppender">
<connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
<dataSource class="com.alibaba.druid.pool.DruidDataSource">
<driverClassName>com.mysql.jdbc.Driver</driverClassName>
<url>jdbc:mysql://localhost:3306/test</url>
<username>root</username>
<password>root</password>
</dataSource>
</connectionSource>
</appender> <!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
<appender-ref ref="DB-CLASSIC-MYSQL-POOL-DRUID"/><!--更换不同的name-->
</root> </configuration>

  如要完整实现日志数据库持久化,还需要添加数据库表:

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;

  以上实现了按一定格式控制台输出日志、每日生成日志文件,和日志数据库持久化。数据库持久化实现了无连接池方式、用c3p0方式、用dbcp2方式和druid方式,任意选择一种方式,其他可以删除,当然使用连接池时需要引入对应依赖:

<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency> <dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
</dependency> <dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.0</version>
</dependency>

  效果展示:

第16章—日志(slf4j&logback)的更多相关文章

  1. 关于日志slf4j+logback&logback.xml配置

    1.maven依赖 <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --> <!-- <dependen ...

  2. lombok+slf4j+logback SLF4J和Logback日志框架详解

    maven 包依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lomb ...

  3. 日志框架之2 slf4j+logback实现日志架构 · 远观钱途

    如何从缤纷复杂的日志系统世界筛选出适合自己的日志框架以及slf4j+logback的组合美妙之处?此文可能有帮助 logback介绍 Logback是由log4j创始人设计的另一个开源日志组件,官方网 ...

  4. Java日志框架 (commons-logging,log4j,slf4j,logback)

    转自:http://blog.csdn.net/kobejayandy/article/details/17335407 如果对于commons-loging.log4j.slf4j.LogBack等 ...

  5. 用slf4j+logback实现多功能日志解决方案 --- 转

    大家都知道,slf4j是原来log4j的作者写的一个新的日志组件,意思是简单日志门面接口,可以跟其他日志组件配合使用,常用的配合是slf4j+logback,无论从功能上还是从性能上都较之log4j有 ...

  6. 使用 SLF4J + LogBack 构建日志系统(转)

    转载自:http://www.cnblogs.com/mailingfeng/p/3499436.html 上次我们讨论了如何选择一个好的开源日志系统方案,其中的结论是:使用 SLF4J + LogB ...

  7. logback:用slf4j+logback实现多功能日志解决方案

    slf4j是原来log4j的作者写的一个新的日志组件,意思是简单日志门面接口,可以跟其他日志组件配合使用,常用的配合是slf4j+logback,无论从功能上还是从性能上都较之log4j有了很大的提升 ...

  8. slf4j+logback搭建超实用的日志管理模块

    文章转自http://www.2cto.com/kf/201702/536097.html slf4j+logback搭建超实用的日志管理模块(对日志有编号管理):日志功能在服务器端再常见不过了,我们 ...

  9. slf4j/logback: logging日志的配置

    slf4j/logback: logging日志的配置 import依赖: import org.slf4j.Logger;import org.slf4j.LoggerFactory;private ...

随机推荐

  1. Atitit.减少http请求数方案

    Atitit.减少http请求数方案 1. 原理与方法1 1.1. -------jsp1 1.2. "index/js.txt";2 1.3. connReduceDync2 1 ...

  2. atitit.破解 拦截 绕过 网站 手机 短信 验证码 之自动获取手机短信方式 attilax 总结

    atitit.破解  拦截 绕过 网站 手机 短信 验证码 之自动获取手机短信方式 attilax 总结 1. 自动获取手机短信方式的原理 1 2. 调用api 1 3. ----核心代码 2 4.  ...

  3. [sj系统] phabricator系统升级

    sj是公司产品bug管理 wiki一体化系统 ,很刁. 安装: http://www.cnblogs.com/chorulex/p/5381558.html 升级: https://phabricat ...

  4. sourceInsight设置

    复制后光标定格在行尾 Options -> Preferences -> Typing -> After pasting,select:at end of pasted text t ...

  5. ecmall程序结构图与数据库表分析

    以下是ecmall的程序结构图,看了这张图,我们可以清楚的知道ecmall的程序结构. ECMALL数据库主要表如下所示: ecm_acategory:存放的是商城的文章分类.ecm_address: ...

  6. docker动态添加磁盘

    docker run --rm -v /usr/local/bin:/target jpetazzo/nsenter #!/bin/bash #This script is dynamic mount ...

  7. IE的layout布局

    我们那知道浏览器有bug,而且Windows上的lE的bug 似乎比太多数浏览器都多.IE/Win的表现与其他浏览器不同的原因之一是,显示引擎使用一个称为布局(layout)的内部概念.因为布均是一个 ...

  8. oracle分区的名称和值要一致

    名称是01,后面的值也必须是02,不能是前面的是1,后面的是02,被这个问题困扰了好久.

  9. 使用Navicat连接阿里云服务器上的MySQL数据库

    1.首先打开Navicat,文件>新建连接> 2,两张连接方法 1>常规中输入数据库的主机名,端口,用户名,密码 这种直接连就可以了 第2种方法: 常规中输入数据库的信息,主机名用l ...

  10. Centos7安装Apache Http服务器无法访问如何解决

    1. 安装Apache组件 [root@mycentos shell]# yum install httpd 2. 安装成功后,检测有无httpd进程 [root@mycentos shell]# p ...