一 简介
1.1 Logback 是一个用于 Java 应用程序的强大日志框架,广泛应用于企业级应用中。它是由 SLF4J 的创始人开发的,旨在成为 Log4j 的替代品。Logback 提供更高级、更灵活的功能,同时还支持与 SLF4J 的无缝集成。
2.2 Logback分为下面几个个模块:
- logback-core:其它两个模块的基础模块
- logback-classic:它是log4j的一个改良版本,兼容slf4j API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging
- logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能
2.3 主要特性
- 高性能:Logback 设计上比 Log4j 更高效,尤其适合处理大量日志的应用。
- 易于配置:支持 XML 和 Groovy 配置文件,便于用户自定义设置。
- 条件化日志:可以根据条件动态改变日志级别。
- 支持多种输出方式:支持控制台、文件、数据库等多种日志输出方式。
- Appender 和 Logger 的层次结构:可以灵活控制日志记录的层次和输出格式。
二 在SpringBoot项目中使用Logback
2.1 在SpringBoot项目中使用logback比较简单,因为它会默认生成src/main/resources文件夹,把logback.xml配置文件放在resources目录就可以生效
2.2 使用logback需要先导入包,以 Maven为例,可以在 pom.xml
中添加以下依赖:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.3.0</version> <!-- 请检查最新版本 -->
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version> <!-- 请检查最新版本 -->
</dependency>
2.3 配置 Logback,创建一个名为 logback.xml
的配置文件,在 src/main/resources
目录下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 定义日志文件的存储位置 -->
<property name="LOG_PATH" value="logs" />
<!-- 定义日志文件名称 -->
<property name="LOG_FILE_NAME" value="app" />
<!-- 配置 ConsoleAppender,将日志输出到控制台 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 配置 FileAppender,将日志输出到文件 -->
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${LOG_PATH}/${LOG_FILE_NAME}.log</file>
<append>true</append>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 配置 RollingFileAppender,实现日志文件的滚动存储 -->
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 指定日志文件的存储位置和名称 -->
<file>${LOG_PATH}/${LOG_FILE_NAME}.log</file>
<!-- 设置日志文件的滚动策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天生成一个新的日志文件 -->
<fileNamePattern>${LOG_PATH}/${LOG_FILE_NAME}.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 设置日志文件的历史保留天数 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 配置记录器 -->
<root level="debug">
<appender-ref ref="STDOUT" />
<appender-ref ref="ROLLING_FILE" />
</root>
</configuration>
2.4 在 Java 代码中使用 slf4j 的 API 来记录日志
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger logger = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
logger.info("This is an info message.");
logger.debug("This is a debug message.");
logger.error("This is an error message.");
}
}
2.6 项目结构如下,会在log文件夹生成日志文件记录
三 在普通java项目中使用Logback
3.1 由于普通java项目不会自动构建resources
文件夹,所以就会找不到logback.xml配置文件,就算自己新建resources
也没用,所以就要通过代码指定logback.xml路径
3.2 其它流程,导入包和上面一样,不同的地方就在于需要指定logback.xml路径。如下修改
public class TestA {
public static void main(String[] args) {
//项目跟目录
//String projectRoot = Paths.get("").toAbsolutePath().toString();
//System.out.println("项目根目录: " + projectRoot);
//System.setProperty("logback.configurationFile", projectRoot+"/src/main/resources/logback.xml");
String projectSrcMainResourcesRoot = Paths.get("src/main/resources").toAbsolutePath().toString();
System.out.println("Resources目录: " + projectSrcMainResourcesRoot);
System.setProperty("logback.configurationFile", projectSrcMainResourcesRoot+"/logback.xml");
//String classpath = GetClasspath.class.getClassLoader().getResource("").getPath();
//System.out.println("Classpath 目录: " + new File(classpath).getAbsolutePath());
//System.setProperty("EXTENSION_DIR", "D:/IdeaProjects/FirstWeb/");
// 初始化 Logback
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(loggerContext);
//loggerContext.reset();
Logger logger = loggerContext.getLogger(TestA.class);
logger.info("info");
}
}
注意,需要去掉loggerContext.reset();,不然不打印日志
3.3 logback.xml用上面的也可以,新配置一个也可以
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 定义 Android 文件路径 -->
<property name="LOG_DIR" value="./logs" />
<!-- 控制台输出(调试用) -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 文件输出 -->
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${LOG_DIR}/app.log</file>
<append>true</append>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %msg%n</pattern>
</encoder>
</appender>
<!-- 根日志配置 -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</configuration>
3.4 项目结构如下:
四 在Android项目中使用Logback
4.1 Android是使用Gradle构建的,所以导包方式如下,需要用android版本的logback。在app层级的build.gradle文件里面添加依赖
dependencies {
implementation 'org.slf4j:slf4j-api:2.0.7'
implementation 'com.github.tony19:logback-android:3.0.0'
}
4.2 Android中需要把logback.xml放在src/main/assets里面
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 定义 Android 文件路径 -->
<property name="LOG_DIR" value="${EXTENSION_DIR}/logs" />
<!-- 控制台输出(调试用) -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 文件输出 -->
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${LOG_DIR}/app.log</file>
<append>true</append>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %msg%n</pattern>
</encoder>
</appender>
<!-- 根日志配置 -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</configuration>
4.3 新建MyApp.java,初始化logback
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
// 定义 Android 文件路径
System.setProperty("EXTENSION_DIR", getExternalFilesDir("").getAbsolutePath());
// 初始化 Logback
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(loggerContext);
loggerContext.reset();
try {
configurator.doConfigure(getAssets().open("logback.xml"));
Log.e("AAA", "onCreate: success");
} catch (IOException e) {
e.printStackTrace();
} catch (JoranException e) {
e.printStackTrace();
}
}
}
注意,由于外部目录需要存储权限,所以可以把日志存储文件放在应用私有目录
System.setProperty("EXTENSION_DIR", getExternalFilesDir("").getAbsolutePath());
4.5 再MainActivity.java里面输入日志
ublic class MainActivity extends AppCompatActivity {
private static final Logger logger = LoggerFactory.getLogger(MainActivity.class);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
logger.info("App started");
logger.error("This is an error message");
}
}
4.4 Android项目结构如下