idea中xml文件注释快捷键运行logback.xml为何路径指向根目录?

配置被引入文件需要以 <include> 标签作为 root 标签 .以下两个文件为例: logback-include.xml , logback.xml<!-- logback-include.xml -->
<include>
<property name="LEVEL" value="INFO"/>
</include>
然后引入文件 , 使用
标签来引入文件<!-- logback.xml -->
<configuration>
<include resource="logback-include.xml" />
</configuration>
那么就可以引入 logback-include.xml文件了.文件路径上一步,
文件可以引入的前提是两个文件在同一个目录下 . 那么在不同路径下的 , 需要将路径带入 . 以jar包根路径来配置目录.举例 ,
logback-include.xml 的 maven 路径为: src/resources/com/test/logback/logback-include.xml那么在 logback.xml 中的配置则是:<!-- logback.xml -->
<configuration>
<include resource="com/test/logback/logback-include.xml" />
</configuration>
注意路径需要唯一,冲突会有异常
特殊文件路径特别注意一点 , logback-include.xml 在 maven 中 , 不能直接放在 src/resouces 路径下 .这样的情况就是 , logback-include.xml 在 jar 的根路径中 , 但不是跟 logback.xml
同一目录 . 在没有路径的情况下 , 默认只会去找同目录下的文件 . 就找不到jar包里的了 .<!-- logback.xml -->
<configuration>
<!-- 这么配置 , 只会找同目录下的文件 -->
<include resource="logback-include.xml" />
</configuration>
}
解决 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相关配置,其中${LOG_HOME}表示为环境变量,在java启动应用程序时,通过java -DLOG_HOME="路径"来指定的,可以动态去设置它的地址。<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
 <property name="logPath" value="${LOG_HOME-/home}/logs" />
<!--
日志打印的格式 -->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
%d - %msg%n
</pattern>
</layout>
</appender>
<!-- info 状态下的日志
-->
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</o}

我要回帖

更多关于 java 解析xml 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信