java代码实现LogBack动态输出日志【无配置文件纯代码】

需求:
      需要传入某一个文件或者类或者方法的名字,生成对应日志文件,且每一个传入名字的文件单独有一个文件夹,子文件夹为日期,日期文件夹里面包含warn.log,error.log,debug.log,info.log。通过过滤器实现只打印对应级别的日志。

 

遇到的问题:
      度娘了很久,网上关于logback的几乎都是xml进行配置的,但是经过尝试,xml配置的方式不能直接进行动态的输出,故此方法暂时淘汰,遂想到用纯代码的方式,尝试了许多次才得到正确的结果,所以记录下来,以免今后少走弯路。

 

内容:
1.创建LoggerBuilder类,这个类相当于一个日志工具类,之后其他类需要用日志的时候,直接调用它的方法就好了。

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.rolling.RollingFileAppender;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
 
import java.util.HashMap;
import java.util.Map;
 
/**
 * @author Wzy525110
 */
@Component
public class LoggerBuilder {
 
    private static final Map<String,Logger> container = new HashMap<>();
    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) {
        RollingFileAppender errorAppender =new AppenderTest().getAppender(name,Level.ERROR);
        RollingFileAppender infoAppender =new AppenderTest().getAppender(name,Level.INFO);
        RollingFileAppender warnAppender =new AppenderTest().getAppender(name,Level.WARN);
        RollingFileAppender debugAppender =new AppenderTest().getAppender(name,Level.DEBUG);
        LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
        Logger logger = context.getLogger("FILE-" + name);
        //设置不向上级打印信息
        logger.setAdditive(false);
        logger.addAppender(errorAppender);
        logger.addAppender(infoAppender);
        logger.addAppender(warnAppender);
        logger.addAppender(debugAppender);
 
        return logger;
    }
}
2.创建AppenderTest类,这个类给LoggerBuilder动态提供appender

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.filter.LevelFilter;
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 org.springframework.stereotype.Component;
 
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
 
/**
 * 这个类是给日志动态提供appender
 * @author Wzy525110
 */
@Component
public class GetTheAppender {
    /**
     * 通过传入的名字和级别,动态设置appender
     * @param name
     * @param level
     * @return
     */
    public RollingFileAppender getAppender(String name, Level level){
        DateFormat format = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.SIMPLIFIED_CHINESE);
        LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
        //这里是可以用来设置appender的,在xml配置文件里面,是这种形式:
        // <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        RollingFileAppender appender = new RollingFileAppender();
//        ConsoleAppender consoleAppender = new ConsoleAppender();
 
        //这里设置级别过滤器
        LevelController levelController = new LevelController();
        LevelFilter levelFilter = levelController.getLevelFilter(level);
        levelFilter.start();
        appender.addFilter(levelFilter);
 
 
        //设置上下文,每个logger都关联到logger上下文,默认上下文名称为default。
        // 但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
        appender.setContext(context);
        //appender的name属性
        appender.setName("FILE-" + name);
        //设置文件名
        appender.setFile(OptionHelper.substVars("E:/eppLog/"+ name+"/" + format.format(new Date())+"/"+ level.levelStr + ".log",context));
 
        appender.setAppend(true);
 
        appender.setPrudent(false);
 
        //设置文件创建时间及大小的类
        SizeAndTimeBasedRollingPolicy policy = new SizeAndTimeBasedRollingPolicy();
        //文件名格式
        String fp = OptionHelper.substVars("E:/eppLog/"+ name +"/" + format.format(new Date())+"/"+ level.levelStr + "/.%d{yyyy-MM-dd}.%i.log",context);
        //最大日志文件大小
        policy.setMaxFileSize(FileSize.valueOf("128MB"));
        //设置文件名模式
        policy.setFileNamePattern(fp);
        //设置最大历史记录为15条
        policy.setMaxHistory(15);
        //总大小限制
        policy.setTotalSizeCap(FileSize.valueOf("32GB"));
        //设置父节点是appender
        policy.setParent(appender);
        //设置上下文,每个logger都关联到logger上下文,默认上下文名称为default。
        // 但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
        policy.setContext(context);
        policy.start();
 
        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
        //设置上下文,每个logger都关联到logger上下文,默认上下文名称为default。
        // 但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
        encoder.setContext(context);
        //设置格式
        encoder.setPattern("%d %p (%file:%line\\)- %m%n");
        encoder.start();
 
        //加入下面两个节点
        appender.setRollingPolicy(policy);
        appender.setEncoder(encoder);
        appender.start();
        return appender;
    }
}
注意:每一个节点都需要.start(),才能加入到这个类拼凑出来的格式中。

 

3.创建LevelController类,这个类主要是通过level动态的给日志生成过滤器

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.filter.LevelFilter;
 
import static ch.qos.logback.core.spi.FilterReply.ACCEPT;
import static ch.qos.logback.core.spi.FilterReply.DENY;
 
/**
 * 这个类的作用是给日志通过level设置过滤器
 * @author Wzy525110
 */
public class LevelController {
    /**
     * 通过level设置过滤器
     * @param level
     * @return
     */
    public LevelFilter getLevelFilter(Level level){
        LevelFilter levelFilter = new LevelFilter();
        levelFilter.setLevel(level);
        levelFilter.setOnMatch(ACCEPT);
        levelFilter.setOnMismatch(DENY);
        return levelFilter;
    }
}
 

       这样,logback的工具类就OK了,可以正常在其他类进行使用了!

测试类如下:

import com.wzy.common.LoggerBuilder;
import ch.qos.logback.classic.Logger;
/**
 * @author Wzy525110
 */
public class LogTest {
 
    public static void main(String[] args) {
        LoggerBuilder loggerBuilder =new LoggerBuilder();
        Logger logger = loggerBuilder.getLogger("test");
        logger.debug("shuai1 +++++++++++++++++++++++++++++++++++++debug");
        logger.warn("shuai2 +++++++++++++++++++++++++++++++++++++warn");
        logger.info("shuai3 +++++++++++++++++++++++++++++++++++++info");
        logger.error("shuai4 +++++++++++++++++++++++++++++++++++++error");
    }
}
 

输出:

使用log4j生成动态日志文件-文件名根据时间自动生成 - spring292713
log4j.propertiespeizhi
--------------------- 
作者:一个奔三的胖墩儿 
来源:CSDN 
原文:https://blog.csdn.net/weixin_42258128/article/details/81942796 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要设置Java应用的启动脚本和logback日志文件输出路径,可以按照以下步骤操作: 1. 创建Java应用的启动脚本,例如: ``` #!/bin/bash JAVA_HOME=/path/to/java/home APP_HOME=/path/to/app/home LOGS_DIR=/path/to/logs/dir java -Dlogback.configurationFile=$APP_HOME/conf/logback.xml -jar $APP_HOME/app.jar >> $LOGS_DIR/app.log 2>&1 & ``` 其中,JAVA_HOME指定了Java的安装路径,APP_HOME指定了Java应用的安装路径,LOGS_DIR指定了日志文件输出的目录。-Dlogback.configurationFile参数指定了logback配置文件的路径,-jar参数指定了Java应用的启动jar包,>> $LOGS_DIR/app.log 2>&1 &表示将应用的标准输出和标准错误输出都重定向到指定的日志文件中,并将应用在后台运行。 2. 创建logback配置文件,例如: ``` <configuration> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>/path/to/logs/dir/app.log</file> <append>true</append> <encoder> <pattern>%d %p %c{1.} [%t] %m%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="FILE" /> </root> </configuration> ``` 其中,name属性指定了appender的名称,class属性指定了appender的类型,file节点指定了输出文件的路径和文件名,append节点指定了是否在文件末尾追加日志信息,encoder节点指定了日志信息的格式化方式。root节点指定了默认的日志级别和appender。 3. 将启动脚本和logback配置文件放置在相应的目录中,并修改执行权限,例如: ``` sudo chmod +x /path/to/app/home/bin/startup.sh sudo chmod 755 /path/to/app/home/conf/logback.xml ``` 4. 运行启动脚本,例如: ``` sudo /path/to/app/home/bin/startup.sh ``` 这样,Java应用就会在后台运行,并将日志信息输出到指定的日志文件中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值