logback 同一路径下只能有一个配置文件吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了logback 同一路径下只能有一个配置文件吗相关的知识,希望对你有一定的参考价值。

般情况下,如果在同一个web容器中有多个项目用到logback(下面都以tomcat为例,其他容器类似)

1)每个项目都自带logback的lib包和配置文件(logback.xml)

缺点:项目多的话一堆重复的第三方jar包,打war包发布更新的时候慢

2)把lib包和配置文件都放在tomcat/lib下

缺点:多个项目的配置写在同一个文件中,互相干扰,发布完还得手动改,不方便

为了解决该问题,建立了logback-web项目

内容非常简单,就一个类+一个配置文件

达到的效果:将logback的jar包和logback-web的包都放在tomcat/lib下,而每个项目自己的日志配置文件(logback.xml或logback.groovy)放在自己的WEB-INF/classes下,logback自动为每个项目分别初始化LoggerFactory

原理:logback读取配置文件的顺序为

1.classpath下(如果jar包放在tomcat/lib下它就会到这个目录找)

2.寻找Configurator的第一个实现类

3.代码内默认的配置(以固定格式输出日志到console)

logback-web就是实现了Configurator,根据每个项目初始化线程找到项目路径,分别读取配置文件
参考技术A Logback 可以通过编程式配置,或用 XML 格式的配置文件进行配置。
Logback 采取下面的步骤进行自我配置:
1. 尝试在 classpath 下查找文件 logback-test.xml;
2. 如果文件不存在,则查找文件 logback.xml;
3. 如果两个文件都不存在,logback 用 BasicConfigurator 自动对自己进行配置,这会 导致记录输出到控制台。
  如果是maven工程直接把logback.xml放在src/main/resources里面即可。
参考技术B web.xml中配置:

<!-- windows logback.xml文件跟web容器(比如tomcat)在同一个目录中。Linux随意 -->
<context-param>
<param-name>logbackConfigLocation</param-name>
<param-value>file:/datum/Data/conf/config/logback.xml</param-value>
</context-param>

<!-- logback.xml随意放 -->
<context-param>
<param-name>logbackConfigLocation</param-name>
<param-value>file:E:\\datum\\data\\conf\\logback.xml</param-value>
</context-param>

其中file:一定要有。

<listener>
<listener-class>com.cxfmvcstu.comn.LogbackConfigListener</listener-class>
</listener>
LogbackConfigListener为自己的实现类
参考技术C web.xml中配置: logbackConfigLocation file:/datum/Data/conf/config/logback.xml logbackConfigLocation file:E:\\datum\\data\\conf\\logback.xml 其中file:一定要有。 com.cxfmvcstu.comn.LogbackConfigListener LogbackConfigListener为自己的实现类 参考技术D web.xml中配置: logbackConfigLocation file:/datum/Data/conf/config/logback.xml logbackConfigLocation file:E:\\datum\\data\\conf\\logback.xml 其中file:一定要有。 com.cxfmvcstu.comn.LogbackConfigListener LogbackConfigListener为自己的实现类

java webproject中logback换配置文件的路径

本人小站点:   http://51kxd.com/  欢迎大家不开心的时候訪问訪问,调节一下心情


web.xml中配置:


<!-- windows  logback.xml文件跟web容器(比方tomcat)在同一个文件夹中。linux任意  -->
<context-param>
<param-name>logbackConfigLocation</param-name>
<param-value>file:/datum/Data/conf/config/logback.xml</param-value>
</context-param>


<!-- logback.xml任意放  -->
<context-param>
<param-name>logbackConfigLocation</param-name>
<param-value>file:E:\\datum\\data\\conf\\logback.xml</param-value>
</context-param>


当中file:一定要有。



<listener>
<listener-class>com.cxfmvcstu.comn.LogbackConfigListener</listener-class>
</listener>

LogbackConfigListener为自己的实现类

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.UrlResource;

import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.joran.JoranConfigurator;
import ch.qos.logback.core.joran.spi.JoranException;


/**
 * @description 
 * @path com.cxfmvcstu.comn.LogbackConfigListener
 * @author lijun.justin
 * @time 2015年6月27日 下午8:13:19
 */
public class LogbackConfigListener implements ServletContextListener {
	private static final Logger logger = LoggerFactory.getLogger(LogbackConfigListener.class);

	private static final String CONFIG_LOCATION = "logbackConfigLocation";

	@Override
	public void contextInitialized(ServletContextEvent event) {
		// 从web.xml中载入指定文件名称的日志配置文件
		String logbackConfigLocation = event.getServletContext().getInitParameter(CONFIG_LOCATION);
		String fn = event.getServletContext().getRealPath(logbackConfigLocation);
		try {
			UrlResource urlResource = new UrlResource(logbackConfigLocation);
			LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
			loggerContext.reset();
			JoranConfigurator joranConfigurator = new JoranConfigurator();
			joranConfigurator.setContext(loggerContext);
			//joranConfigurator.doConfigure(fn);
			joranConfigurator.doConfigure(urlResource.getFile().getAbsolutePath());
			logger.debug("loaded slf4j configure file from {}", fn);
		} catch (JoranException e) {
			logger.error("can loading slf4j configure file from " + fn, e);
		}catch (Exception e) {
			logger.error(e.getMessage(), e);
		}

	}

	@Override
	public void contextDestroyed(ServletContextEvent event) {
	}
}

要依赖于spring的UrlResource类。里面没用的代码。读者自己精简一下


logback.xml的配置演示样例:


<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">   
<!-- 控制台输出 -->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
</encoder>
</appender>


<!-- 时间滚动输出 level为 INFO 日志 -->
<appender name="file—INFO"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY </onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>D:/logs/INFO.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
</encoder>
</appender>


<!-- 时间滚动输出 level为 ERROR 日志 -->
<appender name="file—error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY </onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>D:/logs/error.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
</encoder>
</appender>


<!-- 特定过滤含有某字符串的日志   须要额外的两个JAR包,commons-compiler.jar和janino.jar
<appender name="file-str" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<level>ERROR</level>
<evaluator>
<expression>message.contains("str")</expression>
</evaluator>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>D:/logs/contains.%d{yyyy-MM-dd}.log
</FileNamePattern>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
</encoder>
</appender>  -->


<!-- 数据库输出 
<appender name="db" class="ch.qos.logback.classic.db.DBAppender">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<level>ERROR</level>
<evaluator>
<expression>message.contains("str")</expression>
</evaluator>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<connectionSource
class="ch.qos.logback.core.db.DriverManagerConnectionSource">
<driverClass>com.mysql.jdbc.Driver</driverClass>
<url>jdbc:mysql://host_name:3306/datebase_name</url>
<user>username</user>
<password>password</password>
</connectionSource>
</appender> -->


<root level="INFO">
<appender-ref ref="stdout" />
<appender-ref ref="file—INFO" />
<appender-ref ref="file—error" />
<appender-ref ref="file-str" />
<appender-ref ref="db" />
</root>


</configuration> 



本人小站点:   http://51kxd.com/  欢迎大家訪问

























































































































以上是关于logback 同一路径下只能有一个配置文件吗的主要内容,如果未能解决你的问题,请参考以下文章

java webproject中logback换配置文件的路径

logback.xml引入外部配置文件

Java日志组件logback使用:加载非类路径下的配置文件并设置定时更新

关于logback如何通过当前配置文件获取路径

logback配置文件详解

如何在logback日志配置文件中配置相对路径