[笔记]Java日志框架学习

本文详细介绍slf4j、logback、log4j、JUL等日志框架的Maven依赖配置,以及log4j.xml、logback.xml的配置示例,包括日志级别、输出位置、格式化样式、日志文件滚动策略等关键信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概览

在这里插入图片描述

代码示例:
  • slf4j-maven示例
        <!-- slf4j门面 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.26</version>
        </dependency>
        
        <!-- 实现1:这里先用simple简单日志框架 -->
        <!--<dependency>-->
        <!--    <groupId>org.slf4j</groupId>-->
        <!--    <artifactId>slf4j-simple</artifactId>-->
        <!--    <version>1.7.21</version>-->
        <!--</dependency>-->

        <!-- 实现2:使用logback(使用2的时候,需要将1注释掉) -->
        <!--<dependency>-->
        <!--    <groupId>ch.qos.logback</groupId>-->
        <!--    <artifactId>logback-classic</artifactId>-->
        <!--    <version>1.2.3</version>-->
        <!--</dependency>-->

        <!-- 实现3:日志开关:注入表示不开启日志,1和2需要注释掉 -->
        <!--<dependency>-->
        <!--    <groupId>org.slf4j</groupId>-->
        <!--    <artifactId>slf4j-nop</artifactId>-->
        <!--    <version>1.7.25</version>-->
        <!--</dependency>-->

        <!-- 实现4:集成log4j, 因为log4j出现较早,需要有适配器适配 -->
        <!-- 注意:log4j需要增加配置文件集成,否则找不到appenders -->
        <!--<dependency>-->
        <!--    <groupId>org.slf4j</groupId>-->
        <!--    <artifactId>slf4j-log4j12</artifactId>-->
        <!--    <version>1.7.30</version>-->
        <!--</dependency>-->
        <!--<dependency>-->
        <!--    <groupId>log4j</groupId>-->
        <!--    <artifactId>log4j</artifactId>-->
        <!--    <version>1.2.16</version>-->
        <!--</dependency>-->

        <!-- 实现5:JDK自带的JUL,需要增加适配器 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-jdk14</artifactId>
            <version>1.5.6</version>
        </dependency>
  • log4j
#  maven:
        <!--  log4j的依赖  -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

#  log4j.xml
# 指定RootLogger顶级父元素默认配置信息
# 指定日志级别为trace、输出位置appender为不同的Appender
log4j.rootLogger = trace,console,file
#log4j.rootLogger = trace,rollingFile
#log4j.rootLogger = trace,dailyFile

# 自定义logger对象输出,表示com.test对象的及其子类的log按照error级别输出
log4j.logger.com.test = error

# ***************************** 控制台配置 *********************************
# 指定控制台输出的appender
log4j.appender.console = org.apache.log4j.ConsoleAppender
# 指定消息格式layout:这里以最常用的PatternLayout为例子
log4j.appender.console.layout = org.apache.log4j.PatternLayout
# 测试输出的格式转换样式
log4j.appender.console.layout.conversionPattern = [%r] [%t] %p %c %x - %m%n

# ***************************** 日志文件配置 *********************************
# 提醒一下:如果需要查看File需要哪些配置的话,可以进入到FileAppender类中查看详细属性
log4j.appender.file = org.apache.log4j.FileAppender
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.conversionPattern = [%r] [%t] %p %c %x - %m%n
log4j.appender.file.file = ./log4j-first.log
log4j.appender.file.encoding = UTF-8

# ***************************** 日志文件压缩配置-RollingFileAppender *********************************
log4j.appender.rollingFile = org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.layout = org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.conversionPattern = [%r] [%t] %p %c %x - %m%n
log4j.appender.rollingFile.file = ./log4j-first-roll.log
log4j.appender.rollingFile.encoding = UTF-8
log4j.appender.rollingFile.maxFileSize = 100KB
log4j.appender.rollingFile.maxBackupIndex = 3

# ***************************** 日志文件压缩配置-DailyRollingFileAppender *********************************
log4j.appender.dailyFile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyFile.layout = org.apache.log4j.PatternLayout
log4j.appender.dailyFile.layout.conversionPattern = [%r] [%t] %p %c %x - %m%n
log4j.appender.dailyFile.file = ./log4j-first-daily.log
log4j.appender.dailyFile.encoding = UTF-8
log4j.appender.dailyFile.datePattern = '.'yyyy-MM-dd-HH-mm-ss

  • JUL
import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;

public class Main {
    public static void main(String[] args) {
        Logger logger = Logger.getLogger("Main.class");
        logger.info("Hello World");
        logger.log(Level.INFO, "Hello World by {0}", "China");

        // 一些配置
        // 关闭默认配置
        logger.setUseParentHandlers(false);
        // 自定义日志输出
        ConsoleHandler consoleHandler = new ConsoleHandler();
        // 创建简单格式转换对象
        SimpleFormatter simpleFormatter = new SimpleFormatter();
        // 关联
        consoleHandler.setFormatter(simpleFormatter);
        // 添加handler(责任链模式)
        logger.addHandler(consoleHandler);
        // 设置级别
        logger.setLevel(Level.ALL);
        consoleHandler.setLevel(Level.ALL);

        logger.info("Hello World New Console");
    }
}
  • logback — logback.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--
scan:为true时,配置文件改变时,自动加载
scanPeriod:修改的时间间隔,实时查看logback的运行状态
debug:为true时打印logback内部的运行信息
 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!--  首先:配置集中属性  -->
<!--  后续使用时,可参照linux方式,直接${xx}方式引用集中属性  -->
    <property name="pattern" value="[%thread] [%-5level] %d{yyyy-MM-dd-HH-mm-ss} %c %M %L %m %n"></property>
    <property name="log_dir" value="./logback"></property>

    <!-- 定义appender - 控制台 -->
    <!-- 备注:这里为什么可以用target字段?是因为ConsoleAppender类里定义了target字段,故这里可以使用 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 测试:将控制台输出全部置为红色error级别 -->
        <target>System.err</target>
        <!-- 日志消息格式定义 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!-- 定义appender - 日志文件 -->
    <appender name="file" class="ch.qos.logback.core.FileAppender">
        <!-- 日志文件的保存路径 -->
        <file>${log_dir}/first.log</file>
        <!-- 日志消息格式定义 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!-- 定义appender - HTML日志文件 -->
    <appender name="htmlfile" class="ch.qos.logback.core.FileAppender">
        <!-- 日志文件的保存路径 -->
        <file>${log_dir}/first.html</file>
        <!-- 日志消息格式定义 -->
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="ch.qos.logback.classic.html.HTMLLayout">
                <pattern>${pattern}</pattern>
            </layout>
        </encoder>
    </appender>

    <!-- 定义appender - 日志拆分和压缩 -->
    <appender name="rollfile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 日志文件的保存路径 -->
        <file>${log_dir}/rolling.log</file>
        <!-- 日志消息格式定义 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
        <!-- 指定拆分属性 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 按照时间、压缩格式拆分 -->
            <!-- 注意:这里的%i一定不能少,否则无法拆分压缩 -->
            <fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd}.log.%i.gz</fileNamePattern>
            <!-- 按照文件大小拆分 -->
            <maxFileSize>10KB</maxFileSize>
        </rollingPolicy>
        <!-- 自定义过滤器,示例:级别过滤器 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 定义appender - 异步appender,提升性能,异步写入日志 -->
    <appender name="asyncfile" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="rollfile"/>
    </appender>

    <!-- 日志记录器有父子关系,这里设置root的记录器引用 -->
    <!-- ALL:表示打开所有日志级别 -->
    <root level="INFO">
        <!--<appender-ref ref="console"/>-->
        <!--<appender-ref ref="file"/>-->
        <!--<appender-ref ref="asyncfile"/>-->
        <appender-ref ref="rollfile"/>
        <!--<appender-ref ref="htmlfile"/>-->
    </root>

    <!-- 自定义logger实现 -->
    <!--<logger name="Main" level="warn" additivity="false">-->
    <!--    <appender-ref ref="console"/>-->
    <!--</logger>-->

</configuration>
  • log4j2
        <!-- slf4j门面 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.26</version>
        </dependency>
        <!-- 增加适配器进行绑定 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.9.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.11.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.11.1</version>
        </dependency>
        <!-- 这个是并发编程的主要依赖,这里用来做异步日志线程 -->
        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.3.4</version>
        </dependency>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值