logback学习与使用(四)

logback配置文件的自动加载与手动加载

自动加载如下

编写完logback.xml后,将其放到classpatch路径下,即指定其为source目录,在java代码中直接使用即可.

1.logback会首先查找logback.groovy,查找不到执行2

2.logback会试着查找logback-test.xml,查找不到会执行3

3.logback会试着查找logback.xml,查找不到输出到控制台

具体目录如图:


java代码如下

package logback;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogbackUtil {
	public static void main(String[] args) {
		Logger logger = LoggerFactory.getLogger(LogbackUtil.class);
		logger.debug("I'm a debug");
		logger.info("I'm a info");
		logger.warn("I'm a warn");
		logger.error("I'm a error");
	}
}
有兴趣的小伙伴可以试验一下logback.groovy和logback-test.xml的优先级,本人是道听途说,没试验过,不过想来应该也不会错。


手动加载如下

下面是为大牛的代码

package logback;

import java.io.File;
import java.io.IOException;

import org.slf4j.LoggerFactory;

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

public class LogbackConfigLoader {
	/**
	 * @param externalConfigFileLocation 配置文件的路径名称
	 * @throws IOException
	 * @throws JoranException
	 */
	public static void load (String externalConfigFileLocation) throws IOException, JoranException{  
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();  
          
        File externalConfigFile = new File(externalConfigFileLocation);  
        if(!externalConfigFile.exists()){  
            throw new IOException("Logback External Config File Parameter does not reference a file that exists");  
        }else{  
            if(!externalConfigFile.isFile()){  
                throw new IOException("Logback External Config File Parameter exists, but does not reference a file");  
            }else{  
                if(!externalConfigFile.canRead()){  
                    throw new IOException("Logback External Config File exists and is a file, but cannot be read.");  
                }else{  
                    JoranConfigurator configurator = new JoranConfigurator();  
                    configurator.setContext(lc);  
                    lc.reset();  
                    configurator.doConfigure(externalConfigFileLocation);  
                    StatusPrinter.printInCaseOfErrorsOrWarnings(lc);  
                }  
            }     
        }  
    }  
}
实际应用当中,发现logback的输出方式与system.out,apache的log,以及log4j混合所线程使用,极容易出现死锁的情况,望各位小伙伴在使用时注意,出现程序不通并且有混合使用的情况可查看是否是这方面的问题。

调用代码如下,路径是最需要注意的地方。

package logback;

import java.io.IOException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import ch.qos.logback.core.joran.spi.JoranException;

public class LogbackUtil {
	public static void main(String[] args) {
		try {
			LogbackConfigLoader.load("logback-log.xml");
		} catch (IOException e) {
			e.printStackTrace();
		} catch (JoranException e) {
			e.printStackTrace();
		}
		Logger logger = LoggerFactory.getLogger(LogbackUtil.class);
		logger.debug("I'm a debug");
		logger.info("I'm a info");
		logger.warn("I'm a warn");
		logger.error("I'm a error");
	}
}
由于本人最近在写统一日志输出的功能,所以不能读取文件,而需要使用读取文件出来的字符串或者字节流

下面是使用到的代码

package logback;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogbackUtil {
	public static void main(String[] args) {
		try {
			BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("./conf/test.xml")));
			StringBuffer sb = new StringBuffer();
			String s = null;
			while((s = reader.readLine()) != null){
				sb.append(s);
			}
			LogbackConfigLoader.loadFile(sb.toString());
			Logger log = LoggerFactory.getLogger("Util");
			log.info("I'M INFO?");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

<?xml version="1.0"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
	<property name="log" value="MyApp" />
	<contextName>${log}</contextName>
	<timestamp key="time" datePattern="yyyyMMdd'T'HHmmss" />
	
	<appender name="D" class="ch.qos.logback.core.rolling.RollingFileAppender">   
    	<file>./log/test.log</file>   
   
    	<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">   
    		<fileNamePattern>./log/tests.%i.log.zip</fileNamePattern>   
      		<minIndex>1</minIndex>   
      		<maxIndex>3</maxIndex>   
    	</rollingPolicy>   
   
    	<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">   
      		<maxFileSize>5MB</maxFileSize>   
    	</triggeringPolicy>   
    
    	<encoder>   
      		<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>   
    	</encoder>   
  	</appender>   
	
	<logger name="Util" level="INFO" additivity="false">
		<appender-ref ref="D"/>
	</logger>
	
	<root level="INFO">
		<appender-ref ref="D"/>
	</root>
</configuration>
查看logback源代码,发现通过文件进行加载时对URL也进行了设置,不知道上面代码在应用中是否会出现bug,还需继续检验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值