Logback core API calls, dynamic output log

Disclaimer: This article is a blogger original article, please indicate the source: http: //blog.csdn.net/deaidai https://blog.csdn.net/deaidai/article/details/90004388

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.
Here Insert Picture Description
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

Guess you like

Origin blog.csdn.net/deaidai/article/details/90004388