前台查看日志功能

前台

<template>
  <div id="logContent">
    <div class="onlinlog">
      <div class="left">
        <div class="number">
          显示字符数:
          <span>
            <el-select
              v-model="strNumber"
              placeholder="50000"
              size="mini"
              @change="strNumberChange"
              :popper-append-to-body="false"
            >
              <el-option
                v-for="item in characters"
                :key="item.value"
                :label="item.label"
                :value="item.value"
              >
              </el-option>
            </el-select>
          </span>
        </div>
        <div class="refresh">
          自动刷新间隔:
          <span>
            <el-select
              v-model="autoRefresh"
              placeholder="关闭"
              size="mini"
              @change="autoRefreshChange"
              :popper-append-to-body="false"
            >
              <el-option
                v-for="item in refresh"
                :key="item.value"
                :label="item.label"
                :value="item.values"
              >
              </el-option>
            </el-select>
          </span>
        </div>
        <div class="button">
          <el-button size="small" @click="refreshEve" style=" background:#1890ff; color:#fff">刷新</el-button>
          <el-button size="small" @click="reset">重置</el-button>
          <el-button size="small" @click="clear">清除</el-button>
          <el-button size="small" @click="logDownload">日志下载</el-button>
        </div>
      </div>
      <div class="full" @click="full">
        <!-- 全屏 -->
        <svg class="svg-icon" aria-hidden="true">
          <use href="#icon-fullscreen" />
        </svg>
      </div>
    </div>
    <pre><span style="user-select: text">{{ logStr }}</span></pre>
  </div>
</template>

<script>
import { viewLog } from '@/api/tool/onlinelog.js'
import screenfull from 'screenfull'
export default {
  data() {
    return {
      logStr: '',
      characters: [
        {
          value: '50000',
          label: '50000'
        },
        {
          value: '100000',
          label: '100000'
        },
        {
          value: '200000',
          label: '200000'
        }
      ],
      strNumber: '50000',
      refresh: [
        {
          values: '关闭',
          label: '关闭'
        },
        {
          values: '3',
          label: '3s'
        },
        {
          values: '5',
          label: '5s'
        },
        {
          values: '10',
          label: '10s'
        }
      ],
      autoRefresh: '关闭',
      ele: '',
      timer: null
    }
  },
  created() {
    this.init('50000')
  },
  mounted() {
    this.ele = document.querySelector('#logContent')
  },
  methods: {
    // 点击全屏显示
    full() {
      screenfull.toggle(this.ele)
    },
    // 日志查看
    async init(val) {
      const { data } = await viewLog(val)
      this.logStr = data
    },
    // 显示字符数
    strNumberChange(val) {
      this.init(val)
    },
    // 自动刷新间隔
    autoRefreshChange(val) {
      if (!Number(val)) return clearInterval(this.timer)
      clearInterval(this.timer)
      this.timer = setInterval(() => {
        this.init(this.strNumber)
      }, Number(val) * 1000)
    },
    // 刷新
    refreshEve() {
      this.init(this.strNumber)
    },
    // 重置
    reset() {
      this.strNumber = '50000'
      this.autoRefresh = '关闭'
      clearInterval(this.timer)
    },
    // 清除
    clear() {
      this.logStr = ''
    },
    // 日志下载
    logDownload() {
      window.open(window._CONFIG['BASE_URL'] + '/system/onlineLog/logfile/download', 'download')
    }
  }
}
</script>

<style scoped>
/deep/ .el-select-dropdown__item {
  width:100px;
  text-align: center;

}
.onlinlog {
  width: 100%;
  padding: 0 20px 0 0;
  height: 65px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  box-sizing: border-box;
  background-color: #fff;

}
.onlinlog .left {
  display: flex;
  align-items: center;
}
.number,
.refresh {
  font-size: 12px;
  font-weight: 600;
  color: #606266;
  text-align: right;
  vertical-align: middle;
}
div {
  margin-left: 8px;
}
.full {
  margin-left: 0px;
}
pre{
  width: 100%;
  height: calc(100% - 65px);
  padding: 10px;
  color: #fff;
  background-color: #000;
  display: block;
  font-family: monospace;
  white-space: pre;
  margin: 0em 0px;
  overflow: auto;
  box-sizing: border-box;
}
#logContent {
 overflow: hidden;
 height: calc(100vh - 87px);
}
.svg-icon {
  width: 1em;
  height: 1em;
  vertical-align: -0.15em;
  fill: #000;
  overflow: hidden;
}
</style>

后台

@GetMapping("/test/getlog")
	public AjaxResult downloadLogfile(HttpServletRequest request, HttpServletResponse response) throws Exception {
		int logSize = request.getParameter("logSize")==null?50000:Integer.parseInt(request.getParameter("logSize"));
		InputStream inputStream = getInputStreamFromLogback(logSize);
		String logContent = this.getLogContent(response, inputStream);
		return AjaxResult.success("操作成功",logContent);
	}

	private String getLogContent(HttpServletResponse response, InputStream inputStream) {
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		try {
			//response.setHeader("Content-type","text/html;charset=utf-8");
			//response.setCharacterEncoding("utf-8");
			//response.setContentType("text/html;charset=utf-8");
			//out = response.getOutputStream();
			int len = 0;
			byte[] b = new byte[1024];
			while ((len = inputStream.read(b)) != -1) {
				out.write(b, 0, len);
			}
			out.flush();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (out != null) {
					out.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return out.toString();
	}

	private InputStream getInputStreamFromLogback(int logSize) throws Exception {
		InputStream inputStream = null;
		LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
		ch.qos.logback.classic.Logger logger = context.getLogger("ROOT");
		FileAppender<ILoggingEvent> fileAppender = (FileAppender<ILoggingEvent>) logger.getAppender("file_log");
		if (null == fileAppender) {
			AsyncAppender asyncAppender = (AsyncAppender) logger.getAppender("com.test");
			fileAppender = (FileAppender<ILoggingEvent>) asyncAppender.getAppender("file_log");
		}
		OutputStream outputStream = fileAppender.getOutputStream();

		File logfile = new File(fileAppender.getFile());
		String filePath = logfile.getAbsolutePath();

		FileSystemResource file = new FileSystemResource(filePath);
		if (file.isFile() && file.exists() && file.isReadable()) {
			// InputStreamResource inputStreamResource = new InputStreamResource(file.getInputStream());
			inputStream = file.getInputStream();
			int inputLen =  inputStream.available();
			System.out.println("------日志文件长度:"+inputLen);
			// 超过指定长度后,执行跳过操作,只保留指定长度的日志内网
			if(inputLen > logSize) {
				inputStream.skip(inputStream.available()-logSize);
			}
		}
		return inputStream;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值