Logback的核心API调用,动态输出日志
前言
项目碰到了不能读logback配置文件,因为配置文件是第一次启动读的,然后我程序运行时要动态写。
比如这种场景:根据不同的业务id,生成不同的日志文件。
因为动态场景,无法写配置文件,我们只能通过调用自己输出,然后自己输出还得写文件,为什么不借助logback的api去写文件呢?毕竟别人开源的代码比我们牛逼!
写代码之前,从官网看一下logback工作原理(为了让你们感觉我是看懂了原理图,手撸出来的代码),然后当然是看不懂的!233。

还是看我的代码实现吧!
实现
新建一个类LoggerBuilder.class
package com.hyperdai.DcServer.utils;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.core.ConsoleAppender;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy;
import ch.qos.logback.core.util.FileSize;
import ch.qos.logback.core.util.OptionHelper;
import org.slf4j.LoggerFactory;
import java.text.DateFormat;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
/**
* author hyperdai
* create 2019-04-08 17:10
*/
public class LoggerBuilder {
private static final Map<String,Logger> container = new HashMap<>();
private static final String LOG_PATH = "/Users/hyperdai/Projects/java_dcserver/water/midas";
public Logger getLogger(String name) {
Logger logger = container.get(name);
if(logger != null) {
return logger;
}
synchronized (LoggerBuilder.class) {
logger = container.get(name);
if(logger != null) {
return logger;
}
logger = build(name);
container.put(name,logger);
}
return logger;
}
private static Logger build(String name) {
DateFormat format = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.SIMPLIFIED_CHINESE);
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
Logger logger = context.getLogger("FILE-" + name);
logger.setAdditive(false);
RollingFileAppender appender = new RollingFileAppender();
appender.setContext(context);
// appender.setFile(LoggerBuilder.LOG_PATH + "/[" + name + "]midas.%d.%i.log");
appender.setName("FILE-" + name);
SizeAndTimeBasedRollingPolicy policy = new SizeAndTimeBasedRollingPolicy();
String fp = OptionHelper.substVars(LoggerBuilder.LOG_PATH + "/"+name+"/%d{yyyy-MM-dd}.%i.log", context);
policy.setFileNamePattern(fp);
policy.setMaxFileSize(FileSize.valueOf("128MB"));
policy.setMaxHistory(15);
policy.setTotalSizeCap(FileSize.valueOf("32GB"));
policy.setParent(appender);
policy.setContext(context);
policy.start();
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setContext(context);
encoder.setPattern("%d %p (%file:%line\\)- %msg%n");
encoder.start();
appender.setRollingPolicy(policy);
appender.setEncoder(encoder);
appender.start();
logger.addAppender(appender);
/*设置动态日志控制台输出*/
PatternLayoutEncoder encoder1 = new PatternLayoutEncoder();
encoder1.setContext(context);
encoder1.setPattern("%d %p (%file:%line\\)- %msg%n");
encoder1.start();
ConsoleAppender consoleAppender = new ConsoleAppender();
consoleAppender.setContext(context);
consoleAppender.setEncoder(encoder1);
consoleAppender.start();
logger.addAppender(consoleAppender);
return logger;
}
public static void main(String[] args) {
System.out.println("hhhhh");
}
}
简单调用测试
LoggerBuilder loggerBuilder =new LoggerBuilder();
Logger logger = loggerBuilder.getLogger("1");
logger.info("123456");
控制台ok啊:
2019-05-09 00:58:46,482 INFO (DcServer.java:52)- 123456
我也感觉ok!
参考
https://blog.csdn.net/weixin_42258128/article/details/81942796
https://blog.csdn.net/jasonlibint/article/details/81942790
https://segmentfault.com/a/1190000008315137#articleHeader9