slf4j常用配置文件读取

本文介绍了SLF4J接口配合Log4j2和Logback实现的日志配置过程。针对Log4j2,文章详细阐述了如何通过环境变量、类路径资源等方式读取配置文件;对于Logback,则解释了其通过环境变量和类路径查找配置的具体步骤。

slf4j常用配置文件读取

log4j2读取配置文件

日志现在一般都是使用slf4j作为接口、底层实现一般是用log4j2或者logback

我们先看下log4j2是如何读取配置文件的。

   implementation 'org.apache.logging.log4j:log4j-slf4j-impl:2.19.0'

如果使用gradle的话。上面的代码就会导入slf4jlog4j2的相关依赖。

主要是在创建完org.apache.logging.log4j.core.LoggerContext后,会调用它的start–>reconfigure,在这里面读取配置文件,转化成Configuration对象。

调用的堆栈如下图:

在这里插入图片描述

具体会ConfigurationFactory.getConfiguration读取配置文件

1、读取环境变量log4j.configurationFile指定的路径。

2、读取环境变量log4j.configuration指定的路径。

3、继续在下面的代码中查找配置文件

在这里插入图片描述

通过PropertiesConfigurationFactoryYamIConfigurationFactoryJsonConfigurationFactoryXmlConfigurationFactory

       private Configuration getConfiguration(final LoggerContext loggerContext, final boolean isTest, final String name) {
            final boolean named = Strings.isNotEmpty(name);
            final ClassLoader loader = LoaderUtil.getThreadContextClassLoader();
         	  //这里的getFactories()会获取配置文件处理工厂。
            //分别是PropertiesConfigurationFactory、amIConfigurationFactory、sonConfigurationFactory、XmlConfigurationFactory
            for (final ConfigurationFactory factory : getFactories()) {
                String configName;
              	//处理前缀
                final String prefix = isTest ? factory.getTestPrefix() : factory.getDefaultPrefix();
                //处理后缀
                final String [] types = factory.getSupportedTypes();
                if (types == null) {
                    continue;
                }

                for (final String suffix : types) {
                    if (suffix.equals(ALL_TYPES)) {
                        continue;
                    }
                    //拼接配置文件路径
                    configName = named ? prefix + name + suffix : prefix + suffix;

                    final ConfigurationSource source = ConfigurationSource.fromResource(configName, loader);
                 
                }
            }
            return null;
        }

在上面就会依次去拼接配置文件路径,在类路径上去查找配置文件。

这里的最后一个入参name是对应类加载器的hashcode转成16进制的字符串表示。假设这个name的值是5c29bfd。那就依次会在类路径查找如下配置文件log4j2-test5c29bfd.properties、log4j2-test5c29bfd.yml、log4j2-test5c29bfd.yaml、log4j2-test5c29bfd.json、log4j2-test5c29bfd.jsn、log4j2-test5c29bfd.xml、log4j2-test.properties、log4j2-test.yml、log4j2-test.yaml、log4j2-test.json、log4j2-test.jsn、log4j2-test.xml、log4j25c29bfd.properties、log4j25c29bfd.yml、log4j25c29bfd.yaml、log4j25c29bfd.json、log4j25c29bfd.jsn、log4j25c29bfd.xml、log4j2.properties、log4j2.yml、log4j2.yaml、log4j2.json、log4j2.jsn、log4j2.xml

如果在环境变量中设置了log4j2.debug=true,那么在控制台中也能看到查找配置文件的详细日志。

如在代码开始位置设置了System.setProperty("log4j2.debug","true");。就可以看到如下日志。

在这里插入图片描述

logback读取配置文件

implementation 'ch.qos.logback:logback-classic:1.2.11'

如果使用gradle的话。上面的代码就会导入slf4jlogback的相关依赖。

主要位置是在ch.qos.logback.classic.util.ContextInitializer.autoConfig()方法加载配置文件的。

调用堆栈如下图:

在这里插入图片描述

1、从环境变量logback.configurationFile指定的位置加载。

2、依次在类路径上查找logback-test.xmllogback.xml

3、用SPI的方式使用ServiceLoader.loadch.qos.logback.classic.spi.Configurator的实现。

4、如果上面几种方式都没找到就会创建ch.qos.logback.classic.BasicConfigurator作为默认配置文件的实现。

<think>好的,用户现在的问题是关于SLF4J日志的存储位置和配置方法。首先,我需要回顾之前的对话,确保理解上下文。用户之前询问了Java IO类库的相关问题,现在转向日志框架,特别是SLF4J。 根据用户提供的引用内容,引用了四个关于SLF4J和Logback、Log4j以及Spring Boot集成的内容。用户可能是在开发Java应用,特别是使用Spring Boot,所以需要配置日志存储位置。用户的问题集中在如何配置SLF4J的日志存储路径,以及具体的配置方法。 首先,我需要明确SLF4J本身只是一个日志门面,具体的实现比如Logback或Log4j2才是负责日志输出的。因此,配置存储位置取决于使用的具体实现库。用户引用的内容提到了Logback和Log4j,所以应该分别说明这两种的配置方式。 接下来,需要分步骤回答。首先解释SLF4J与具体实现的关系,然后针对Logback和Log4j2分别给出配置文件示例,比如logback.xml和log4j2.xml。同时,用户可能在使用Spring Boot,所以需要提到Spring Boot的默认配置以及如何自定义。 另外,用户可能对配置中的某些参数不熟悉,比如RollingFileAppender的配置,需要详细说明每个参数的作用,比如fileName和filePattern的区别,归档策略,触发策略等。同时,要提到日志级别的配置,虽然用户主要问的是存储位置,但相关配置可以简要说明。 还需要注意用户可能遇到的常见问题,比如配置文件的位置是否正确,依赖是否添加,以及如何验证配置是否生效。这些可以作为注意事项部分,帮助用户排查问题。 最后,生成相关问题时要考虑用户可能的后续需求,比如日志级别调整、归档策略、性能优化等,这些都能帮助用户进一步了解日志配置的更多方面。 总结回答结构:先介绍SLF4J与实现的关系,然后分别以Logback和Log4j2为例给出配置方法,接着提到Spring Boot的配置方式,最后注意事项和相关问题。确保回答清晰、步骤明确,覆盖用户的需求。</think>以下是关于SLF4J日志存储位置与配置方法的详细说明: --- ### 一、SLF4J日志存储位置配置 SLF4J是一个日志门面,具体存储位置由底层日志实现(如Logback、Log4j2等)决定。以下是两种常用实现的配置方法: --- #### 1. **Logback配置(常用)** 通过`logback.xml`或`logback-spring.xml`(Spring Boot推荐)定义存储路径。 ##### 示例配置: ```xml <configuration> <!-- 定义日志输出目录 --> <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.rolling.RollingFileAppender"> <file>${LOG_DIR}/application.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_DIR}/application.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <maxHistory>30</maxHistory> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 设置日志级别 --> <root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="FILE" /> </root> </configuration> ``` **关键配置项**: - `<file>`:当前日志文件路径(例如`./logs/application.log`)。 - `<fileNamePattern>`:归档日志文件的命名规则(支持日期和索引)。 - `<maxHistory>`:保留最近30天的日志。 - `<maxFileSize>`:单个日志文件最大100MB,超过后自动分割[^2]。 --- #### 2. **Log4j2配置** 若使用Log4j2作为实现,通过`log4j2.xml`配置存储路径: ##### 示例配置: ```xml <Configuration> <Properties> <Property name="LOG_DIR">./logs</Property> </Properties> <Appenders> <!-- 控制台输出 --> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/> </Console> <!-- 文件输出(按大小滚动) --> <RollingFile name="File" fileName="${LOG_DIR}/app.log" filePattern="${LOG_DIR}/app-%d{yyyy-MM-dd}-%i.log"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <SizeBasedTriggeringPolicy size="100MB"/> </Policies> <DefaultRolloverStrategy max="30"/> </RollingFile> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> <AppenderRef ref="File"/> </Root> </Loggers> </Configuration> ``` --- ### 二、Spring Boot中的配置 Spring Boot默认使用Logback,可通过`application.properties`快速配置: ```properties # 指定日志目录 logging.file.path=./logs # 指定日志文件名(默认生成spring.log) logging.file.name=${logging.file.path}/myapp.log # 设置日志级别 logging.level.root=INFO logging.level.com.example=DEBUG ``` --- ### 三、注意事项 1. **路径权限**:确保应用对日志目录有读写权限。 2. **依赖检查**:确认项目中包含具体日志实现的依赖(如`logback-classic`或`log4j-core`)。 3. **配置文件位置**:配置文件需放在`src/main/resources`目录下。 4. **动态路径**:可通过环境变量动态设置路径(例如`${LOG_DIR:-./logs}`表示默认值)。 --- ### 四、验证配置生效 1. **检查日志文件**:启动应用后,检查配置的路径下是否生成日志文件。 2. **输出测试日志**: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TestLog { private static final Logger logger = LoggerFactory.getLogger(TestLog.class); public static void main(String[] args) { logger.info("测试日志存储路径"); } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值