Spring项目集成Logback
一、logback介绍
官网介绍:【官网:https://logback.qos.ch/index.html介绍翻译过来】Logback旨在作为流行的log4j项目的后续版本,在log4j离开的地方启动。
Logback的架构足够通用,以便在不同情况下应用。目前,logback分为三个模块:logback-core,logback-classic和logback-access。
logback-core模块为其他两个模块奠定了基础。logback-classic模块可以被同化为log4j的显着改进版本。此外,logback-classic本身实现了SLF4J API,因此您可以在logback和其他日志框架(如log4j或java.util.logging(JUL))之间来回切换。
logback-access模块与Servlet容器(如Tomcat和Jetty)集成,以提供HTTP访问日志功能。请注意,您可以在logback-core之上轻松构建自己的模块。
看完有点懵那我们自己总结:
- Logback是由log4j创始人设计的一个开源日志组件。LogBack被分为3个组件,logback-core, logback-classic 和 logback-access。
- logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。
- 此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。
- 总结:logback比log4j更推荐使用
二、项目集成
1.maven项目 pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>hoperun.pagoda.commandlog</groupId>
<artifactId>commandlog</artifactId>
<version>0.0.2-SNAPSHOT</version>
<name>commandlog</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<logback.version>1.2.3</logback.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- log start -->
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.26</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<!-- log end -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerVersion>1.8</compilerVersion>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
核心jar依赖如图:
2.logback配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--e定义日志文件的存储地址 -->
<property name="LOG_HOME" value="../logs/diiop"/>
<!-- e控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--e格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>-->
<pattern>%msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--e 按照每天和固定大小(5MB)生成日志文件【最新的日志,是没有日期没有数字的】 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/diiop.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/diiop_%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!--e日志文件保留天数-->
<MaxHistory>30</MaxHistory>
<!--e日志文件最大的大小-->
<MaxFileSize>5MB</MaxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--e格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- <filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>TRACE</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>-->
</appender>
<!--e日志异步到数据库 -->
<!--<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">-->
<!--<!–日志异步到数据库 –>-->
<!--<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">-->
<!--<!–连接池 –>-->
<!--<dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">-->
<!--<driverClass>com.mysql.jdbc.Driver</driverClass>-->
<!--<url>jdbc:mysql://127.0.0.1:3306/databaseName</url>-->
<!--<user>root</user>-->
<!--<password>root</password>-->
<!--</dataSource>-->
<!--</connectionSource>-->
<!--</appender>-->
<!-- show parameters for hibernate sql 专为 Hibernate 定制 -->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="WARN" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="WARN" />
<logger name="org.hibernate.SQL" level="WARN" />
<logger name="org.hibernate.engine.QueryParameters" level="WARN" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="WARN" />
<!--myibatis log configure-->
<logger name="com.apache.ibatis" level="WARN"/>
<logger name="java.sql.Connection" level="WARN"/>
<logger name="java.sql.Statement" level="WARN"/>
<logger name="java.sql.PreparedStatement" level="WARN"/>
<!--newcapec-->
<logger name="com.newcapec" level="INFO"/>
<!-- e 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
Logback.xml 配置简单介绍:
详细介绍推荐博客文章:https://blog.csdn.net/zzzgd_666/article/details/80458444
- 日志存储地址:
Logback存储相对位置存储日志:../xxx 则日志存储在项目的同级目录
Logback存储绝对位置存储日志:c:/xxx 或 /xxx(默认在c:下建xxx目录)
- 输出位置、格式、存储方式 都标注很清楚
- 日志级别
3.封装utils
package hoperun.pagoda.commandlog;
import java.io.File;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.joran.JoranConfigurator;
import ch.qos.logback.core.joran.spi.JoranException;
import ch.qos.logback.core.util.StatusPrinter;
/**
* logback工具类.
* @author Administrator
*/
public class LogUtils {
/**
* logger属性.
*/
private static final Logger LOGGER
= LoggerFactory.getLogger(LogUtils.class);
/**
* info信息.
* @param message 信息
*/
public void logInfo(final String message) {
final StringBuilder builder = new StringBuilder();
builder.append(message);
LOGGER.info(builder.toString());
}
/**
* info 异常信息.
* @param message 信息
* @param exception 异常信息
*/
public void logInfo(final String message, final Throwable exception) {
final StringBuilder builder = new StringBuilder();
builder.append(message);
LOGGER.info(builder.toString(), exception);
}
/**
* Warn 信息.
* @param message 信息
*/
public void logWarn(final String message) {
final StringBuilder builder = new StringBuilder();
builder.append(message);
LOGGER.warn(builder.toString());
}
/**
* Warn 异常信息.
* @param message 信息
* @param exception 异常信息
*/
public void logWarn(final String message, final Throwable exception) {
final StringBuilder builder = new StringBuilder();
builder.append(message);
LOGGER.warn(builder.toString(), exception);
}
/**
* Debug 信息.
* @param message 信息
*/
public void logDebug(final String message) {
final StringBuilder builder = new StringBuilder();
builder.append(message);
LOGGER.debug(builder.toString());
}
/**
* Debug 异常信息.
* @param message 信息
* @param exception 异常信息
*/
public void logDebug(final String message, final Throwable exception) {
final StringBuilder builder = new StringBuilder();
builder.append(message);
LOGGER.debug(builder.toString(), exception);
}
/**
* Error 信息.
* @param message 信息
*/
public void logError(final String message) {
final StringBuilder builder = new StringBuilder();
builder.append(message);
LOGGER.error(builder.toString());
}
/**
* Error 异常信息.
* @param message 信息
* @param exception 异常信息
*/
public void logError(final String message, final Throwable exception) {
final StringBuilder builder = new StringBuilder();
builder.append(message);
LOGGER.error(builder.toString(), exception);
}
}
4.配置文件在项目外的写法
Logback外部配置文件使用
例如配置文件在项目的同目录
下面是代码
package hoperun.pagoda.commandlog;
import java.io.File;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.joran.JoranConfigurator;
import ch.qos.logback.core.joran.spi.JoranException;
import ch.qos.logback.core.util.StatusPrinter;
/**
* logback工具类.
* @author Administrator
*/
public class LogUtils {
/**
* logger属性.
*/
private static final Logger LOGGER
= LoggerFactory.getLogger(LogUtils.class);
/**
* logback构造函数.
*/
public LogUtils() {
try {
load("../conf/logback.xml");
} catch (IOException | JoranException e) {
logError("Get logback.xml path Error", e);
}
}
/**
* 加载外部的logback配置文件.
* @param configFilePath 配置文件路径.
* @throws IOException IOException
* @throws JoranException JoranException
*/
public void load(final String configFilePath)
throws IOException, JoranException {
final LoggerContext loggerContext =
(LoggerContext) LoggerFactory.getILoggerFactory();
final File configFile = new File(configFilePath);
final boolean exists = !configFile.exists();
final boolean isFile = !configFile.isFile();
final boolean canRead = !configFile.canRead();
if (exists) {
throw new IOException("Logback External Config File "
+ "Parameter does not reference a file that exists");
} else if (isFile) {
throw new IOException("Logback External Config File "
+ "Parameter exists, but does not reference a file");
} else if (canRead) {
throw new IOException("Logback External Config File "
+ "exists and is a file, but cannot be read.");
} else {
final JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(loggerContext);
loggerContext.reset();
configurator.doConfigure(configFilePath);
StatusPrinter.printInCaseOfErrorsOrWarnings(loggerContext);
}
}
/**
* info信息.
* @param message 信息
*/
public void logInfo(final String message) {
final StringBuilder builder = new StringBuilder();
builder.append(message);
LOGGER.info(builder.toString());
}
/**
* info 异常信息.
* @param message 信息
* @param exception 异常信息
*/
public void logInfo(final String message, final Throwable exception) {
final StringBuilder builder = new StringBuilder();
builder.append(message);
LOGGER.info(builder.toString(), exception);
}
/**
* Warn 信息.
* @param message 信息
*/
public void logWarn(final String message) {
final StringBuilder builder = new StringBuilder();
builder.append(message);
LOGGER.warn(builder.toString());
}
/**
* Warn 异常信息.
* @param message 信息
* @param exception 异常信息
*/
public void logWarn(final String message, final Throwable exception) {
final StringBuilder builder = new StringBuilder();
builder.append(message);
LOGGER.warn(builder.toString(), exception);
}
/**
* Debug 信息.
* @param message 信息
*/
public void logDebug(final String message) {
final StringBuilder builder = new StringBuilder();
builder.append(message);
LOGGER.debug(builder.toString());
}
/**
* Debug 异常信息.
* @param message 信息
* @param exception 异常信息
*/
public void logDebug(final String message, final Throwable exception) {
final StringBuilder builder = new StringBuilder();
builder.append(message);
LOGGER.debug(builder.toString(), exception);
}
/**
* Error 信息.
* @param message 信息
*/
public void logError(final String message) {
final StringBuilder builder = new StringBuilder();
builder.append(message);
LOGGER.error(builder.toString());
}
/**
* Error 异常信息.
* @param message 信息
* @param exception 异常信息
*/
public void logError(final String message, final Throwable exception) {
final StringBuilder builder = new StringBuilder();
builder.append(message);
LOGGER.error(builder.toString(), exception);
}
}