Logback配置及日志文件读取

一、Logback配置有以下三种方式

Logback是由log4j的创始人设计的另一个开源日志组件。

1、application.yml文件配置(适用于简单配置)

日滚动,由Logback自动打包上一天的日志

logging:
  pattern:
    file: "%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{15} - %msg %n)"     #文件输出
    console: "%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{15} - %msg %n)"  #控制台输出
  file:
    name: F:\logs\spb.log #文件输出路径
  level:
    root: info #全局最低输出级别
    com.snow: debug #特定包下的级别

2、xml文件配置

单独新建logback.xml或logback-spring.xml
在这里插入图片描述

<configuration debug="true" scan="true" scanPeriod="5 seconds"> <!--scan配置文件修改时重新加载-->
    <!--自定义日志输出路径-->
    <property name="LOG_HOME" value="logs"/>
    <!--自定义日志留存天数-->
    <property name="LOG_MAX_MISTORY" value="90"/>
    <!--自定义单个文件大小,超过生成新的文件-->
    <property name="LOG_MAX_FILE_SIZE" value="512MB"/>
    <!--自定义日志总体的大小,超过将删除最旧的日志存档-->
    <property name="LOG_TOTAL_SIZE_CAP" value="10GB"/>


    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <withJansi>true</withJansi>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{15} - %msg %n) </pattern>
        </encoder>
    </appender>

    <appender name="FILE_INFO_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--自定义输出过滤器 对于ERROR级别的日志 ACCEPT接收-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
        </filter>

        <!--自定义滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd_HH-mm}.%i.log</fileNamePattern>
            <!--单个文件大小-->
            <maxFileSize>${LOG_MAX_FILE_SIZE}</maxFileSize>
            <!--保存多少天日志-->
            <maxHistory>${LOG_MAX_MISTORY}</maxHistory>
            <!--日志最大容量-->
            <totalSizeCap>${LOG_TOTAL_SIZE_CAP}</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{15} - %msg %n) </pattern>
        </encoder>
    </appender>

    <appender name="FILE_ERROR_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>

        <!--自定义滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/error.%d{yyyy-MM-dd_HH-mm}.%i.log</fileNamePattern>
            <!--单个文件大小-->
            <maxFileSize>${LOG_MAX_FILE_SIZE}</maxFileSize>
            <!--保存多少天日志-->
            <maxHistory>${LOG_MAX_MISTORY}</maxHistory>
            <!--日志最大容量-->
            <totalSizeCap>${LOG_TOTAL_SIZE_CAP}</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{15} - %msg %n) </pattern>
        </encoder>

    </appender>

    <appender name="FILE_JRR_ERROR_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>

        <!--自定义滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/jrr.error.%d{yyyy-MM-dd_HH-mm}.%i.log</fileNamePattern>
            <!--单个文件大小-->
            <maxFileSize>${LOG_MAX_FILE_SIZE}</maxFileSize>
            <!--保存多少天日志-->
            <maxHistory>${LOG_MAX_MISTORY}</maxHistory>
            <!--日志最大容量-->
            <totalSizeCap>${LOG_TOTAL_SIZE_CAP}</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{15} - %msg %n) </pattern>
        </encoder>

    </appender>


    <!--root级别的log-->
    <root level="info">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE_INFO_LOG"/>
        <appender-ref ref="FILE_ERROR_LOG"/>
    </root>
    <logger name="com.cs.jrr" additivity="false" > <!--additivity是否传递给root-->
        <appender-ref ref="FILE_JRR_ERROR_LOG"/>
    </logger>
</configuration>

3、JAVA配置


import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.nio.charset.Charset;

public class LogAppender {
    /**
     * 通过传入的任务名字,动态设置appender
     * @param taskName
     * @return
     */
    public RollingFileAppender getAppender(String oldLogPath,String taskName) {
        LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
        RollingFileAppender appender = new RollingFileAppender();
        //appender的name属性
        appender.setName( taskName);
        appender.setContext(context);

        //设置文件名
        appender.setFile(new File(oldLogPath, taskName+".log").getAbsolutePath());

        //设置日志文件输出格式
        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
        encoder.setContext(context);
        encoder.setPattern("%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
        encoder.setCharset(Charset.forName("UTF-8"));
        encoder.start();

        //设置日志记录器的滚动策略(如果要限制文件的大小请使用-----SizeAndTimeBasedRollingPolicy)
        TimeBasedRollingPolicy policy = new TimeBasedRollingPolicy();
        policy.setFileNamePattern(oldLogPath+taskName+".%d{yyyy-MM-dd}.log");
        policy.setParent(appender); //设置父节点是appender
        policy.setContext(context);
        policy.start();

        //加入下面两个节点
        appender.setRollingPolicy(policy);
        appender.setEncoder(encoder);
        appender.start();
        return appender;
    }
}

import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.rolling.RollingFileAppender;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.Map;

public class TaskLoggerService {

    String logPath;//日志存储路径
    public TaskLoggerService(String logPath) {
        this.logPath = logPath;
    }
    //对外暴露日志对象:每次拿的对象从内存里拿,没有再构建
    private static Map<String,Logger> container = new HashMap<>();
    public Logger getLogger(String taskName) {
        Logger logger = container.get(taskName);
        if(logger != null) {
            return logger;
        }
        logger = build(taskName);
        container.put(taskName,logger);
        return logger;
    }
    //构建Logger对象,给Logger指定appender,该方法不对外暴露
    private Logger build(String taskName) {
        RollingFileAppender runTaskAppender =new com.cs.cs.logback.LogAppender().getAppender(this.logPath,taskName);
        LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
        Logger logger = context.getLogger(taskName);
        logger.addAppender(runTaskAppender);
        return logger;
    }
}
Java配置使用
    TaskLoggerService loggerBuilder =new TaskLoggerService("路径名");
    Logger logger = loggerBuilder.getLogger("文件名");
    //放在方法内
    logger.debug("debug");

二、日志文件读取

@GetMapping
public void getLogInfo(){
	String url = "F:\\logs\\";
    String name=".log";
    GetLog getLog=new GetLog();
    try {
    	getLog.Logs(url,name);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public class GetLog {
    public static List<Object> Logs(String url, String name) throws Exception {
        List<String> list = new ArrayList<>();
        list = getFileName(url,name);
        GetLog view = new GetLog();
        List<Object> unlist = new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
            String log = list.get(i);
            final File tmpLogFile = new File(url + log);
            try {
                if (view.realtimeShowLog(tmpLogFile).length() > 0) {
                    unlist.add(view.realtimeShowLog(tmpLogFile));
                }
            }catch (Exception e){
                System.out.println("没有读取到"+url + log+"的数据!");
            }
        }
        return unlist;
    }

    public static String realtimeShowLog(File logFile) throws Exception {
        String u = null;
        String a = null;

        try {
            FileInputStream fstream = new FileInputStream(logFile);
            BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
            int len;
            char[] chars=new char[10240000];
            while ((len=br.read(chars))!=-1) {
                u=(new String(chars,0,len));
            }
            fstream.close();
        } catch (Exception e) {
            System.err.println("Error: " + e.getMessage());
        }
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date date=new Date();
        String today = format.format(date);
        if(u.substring(u.lastIndexOf("this class id")).contains(today)){
            a=  u.substring(u.lastIndexOf("this class id"));
        }
        return a;
    }

    //查询目录下所有文件名称
    public static List<String> getFileName(String url, String name) {
        String path = url; // 路径
        File f = new File(path);//获取路径  F:测试目录
        if (!f.exists()) {
            System.out.println(path + " not exists");//不存在就输出
            return null;
        }

        File fa[] = f.listFiles();//用数组接收  F:笔记总结C#, F:笔记总结if语句.txt
        List<String> list = new ArrayList<>();
        for (int i = 0; i < fa.length; i++) {//循环遍历
            File fs = fa[i];//获取数组中的第i个
            if (!fs.isDirectory()) {
                if (fs.getName().contains(name) && fs.getName().substring(fs.getName().lastIndexOf(".")).contains(name)) {
                    list.add(fs.getName());
                }
            }
        }
        return list;
    }
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值