博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
logback: 解决 logback.xml 配置不起作用的问题
阅读量:6247 次
发布时间:2019-06-22

本文共 7388 字,大约阅读时间需要 24 分钟。

hot3.png

解决 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 start11: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 配置文件, 内容如下:

%d{YY-mm-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n

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

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

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

// from: https://logback.qos.ch/faq.html#configFileLocationWhere 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 Logback11: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);    }}

配置文件如下:

%d{YY-mm-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n

输出日志如下:

Hello World!classpath : /Users/wangtest/IdeaProjects/wang123nettest/target/classes/----> logback start18-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 end15: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 set15: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] property15:28:27,735 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to WARN15: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 目录下。

参考链接

转载于:https://my.oschina.net/wangyongtao/blog/1816085

你可能感兴趣的文章
core文件的生成
查看>>
Python--day48--ORM框架SQLAlchemy
查看>>
图形报表部署在Linux下出现乱码解决办法
查看>>
(转)求模和求余
查看>>
异常解决com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
查看>>
DateTable导出添加时间段
查看>>
【Dart学习】-- Dart之消息循环机制[翻译]
查看>>
埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 I题 二数...
查看>>
【转】浅谈Java中的hashcode方法(这个demo可以多看看)
查看>>
Super Ugly Number
查看>>
LeetCode – Refresh – Linked List Cycle II
查看>>
设计模式第三次作业
查看>>
Iterator<Entry<String,String>> iter=map.entrySet().iterator(); 是什么意思
查看>>
VM各寄存器作用
查看>>
jupyter Notebook环境搭建
查看>>
python文件上传的三种方式
查看>>
python基础学习18----面向对象简述
查看>>
Android Browser学习三 多窗口: 展示第一个Tab的过程
查看>>
java资源下载之官网地址
查看>>
学习java字符串编码总结
查看>>