日志收集之 logback使用

一 简介

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项目结构如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值