前台
<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 {
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()) {
inputStream = file.getInputStream();
int inputLen = inputStream.available();
System.out.println("------日志文件长度:"+inputLen);
if(inputLen > logSize) {
inputStream.skip(inputStream.available()-logSize);
}
}
return inputStream;
}