一、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;
}
}