Foreword
Project met logback can not read the profile, because the configuration file is the first time you start reading, and then I want to write dynamic runtime.
This example scenario: The different service id, generate different log files.
Because dynamic scene, unable to write configuration file, we can only own output by calling, then had to write their own output file, why not help api logback the file to write it? After all, others regressed open source code than we are!
Before writing the code, from the official website look logback works (To give you a feeling I understand schematics, line and hand out the code), then of course, can not read! 233.
Or look at my code to achieve it!
achieve
Create a new classLoggerBuilder.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");
}
}
Simple test call
LoggerBuilder loggerBuilder =new LoggerBuilder();
Logger logger = loggerBuilder.getLogger("1");
logger.info("123456");
Console ok ah:
2019-05-09 00:58:46,482 INFO (DcServer.java:52)- 123456
I also feel ok!
reference
https://blog.csdn.net/weixin_42258128/article/details/81942796
https://blog.csdn.net/jasonlibint/article/details/81942790
https://segmentfault.com/a/1190000008315137#articleHeader9