在线读取/显示项目系统 日志/log日志在线显示
效果如下:
1、显示项目文件夹
2、进入文件夹后显示三种日志
3、显示具体的日志页面
功能实现
第一步:配置 读取 项目文件夹 权限
例如:E:/ccz/yundianba-project/ 是【1、显示项目文件夹】当前路径
web.file-path=E:/ccz/yundianba-project/
spring.resources.static-locations= classpath:/templates/,classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${web.logo-path},file:${web.file-path}
第二步:代码编写
java代码 功能代码
/**
* 描述:
* 读取日志文件
* @author 闲走天涯
* @create 2021/7/14 17:01
*/
@Slf4j
@RestController
@RequestMapping("/logger")
public class LogFloderController {
@Value("${web.file-path:}")
private String path;
@Value("${ydb-mgURL:}")
private String domain;
@RequestMapping("/getLogFloder")
public Map getLogFloder(String path, String pathFloder){
//log.info("【读取日志文件】参数path={},pathFloder={}",path,pathFloder);
Map result = new HashMap();
result.put("code","1");
List<String> list = getFileFloder(path,pathFloder);
if(list!=null){
result.put("code","3");
result.put("msg","查询成功");
result.put("data",list);
}else{
result.put("code","1");
result.put("msg","查询失败");
}
return result;
}
@RequestMapping("/getBasic")
public Map getBasic(){
Map result = new HashMap();
result.put("code","1");
if(VerifyData.strIsNotNull(domain) && VerifyData.strIsNotNull(path)) {
result.put("code","3");
path = path.replaceAll("\\\\","/");
result.put("domain", domain);
result.put("path", path);
}
return result;
}
/**
* 读取文件夹
* @param path
* @return
*/
public List<String> getFileFloder(String path, String pathFloder){
List<String> nameList = new ArrayList<>();
String type = "";
try {
pathFloder = pathFloder.replaceAll("\\\\","/");
if(!"".equals(pathFloder) && pathFloder!=null){
if (pathFloder.indexOf("/info") != -1) {
type = "info";
}
if (pathFloder.indexOf("/error") != -1) {
type = "error";
}
if (pathFloder.indexOf("/warn") != -1) {
type = "warn";
}
if("".equals(type) || type==null) {
nameList.add("info");
nameList.add("error");
nameList.add("warn");
return nameList;
}
}
ArrayList<String> listFileName=new ArrayList<String>();
getFileName(path, listFileName); //需要读取的文件位置
for (String name : listFileName) {
name = name.replaceAll("\\\\","/");
if ("".equals(pathFloder) || pathFloder == null) {
if (!name.contains(".log") && name.indexOf(".") == -1) { //文件类型
name = name.replace(path,"");
if(!nameList.contains(name) && name.indexOf("/")==-1){
nameList.add(name);
}
}
} else {
String backpage = pathFloder.replace("/"+type,"");
backpage = backpage.replace("/","");
if (name.contains(".log") && name.contains("/"+backpage+"/") && name.contains("log-" + type)) {
nameList.add(name);
}
}
}
//log.info("【读取日志文件】输出文件名称数量="+nameList.size());
if(nameList==null || nameList.size()==0){return null;}
if(nameList.get(0).contains("log-info-")
|| nameList.get(0).contains("log-error-")
|| nameList.get(0).contains("log-warn-")){
//根据时间进行升序排序
Collections.sort(nameList, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
String type="",time1 = "",id1="",time2="",id2="";
if(o1.contains("log-info-")){
type="log-info-";
}else if(o1.contains("log-error-")){
type="log-error-";
}else if(o1.contains("log-warn-")){
type="log-warn-";
}
time1 = o1.substring(o1.indexOf(type),o1.length());
time1 = time1.replace(".log","");
id1 = time1.substring(time1.lastIndexOf(".")+1,time1.length());
time1 = time1.substring(0,time1.lastIndexOf("."));
time2 = o2.substring(o2.indexOf(type),o2.length());
time2 = time2.replace(".log","");
id2 = time2.substring(time2.lastIndexOf(".")+1,time2.length());
time2 = time2.substring(0,time2.lastIndexOf("."));
if(time1.compareTo(time2)==0){
return id2.compareTo(id1);
}else{
return time2.compareTo(time1);
}
}
});
}
return nameList;
} catch (Exception e) {
log.error("【读取日志文件】异常",e);
}
return null;
}
public void getFileName(String path,ArrayList<String> listFileName){
File file =new File(path);
File[] files=file.listFiles();
String[] names= file.list();
if(names!=null || names.length>0){
//log.info("【读取日志文件】文件数量="+names.length);
String[] completName= new String[names.length];
for(int i=0;i<names.length;i++){
completName[i]=path+names[i];
}
listFileName.addAll(Arrays.asList(completName));
}
if(files!=null || files.length>0) {
//log.info("【读取日志文件】文件夹数量="+files.length);
for (File a : files) {
if (a.isDirectory()) { //判断有子文件
//log.info("【读取日志文件】子文件夹路径="+a.getAbsolutePath());
getFileName(a.getAbsolutePath() + "/", listFileName);
}
}
}
}
}
HTML页面代码:
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv="UserContent-Type" content="text/html; charset=utf-8" />
<title>查看日志</title>
<script src="/js/jquery-2.0.2.min.js"></script>
</head>
<body>
<h4><a href="javascript:void(0);" onclick="getBack();" target="_self">..</a></h4>
</body>
</html>
<script>
//默认参数的路径参数
var domain = "http://127.0.0.1:8082";
var path = "D:/cmw/test/";
getFloader();
function getFloader(){
//返回配置的路径参数
getBasic();
var pathFloder = "";
var locationHref = location.href;
if(locationHref.indexOf("pathFloder=")!=-1){
pathFloder = locationHref.substring(locationHref.indexOf("pathFloder=")+11,locationHref.length);
}else if(locationHref.indexOf("pathFloder=")==-1 && locationHref.indexOf("pathFloder")!=-1){
pathFloder = locationHref.substring(locationHref.indexOf("pathFloder")+10,locationHref.length);
}
$.ajax({
type: "GET",
url: '/logger/getLogFloder',
data: {
path:path,
pathFloder:pathFloder
},
async:false,
success: function (backData) {
if(backData.code=="3"){
var html = '';
for(var i=0;i<backData.data.length;i++){
var url = backData.data[i].replace(path,"/");
if(url.indexOf(".log")!=-1){
html+='<h4><a href="'+domain+url+'" target="_blank">'+url+'</h4>';
}else{
html+='<h4><a href="'+domain+'/views/admin/queryLogFile.html?pathFloder='+pathFloder+'/'+url+'" target="_self">'+url+'</h4>';
}
}
$("body").append(html);
}else{
alert(backData.msg);
}
},
error: function () {
alert("error request");
}
});
}
/**
*返回配置的路径参数
**/
function getBasic(){
$.ajax({
type: "GET",
url: '/logger/getBasic',
data: {},
async:false,
success: function (backData) {
if(backData.code=="3"){
domain = backData.domain;
path = backData.path;
}else{
alert(backData.msg);
}
},
error: function () {
alert("error request");
}
});
}
//返回上一级
function getBack(){
var pathFloder = "";
var locationHref = location.href;
if(locationHref.indexOf("pathFloder=")!=-1){
pathFloder = locationHref.substring(locationHref.indexOf("pathFloder=")+11,locationHref.length);
}else if(locationHref.indexOf("pathFloder=")==-1 && locationHref.indexOf("pathFloder")!=-1){
pathFloder = locationHref.substring(locationHref.indexOf("pathFloder")+10,locationHref.length);
}
if(pathFloder!="" && pathFloder.indexOf("/")!=-1){
locationHref = locationHref.substring(0,locationHref.lastIndexOf("/"));
}
location.href=locationHref;
}
</script>