第一步:加入jar包。要加入slf4j和logback的jar包,slf4j需要的jar包为slf4j-api,logback需要2个jar包(logback-classic、logback-core),如果需要保存数据库还需druid、mysql-connector-java(以mysql为例)。
slf4j下载地址:https://www.slf4j.org/download.html
logback下载地址:https://logback.qos.ch/download.html
下载后解压,选择所需要的4个jar包即可。
如果是maven项目只需依赖:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
第二步:在项目src中加入配置文件:logback.xml(没有该文件则使用默认)(maven项目放在resources里)
我的项目结构:
第三步:使用。
如果需要用到数据库保存日志,需要建立三个表:
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 ); 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) ); 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) );
logback.xml配置:
<?xml version="1.0" encoding="UTF-8"?> <!-- scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 --> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <!-- appender指定日志的输出类型,可以是控制台、文件或数据库等 --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <Encoding>UTF-8</Encoding> <encoder> <!-- pattern指定日志的输出格式 --> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %C - %m%n</pattern> </encoder> </appender> <!-- 指定日志输出类型,这里指定为输出到文件--> <appender name="file" class="ch.qos.logback.core.FileAppender"> <!-- <file>: 指定日志的路径以及文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值 --> <file>demo/logs/test.log</file> <!-- <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true--> <append>true</append> <!-- <encoder>: 指定日志的输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %C - %m%n</pattern> </encoder> </appender> <!-- 配置日志输出类型为滚动日志, --> <!-- 下面的配置为每天生成一个日志文件,保存30天的日志文件--> <appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 配置滚动策略,当发生滚动时,决定RollingFileAppender的行为,TimeBasedRollingPolicy 是比较常用的一种滚动策略,它根据时间来制定滚动策略--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 指定滚动生成文件的文件名,并加上日期,例如:test_2018-11-13.log --> <fileNamePattern>demo/logs/test_%d{yyyy-MM-dd}.log</fileNamePattern> <!-- 决定保留的归档文件的最大数量,这里只保留30天的日志文件 --> <maxHistory>30</maxHistory> </rollingPolicy> <!-- 指定日志的输出格式 --> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %C - %m%n</pattern> </encoder> </appender> <!-- 配置日志输出类型为保存到数据库, 需要在数据库中先建立logging_event、logging_event_property、logging_event_exception三张表 --> <appender name="mysql" 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/logback?useUnicode=true&useSSL=true&characterEncoding=utf8</url> <username>root</username> <password>root</password> </dataSource> </connectionSource> </appender> <!-- 输出到控制台 --> <appender name="filterConsole" class="ch.qos.logback.core.ConsoleAppender"> <!-- 配置级别过滤器,LevelFilter过滤器会根据onMatch和onMismatch属性接受或拒绝事件, 这里表示直接受INFO级别的日志--> <filter class="ch.qos.logback.classic.filter.LevelFilter" > <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <!-- 配置临界值过滤器,ThresholdFilter过滤掉低于指定临界值的事件, 这里表示只接受INFO及更高级别的日志--> <!--<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter>--> <!-- 指定输出格式 --> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %C - %m%n</pattern> </encoder> </appender> <!-- logger其实表示是是root根的子级, 主要用于设置某一个包或具体的某一个类的日志打印级别 --> <!-- 这里这是一个logger将controller包下的类在使用日子时将信息输出到控制台 additivity="false" 表示日志信息只在当前logger输出,不会延续到父级root继续输出, 默认值为true,表示在当前logger输出完成之后,继续执行root根logger的输出--> <logger name="edu.nf.demo.Main" level="debug" additivity="true"> <appender-ref ref="console"/> </logger> <!-- 这里这是一个logger将controller包下的类在使用日子时将信息输出到文件 --> <logger name="edu.nf.demo.Main" level="info" additivity="true"> <appender-ref ref="file"/> </logger> <!-- 配置logger的根,并通过level制定输出级别 输出级别从小到大的顺序为:TRACE < DEBUG < INFO < WARN < ERROR, 例如,如果使用了info级别,则应用程序中所有低于info级别的日志信息(如debug)将不会被打印出来--> <root level="DEBUG"> <!--引用输出类型输出类型--> <!--<appender-ref ref="console"/>--> <!--<appender-ref ref="file"/>--> <!--<appender-ref ref="rollFile"/>--> <appender-ref ref="mysql"/> <!--<appender-ref ref="filterConsole"/>--> </root> </configuration>
Main:
package edu.nf.demo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author hh * @Date 2018/11/16 */ public class Main { private static final Logger logger = LoggerFactory.getLogger(Main.class); public static void main(String[] args) { logger.trace("trace..."); logger.debug("debug..."); logger.info("info..."); logger.warn("warn..."); logger.error("error..."); } }
运行结果:
控制台:
文件:
数据库:
-
依赖logback的扩展包
<!-- https://mvnrepository.com/artifact/org.logback-extensions/logback-ext-spring -->
<dependency>
<groupId>org.logback-extensions</groupId>
<artifactId>logback-ext-spring</artifactId>
<version>0.1.4</version>
</dependency>
-
<listener>
<listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class>
</listener>
<context-param>
<param-name>logbackConfigLocation</param-name>
<param-value>classpath:logback.xml</param-value>
</context-param>