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,还需继续检验。