Commit 2b166c1c authored by jacky's avatar jacky
Browse files

English Version

parent cda61b27
......@@ -4,6 +4,6 @@
"files": [],
"sources": [],
"keywords": "/hvoin",
"code": "for(let i = base; i < logs.length; i++){\nlet log = logs[i].message\nif (log.indexOf('hvin error') != -1){\noutput('上高压失败', i)\n}\n}",
"name": "上高压失败"
"code": "for(let i = base; i < logs.length; i++){\nlet log = logs[i].message\nif (log.indexOf('hvin error') != -1){\noutput('Failed to apply high voltage', i)\n}\n}",
"name": "Failed to apply high voltage"
}
\ No newline at end of file
{
"levels": [],
"types": [],
"files": [],
"sources": [],
"keywords": "remote-power-on failed",
"code": "debug('start')\nlet results = []\nlet keyLine = base\nfor(let i = base; i >=0; i--){\n let msg = logs[i].message\n let pos = msg.indexOf('power_gear') \n if (pos != -1){\n keyLine = i\n results.push('Gear : ' + msg.substring(msg.indexOf('=') + 1))\n break\n }\n}\noutput('<b>Remote Power On Failed</b><br>Vehicle Status >>> <br>' + results.join('<br>'), keyLine)\n",
"name": "Remote Power On Failed"
}
\ No newline at end of file
{
"levels": [],
"types": [],
"files": [],
"sources": [],
"keywords": "remote-power-on failed",
"code": "debug('开始分析')\nlet results = []\nlet keyLine = base\nfor(let i = base; i >=0; i--){\n let msg = logs[i].message\n let pos = msg.indexOf('power_gear') \n if (pos != -1){\n keyLine = i\n results.push('档位 : ' + msg.substring(msg.indexOf('=') + 1))\n break\n }\n}\noutput('<b>远程上电失败</b><br>车辆状态 >>> <br>' + results.join('<br>'), keyLine)\n",
"name": "远程上电失败"
}
\ No newline at end of file
......@@ -8,7 +8,7 @@ const mkdirp = require('mkdirp')
const glob = require('glob')
const rimraf = require('rimraf')
const express = require('express')
const { logger } = require('handlebars')
async function processLogDir(dirInput) {
let dirOutput = `${__dirname}/mnt/outputs`
if (!fs.existsSync(dirOutput)) {
......
......@@ -97,37 +97,37 @@
<body>
<div id='app' v-cloak>
<el-tabs v-model="activeTab" class="h-full mx-2 mt-2">
<el-tab-pane :label="`日志搜索 (${numFormat(filteredLogs.length)} )`" name="search" class="h-full">
<el-tab-pane :label="`Log Aggregator (${numFormat(filteredLogs.length)} lines)`" name="search" class="h-full">
<div>
<div>
<el-select v-model="logLevels" multiple clearable placeholder="级别" @change="search">
<el-select v-model="logLevels" multiple clearable placeholder="Level" @change="search">
<el-option v-for="item in levelOptions" :key="item.value" :label="item.label"
:value="item.value">
</el-option>
</el-select>
<el-select v-model="logTypes" multiple clearable placeholder="类型" @change="search">
<el-select v-model="logTypes" multiple clearable placeholder="Type" @change="search">
<el-option v-for="item in typeOptions" :key="item.value" :label="item.label"
:value="item.value">
</el-option>
</el-select>
<el-select v-model="logFiles" style="width: 250px;" filterable multiple clearable
placeholder="日志文件" collapse-tags @change="search">
placeholder="Log Files" collapse-tags @change="search">
<el-option v-for="item in logFileOptions" :key="item.value" :label="item.label"
:value="item.value">
</el-option>
</el-select>
<el-select v-model="logSources" style="width: 250px;" filterable multiple clearable
placeholder="源文件" collapse-tags @change="search">
placeholder="Source Files" collapse-tags @change="search">
<el-option v-for="item in sourceFileOptions" :key="item.value" :label="item.label"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="pt-2">
<el-input v-model="keywords" style="width: 915px;" placeholder="关键字或者正则表达式" @change='search'>
<el-input v-model="keywords" style="width: 915px;" placeholder="Keywords or RegExp" @change='search'>
</el-input>
</div>
......@@ -138,10 +138,10 @@
@click-item="onClickItem">
</virtual-list>
</el-tab-pane>
<el-tab-pane label="日志分析" name="analyze">
<el-tab-pane label="Smart Analyze" name="analyze">
<div class="p-2">
<div class="mb-2">
<el-button type="primary" @click="onAnalyzeLogs">分析日志</el-button>
<el-button type="primary" @click="onAnalyzeLogs">Start Analyzing</el-button>
</div>
<div v-for="item of analyzedResults" @click="openLogDetailsFor(item)"
class="border border-gray-500 hover:bg-gray-200 mb-1 p-2">
......@@ -154,15 +154,15 @@
</el-tab-pane>
</el-tabs>
<el-drawer title="日志上下文分析" :visible.sync="showLogDetails" size="50%">
<el-drawer title="Log Analyzer" :visible.sync="showLogDetails" size="50%">
<div class="p-2">
<el-input class="w-full" type="textarea" :rows="5" placeholder="请输入日志处理逻辑" v-model="code">
<el-input class="w-full" type="textarea" :rows="5" placeholder="Log Analyzer Code" v-model="code">
</el-input>
<el-button type="primary" round class="mt-2" @click="onExecute"><i class="el-icon-video-play"></i> 运行
<el-button type="primary" round class="mt-2" @click="onExecute"><i class="el-icon-video-play"></i> Run
</el-button>
<el-button type="primary" round plain class="mt-2" @click="onImport">导入</el-button>
<el-button type="primary" round plain class="mt-2" @click="onSave">保存</el-button>
<el-button type="primary" round plain class="mt-2" @click="onImport">Import</el-button>
<el-button type="primary" round plain class="mt-2" @click="onSave">Save</el-button>
</div>
<virtual-list ref="logDetailsContainer" id="log-details" class="list-details scroll-touch" :data-key="'id'"
:data-sources="contextLogs" :data-component="logDetailsComponent" :estimate-size="50"
......@@ -170,34 +170,34 @@
</virtual-list>
</el-drawer>
<el-dialog title="日志处理器导入" class="w-full" :visible.sync="dialogAnalyzerSelector">
<el-dialog title="Log Processor Import" class="w-full" :visible.sync="dialogAnalyzerSelector">
<el-row class="pb-2 text-sm">
选择日志分析器
<el-select v-model="selectedAnalyzerName" clearable placeholder="请选择日志分析器">
Choose a log analyze processor
<el-select v-model="selectedAnalyzerName" clearable placeholder="Choose a log analyze processor">
<el-option v-for="item in allAnalyzerNames" :key="item" :label="item" :value="item">
</el-option>
</el-select>
</el-row>
<el-row class="pb-2">
代码<br>
<el-input type="textarea" :rows="5" placeholder="请输入内容" v-model="selectedAnalyzer.code">
Code<br>
<el-input type="textarea" :rows="5" placeholder="Enter code" v-model="selectedAnalyzer.code">
</el-input>
</el-row>
<el-row class="pb-2 text-sm">
关键字:{{selectedAnalyzer.keywords}}
Keywords:{{selectedAnalyzer.keywords}}
</el-row>
<el-row class="pb-2 text-sm">
<el-col :span="12">级别: {{selectedAnalyzer.levels && selectedAnalyzer.levels.join(',')}}</el-col>
<el-col :span="12">类型: {{selectedAnalyzer.types && selectedAnalyzer.types.join(',')}}</el-col>
<el-col :span="12">Level: {{selectedAnalyzer.levels && selectedAnalyzer.levels.join(',')}}</el-col>
<el-col :span="12">Type: {{selectedAnalyzer.types && selectedAnalyzer.types.join(',')}}</el-col>
</el-row>
<el-row class="pb-2 text-sm">
<el-col :span="12">日志文件: {{selectedAnalyzer.files && selectedAnalyzer.files.join(',')}}</el-col>
<el-col :span="12">源文件: {{selectedAnalyzer.sources && selectedAnalyzer.sources.join(',')}}</el-col>
<el-col :span="12">Log Files: {{selectedAnalyzer.files && selectedAnalyzer.files.join(',')}}</el-col>
<el-col :span="12">Source Files: {{selectedAnalyzer.sources && selectedAnalyzer.sources.join(',')}}</el-col>
</el-row>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogAnalyzerSelector = false">取 消</el-button>
<el-button type="primary" @click="onImportCode">导入代码</el-button>
<el-button type="primary" @click="onImportCodeAndFilter">导入代码+搜索条件</el-button>
<el-button @click="dialogAnalyzerSelector = false">Cancel</el-button>
<el-button type="primary" @click="onImportCode">Import Code</el-button>
<el-button type="primary" @click="onImportCodeAndFilter">Import Code & Search Criteria</el-button>
</div>
</el-dialog>
</div>
......@@ -297,7 +297,7 @@
}
</script>
<script type="text/javascript">
const demoCode = `debug('开始分析')`
const demoCode = `debug('start')`
function numFormat(num) {
return num.toLocaleString('en-US')
}
......@@ -532,32 +532,32 @@
keywords: this.keywords,
code: this.code
}
this.$prompt('请输入日志分析器名称', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
this.$prompt('Please enter log analyzer name', 'Info', {
confirmButtonText: 'OK',
cancelButtonText: 'Cancel',
inputValue: this.lastAnalyzerName
}).then(async ({ value }) => {
try {
this.lastAnalyzerName = data.name = value
let res = await postJson('/analyzers', data)
if (res.$code == -1) {
this.$confirm(`日志分析器"${value}"已经存在, 是否覆盖?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
this.$confirm(`Log analyzer "${value}" is existed, overwrite it?`, 'Info', {
confirmButtonText: 'OK',
cancelButtonText: 'Cancel',
type: 'warning'
}).then(async () => {
data.overwritten = true
let res = await postJson('/analyzers', data)
this.$message({
type: 'success',
message: `日志分析器"${value}"保存成功!`
message: `Log analyzer "${value}" is saved!`
})
await this.reloadAnalyzers()
}).catch(() => { });
} else {
this.$message({
type: 'success',
message: `日志分析器"${value}"保存成功!`
message: `Log analyzer "${value}" is saved!`
})
await this.reloadAnalyzers()
}
......@@ -578,17 +578,17 @@
}
func(context)
console.log("Result", result)
let displayMessage = '没有输出结果'
let displayMessage = 'No output'
if (result) {
displayMessage = `${result.message}<hr>关键日志:<br><small>${result.log.message}</small><br><small>@${result.log.log_file}(${result.log.log_line})<hr> `
displayMessage = `${result.message}<hr>Key Log:<br><small>${result.log.message}</small><br><small>@${result.log.log_file}(${result.log.log_line})<hr> `
}
this.$alert(displayMessage, '日志分析结果', {
confirmButtonText: '确定',
this.$alert(displayMessage, 'Log Analyzes Result', {
confirmButtonText: 'OK',
dangerouslyUseHTMLString: true
}).catch(() => { })
//alert(result && result.message || '无日志分析结果!')
} catch (ex) {
console.log('执行错误', ex)
console.log('Execution failed', ex)
}
},
getContextLogs(item) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment