需求:通过java代码动态生成日志文件的文件夹以及动态传入文件名
代码:
public class LoggerBuilder {
private static final Map<String,Logger> container = new HashMap<>();
private static final String LOG_PATH="E:/Tast-Jason/logback/idcicpWhois/whois/";
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.setName("FILE-" + name);
appender.setFile(OptionHelper.substVars(LoggerBuilder.LOG_PATH +format.format(new Date())+"/"+ name + ".log",context));
appender.setAppend(true);
appender.setPrudent(false);
SizeAndTimeBasedRollingPolicy policy = new SizeAndTimeBasedRollingPolicy();
String fp = OptionHelper.substVars(LoggerBuilder.LOG_PATH + format.format(new Date())+"/"+ name + "/.%d{yyyy-MM-dd}.%i.log",context);
policy.setMaxFileSize(FileSize.valueOf("128MB"));
policy.setFileNamePattern(fp);
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\\)- %m%n");
encoder.start();
PatternLayoutEncoder encoder1 = new PatternLayoutEncoder();
encoder1.setContext(context);
encoder1.setPattern("%d %p (%file:%line\\)- %m%n");
encoder1.start();
appender.setRollingPolicy(policy);
appender.setEncoder(encoder);
appender.start();
/*设置动态日志控制台输出*/
ConsoleAppender consoleAppender = new ConsoleAppender();
consoleAppender.setContext(context);
consoleAppender.setEncoder(encoder1);
consoleAppender.start();
logger.addAppender(consoleAppender);
logger.addAppender(appender);
return logger;
}
}
特点:可以通过传入name,动态的生成日志文件的文件名。下面的baidu.text就是动态生成的。