相关文章推荐

解决 logback.xml 配置不起作用的问题

Logback 是一个 Java 领域的日志框架。 今天在学习使用 logback 日志框架时,配置 logback-test.xml 一直不起作用。特此记录一下。

使用 logback 输出日志:

直接上代码,App.java 代码如下:

public class App {
    private static final Logger logger = LoggerFactory.getLogger(App.class);
    public static void main( String[] args ){
        System.out.println( "Hello World!" );
        System.out.println("----> logback start");
        logger.trace("--> Hello trace.");
        logger.debug("--> Hello debug.");
        logger.info("--> Hello info.");
        logger.warn("--> Goodbye warn.");
        logger.error("--> Goodbye error.");
        System.out.println("----> logback end");

可以正常输出,控制台输出结果如下:

Hello World!
----> logback start
11:48:41.601 [main] DEBUG com.wang123net.App - --> Hello debug.
11:48:41.604 [main] INFO com.wang123net.App - --> Hello info.
11:48:41.604 [main] WARN com.wang123net.App - --> Goodbye warn.
11:48:41.605 [main] ERROR com.wang123net.App - --> Goodbye error.
----> logback end

可以看到有一个 trace 级别的日志没有打印出来。

因为项目中没有指定配置文件,而默认的配置中 ROOT logger 默认级别是 DEBUG, 所以 TRACE 日志不会打印出来, 没问题。

从 logback 文档中可以看到,配置文件读取顺序如下: logback-test.xml > logback.grooy > logback.xml 。如果这个三个配置文件都没有,则走默认配置。

设置配置文件

现在来设置一个配置文件 logback-test.xml 配置文件, 内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{YY-mm-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="TRACE">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

可以看到,配置文件中 root 的 level 设置成了 TRACE, 预期可以输出 TRACE 级别日志,但是结果不是预期,不生效。

解决办法1: 配置文件放到 classpath 目录

再次查看文档,文档中介绍说配置文件需要放到 classpath 目录下:

// from: https://logback.qos.ch/faq.html#configFileLocation
Where should the configuration files such as logback.groovy, logback-test.xml or logback.xml be located on the classpath?
Configuration files such as logback.groovy, logback-test.xml or logback.xml can be located directly under any folder declared in the class path. 
For example, if the class path reads "c:/java/jdk15/lib/rt.jar;c:/mylibs/" then the logback.xml file should be located directly under "c:/mylibs/", that is as "c:/mylibs/logback.xml". 
Placing it under a sub-folder of c:/mylibs/, say, c:/mylibs/other/, will not work.
For web-applications, configuration files can be placed directly under WEB-INF/classes/.

那么问题来了,这个 classpath 路径在那里呢?

使用类 ch.qos.logback.core.util.StatusPrinter 工具查看一下状态:

//打印 Logback 内部状态
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
StatusPrinter.print(lc);

打印出来的日志如下:

11:48:41.605 [main] INFO com.wang123net.App - Hello, this is a line of log message logged by Logback
11:48:41,542 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
11:48:41,542 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
11:48:41,542 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.xml]
11:48:41,549 |-INFO in ch.qos.logback.classic.BasicConfigurator@5ce65a89 - Setting up default configuration.

获取classpath路径:

// 获取classpath路径
String s = Thread.currentThread().getContextClassLoader().getResource("").getPath();
System.out.println("classpath => " + s );
// 获取classpath路径
String path = App.class.getResource("/").toString();
System.out.println("classpath => " + path);

输出结果:

classpath => /Users/wangtest/IdeaProjects/wang123net/target/classes/
classpath => file:/Users/wangtest/IdeaProjects/wang123nettest/target/classes/

将配置文件移到 target/classes 目录下(src/main/target/classes/logback-test.xml), 输出结果正常。

网上资料:
Maven 项目分一般都会有 src、 resource、 test/src、 test/resource 四个目录;
代码目录: src 和 resource 对应到项目的 target\classes 目录,如果在 src 目录调用 classpath,则 class 的根目录为 target\classes;
测试目录: test/src,test/resource 对应到 target\test-classes 目录,如果在 test/src 目录调用 classpath,则 class 的根目录为 target\test-classes;

解决办法2: 设置 resources 目录为 Resource roots

但是 tartget 目录是编译结果输出目录,把配置文件放在这个目录下总感觉不太合适。
而且网上也有许多文章介绍说,配置文件应该在 resource 目录。
再次查找,看看有没有更好的解决办法。

有的说放置在 src 目录下即可,尝试后还是不起作用。
尝试放置在项目根目录,即和 pom.xml 文件同级,也是不可以。
尝试放置在 src/resources 目录下,也是不可以。

直到看到这篇文章,解决问题,原来是少了一个步骤。

在 Idea 中,点击这个 resources 目录,在弹出框中点击 “Mark Directory As”,然后选中 “Resource roots”, 就将这个目录转换为 Resource roots(资源库根目录)了。

根据 Maven 标准目录结构, main 和 test 目录下都会有 resources 目录:

src/main/java       Application/Library sources (java源代码文件,会自动编译到classes文件夹下)
src/main/resources  Application/Library resources (资源库,会自动编译到classes文件夹下)
src/test/java       Test sources (测试java源代码文件)
src/test/resources  Test resources (测试需要的资源库)

完整的Java代码如下:

package com.wang123net;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.util.StatusPrinter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Properties;
public class App 
    private static final Logger logger = LoggerFactory.getLogger(App.class);
    public static void main( String[] args )
        System.out.println( "Hello World!" );
        // 获取classpath路径
        String s = Thread.currentThread().getContextClassLoader().getResource("").getPath();
        System.out.println("classpath : " + s );
        System.out.println("----> logback start");
        logger.trace("--> Hello trace.");
        logger.debug("--> Hello debug.");
        logger.info("--> Hello info.");
        logger.warn("--> Goodbye warn.");
        logger.error("--> Goodbye error.");
        System.out.println("----> logback end");
        //打印 Logback 内部状态
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        StatusPrinter.print(lc);

配置文件如下:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
            <pattern>%d{YY-mm-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <!--<logger name="com.wang123net.App" level="debug" />-->
    <!--root设置全局的log level-->
    <root level="warn">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

输出日志如下:

Hello World!
classpath : /Users/wangtest/IdeaProjects/wang123nettest/target/classes/
----> logback start
18-28-21 15:28:27.741 [main] WARN  com.wang123net.App - --> Goodbye warn.
18-28-21 15:28:27.744 [main] ERROR com.wang123net.App - --> Goodbye error.
----> logback end
15:28:27,561 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback-test.xml] at [file:/Users/wangtest/IdeaProjects/wang123net/target/classes/logback-test.xml]
15:28:27,646 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
15:28:27,648 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
15:28:27,660 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
15:28:27,670 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
15:28:27,735 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to WARN
15:28:27,735 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
15:28:27,736 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
15:28:27,737 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@ba4d54 - Registering current configuration as safe fallback point

可以看到输出的日志级别和配置文件对应.

值得注意的是, 在打印 logback 内部状态是,有这个提示 “Found resource [logback-test.xml] at [file:/Users/wangtest/IdeaProjects/wang123net/target/classes/logback-test.xml]”。
配置文件还是在 /target/classes/ 目录下, 这是因为 resource(资源库),会自动编译到 classes 目录下。

http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html
https://blog.csdn.net/aaashen/article/details/50233061

解决 logback.xml 配置不起作用的问题Logback 是一个 Java 领域的日志框架。 今天在学习使用 logback 日志框架时,配置 logback-test.xml 一直不起作用。特此记录一下。使用 logback 输出日志:直接上代码,App.java 代码如下: public class App { private static final L...
问题描述:由于项目上线需要更改日志级别,所以我就把logback.xml的的level级别改为INFO,但是更改后死活不生效,依然打印DEBUG级别信息。然后就疯狂修改配置文件的内容,就连常用的重启、清除缓存都试过了但是依然没有起效果。 解决方案:然后就查找原因,既然不是配置文件内部的问题,那就是配置文件根本就没其效果。怎么回事呢?忽然发现配置文件在WEB-INF目录下,是不是文件在WEB-IN
配置logback.xml的时候,注意在引入依赖时中的<scope>标签中的值,若为test,则在Sources中的代码是引不到依赖的 就是这里引不到;而且 引入了logback-classic这个包,在引入slf4j-simple这个包 可能会出现jar包冲突,我是这个类StaticLoggerBinder.class发生了冲突,因为这个类在两个包中都有了。 排错... 在线上环境发现设置的logback.xml的设置不生效,最终梳理解决一系列问题解决问题 <configuration scan="true" scanPeriod="60 seconds" debug="false">       <!--其他配置省略--> </configuration> 排查方案:debug可以设置为true,可以查看logback.xml的一个读取的日志记录,包括里面各种策略逻辑。具 二 解决方法 我们可以将logback配置文件的名称从logback.xml修改为logback-spring.xml,事实上Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置。 参考:springb... <?xml version="1.0" encoding="UTF-8" ?> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <!--<prop...
logback-spring.xml不起作用可能由以下几个方面引起: 第一、文件名错误或路径错误。 当使用logback-spring.xml时,必须将文件名称命名为logback-spring,路径必须是src/main/resources目录下。如果名称或路径不正确,则文件可能无法被正确加载并读取。 第二、classpath中的logback.xml文件优先于logback-spring.xml文件。如果在classpath中存在logback.xml文件,则它将覆盖logback-spring.xml文件。因此,可以将logback.xml文件删除或重命名,以便系统能够正确地使用logback-spring.xml文件。 第三、logback-spring.xml文件中的配置错误。 如果logback-spring.xml文件中存在错误的配置,则整个文件可能被忽略。 您可以通过使用logback日志记录级别来检查此问题,如果日志记录级别设置为debug,则可以看到更多的日志输出,以便确定文件是否正在正确加载。 为了解决上述问题,我们可以检查文件名称、文件路径以及logback-spring.xml文件中的配置是否正确。如果存在问题,则可以根据问题的类型采取适当的措施,以确保文件可以被正确加载。如果一切都是正确的,我们还可以尝试重启应用程序或从新构建项目,以便使更改生效。 最后,我们应该了解logback-spring.xml的基本要素,以充分利用其功能并排除各种错误。
C编译报错: implicit declaration of function xxx is invalid in C99 [-Wimplicit-function-declaration] 40677 CSDN-Ada助手: 嗨~好久未见你更新博文了,我们现在上线了AI创作助手哦~可为你的创作提供智能化帮助,快来试试吧~https://editor.csdn.net/md/?not_checkout=1&utm_source=blog_comment_recall,在编辑器页面右侧哦~~限免!! 同时我们为您准备了一份回归奖励,快来看看吧https://activity.csdn.net/creatActivity?id=10430&utm_source=blog_comment_recall 日志logback配置: 解决 logback.xml 配置不起作用的问题 第三方包的 logback的jar去掉 <dependency> <groupId>id.walt</groupId> <artifactId>waltid-siwe</artifactId> <version>0.1.0</version> <scope>system</scope> <systemPath>${pom.basedir}/libs/waltid-siwe-0.1.0.jar</systemPath> <exclusions> <!-- 解决日志覆盖的问题 --> <exclusion> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </exclusion> <exclusion> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> </exclusion> </exclusions> </dependency> Go语言-使用Bcrypt实现加密或验证密码 红烧肉诱点甜: 启动Redis警告:WARNING overcommit_memory is set to 0 Background save may fail under low memory condition 蓝脖鸡泥~你干嘛: 没有这个文件sysctl.conf ,sysctl这个命令也用不了,怎么搞
 
推荐文章