refactor log writer for ui

merge-requests/521/merge^2
Moe 2024-10-10 12:05:40 -07:00
parent 73da4e0823
commit 8aa8943244
10 changed files with 131 additions and 56 deletions

View File

@ -222,6 +222,7 @@
"Full URL Path": "Full URL Path", "Full URL Path": "Full URL Path",
"Streamed Logs": "Streamed Logs", "Streamed Logs": "Streamed Logs",
"Saved Logs": "Saved Logs", "Saved Logs": "Saved Logs",
"User Logs": "User Logs",
"Logs": "Logs", "Logs": "Logs",
"Full Stream URL": "Full Stream URL", "Full Stream URL": "Full Stream URL",
"Manual": "Manual", "Manual": "Manual",

View File

@ -214,6 +214,7 @@ body {
} }
.text-white-50 { color: rgba(255, 255, 255, .5); } .text-white-50 { color: rgba(255, 255, 255, .5); }
.text-yellow { color: yellow; }
.bg-purple { background-color: #6f42c1; } .bg-purple { background-color: #6f42c1; }
.bg-darker { background-color: #121417; } .bg-darker { background-color: #121417; }

View File

@ -86,17 +86,20 @@ $(document).ready(function(){
var el = $(this) var el = $(this)
var targetElement = el.attr('data-target') var targetElement = el.attr('data-target')
var classToToggle = el.attr('class_toggle') var classToToggle = el.attr('class_toggle')
var iconClassesToToggle = el.attr('icon-toggle').split(' ') var iconClassesToToggle = el.attr('icon-toggle')
var iconTarget = el.attr('icon-child')
var iconTargetElement = el.find(el.attr('icon-child'))
var togglPosition = $(targetElement).hasClass(classToToggle) ? 0 : 1 var togglPosition = $(targetElement).hasClass(classToToggle) ? 0 : 1
var classToggles = dashboardOptions().class_toggle || {} var classToggles = dashboardOptions().class_toggle || {}
classToggles[targetElement] = [classToToggle,togglPosition,iconClassesToToggle,iconTarget]; classToggles[targetElement] = [classToToggle,togglPosition,iconClassesToToggle,iconTarget];
dashboardOptions('class_toggle',classToggles) dashboardOptions('class_toggle',classToggles)
$(targetElement).toggleClass(classToToggle) $(targetElement).toggleClass(classToToggle)
if(iconClassesToToggle){
iconClassesToToggle = iconClassesToToggle.split(' ')
var iconTarget = el.attr('icon-child')
var iconTargetElement = el.find(el.attr('icon-child'))
iconTargetElement iconTargetElement
.removeClass(iconClassesToToggle[togglPosition === 1 ? 0 : 1]) .removeClass(iconClassesToToggle[togglPosition === 1 ? 0 : 1])
.addClass(iconClassesToToggle[togglPosition]) .addClass(iconClassesToToggle[togglPosition])
}
}) })
.on('keyup','.search-parent .search-controller',function(){ .on('keyup','.search-parent .search-controller',function(){
var _this = this; var _this = this;

View File

@ -834,6 +834,15 @@ function shakeLogWriterIcon(){
logWriterIconIndicator.removeClass('animate-shake') logWriterIconIndicator.removeClass('animate-shake')
},3000) },3000)
} }
function shakeLogWriterMonitorIcon(monitorId){
if(logStreamWiggling[monitorId])return;
var theWiggler = logStreamWiggler[monitorId];
theWiggler.addClass('animate-shake text-yellow')
logStreamWiggling[monitorId] = setTimeout(function(){
logStreamWiggling[monitorId] = null;
theWiggler.removeClass('animate-shake text-yellow')
},3000)
}
var logWriterFloodTimeout = null var logWriterFloodTimeout = null
var logWriterFloodCounter = 0 var logWriterFloodCounter = 0
var logWriterFloodLock = null var logWriterFloodLock = null
@ -854,23 +863,20 @@ function buildLogRow(v){
</div>` </div>`
return html return html
} }
function logWriterDraw(id,data){
// if(logWriterFloodLock)return debugLog('logWriterFloodLock : Log was dropped'); function removeLogRows(logElements){
var elementTags = '#global-log-stream,'+id+'.monitor_item .logs:visible,'+id+'#tab-monitorSettings:visible .logs' logElements.each(function(n,v){
// if(logWriterFloodTimeout){ var theRows = logElements.find('.log-item')
// ++logWriterFloodCounter if(theRows.length > 10){
// } theRows.last().remove()
// if(logWriterFloodCounter > 10){ }
// window.logWriterFloodLock = setTimeout(function(){ })
// delete(logWriterFloodLock) }
// },10000)
// } function logWriterDraw(monitorId,data){
// clearTimeout(logWriterFloodTimeout)
// logWriterFloodTimeout = setTimeout(function(){
// delete(logWriterFloodTimeout)
// logWriterFloodCounter = 0
// },2000)
if(!data.time)data.time = formattedTime(); if(!data.time)data.time = formattedTime();
var isUserLog = monitorId === '$USER'
var logElement = isUserLog ? logStreams['_USER'] : logStreams[monitorId];
var html = buildLogRow({ var html = buildLogRow({
ke: data.ke, ke: data.ke,
mid: data.mid, mid: data.mid,
@ -878,13 +884,18 @@ function logWriterDraw(id,data){
time: data.time, time: data.time,
}) })
shakeLogWriterIcon() shakeLogWriterIcon()
$(elementTags).prepend(html).each(function(n,v){ try{
var el = $(v); shakeLogWriterMonitorIcon(isUserLog ? '_USER' : monitorId)
var theRows = el.find('.log-item') logElement.prepend(html)
if(theRows.length > 10){ removeLogRows(logElement)
theRows.last().remove() if(tabTree.name === 'monitorSettings' && monitorEditorSelectedMonitor.mid === monitorId){
monitorLogStreamElement.prepend(html)
removeLogRows(monitorLogStreamElement)
}
logStreamLastTimeEl[monitorId].text(formattedTime(new Date(), true))
}catch(err){
console.log(`Failed Log Write`, data)
} }
})
} }
function setSwitchUIState(systemSwitch,toggleState){ function setSwitchUIState(systemSwitch,toggleState){

View File

@ -445,7 +445,7 @@ function signalCheckLiveStream(options){
var streamType = subStreamChannel ? monitorDetails.substream ? monitorDetails.substream.output.stream_type : 'hls' : monitorDetails.stream_type var streamType = subStreamChannel ? monitorDetails.substream ? monitorDetails.substream.output.stream_type : 'hls' : monitorDetails.stream_type
function failedStreamCheck(){ function failedStreamCheck(){
if(monitorConfig.signal_check_log == 1){ if(monitorConfig.signal_check_log == 1){
logWriterDraw('[mid="'+monitorId+'"]',{ logWriterDraw(monitorId, {
log: { log: {
type: 'Stream Check', type: 'Stream Check',
msg: lang.clientStreamFailedattemptingReconnect msg: lang.clientStreamFailedattemptingReconnect
@ -456,7 +456,7 @@ function signalCheckLiveStream(options){
} }
function succeededStreamCheck(){ function succeededStreamCheck(){
if(monitorConfig.signal_check_log == 1){ if(monitorConfig.signal_check_log == 1){
logWriterDraw('[mid="'+monitorId+'"]',{ logWriterDraw(monitorId, {
log: { log: {
type: 'Stream Check', type: 'Stream Check',
msg : lang.Success msg : lang.Success

View File

@ -852,7 +852,7 @@ function signalCheckLiveStream(options){
var streamType = subStreamChannel ? monitorDetails.substream ? monitorDetails.substream.output.stream_type : 'hls' : monitorDetails.stream_type var streamType = subStreamChannel ? monitorDetails.substream ? monitorDetails.substream.output.stream_type : 'hls' : monitorDetails.stream_type
function failedStreamCheck(){ function failedStreamCheck(){
if(monitorConfig.signal_check_log == 1){ if(monitorConfig.signal_check_log == 1){
logWriterDraw('[mid="'+monitorId+'"]',{ logWriterDraw(monitorId, {
log: { log: {
type: 'Stream Check', type: 'Stream Check',
msg: lang.clientStreamFailedattemptingReconnect msg: lang.clientStreamFailedattemptingReconnect
@ -863,7 +863,7 @@ function signalCheckLiveStream(options){
} }
function succeededStreamCheck(){ function succeededStreamCheck(){
if(monitorConfig.signal_check_log == 1){ if(monitorConfig.signal_check_log == 1){
logWriterDraw('[mid="'+monitorId+'"]',{ logWriterDraw(monitorId, {
log: { log: {
type: 'Stream Check', type: 'Stream Check',
msg : lang.Success msg : lang.Success

View File

@ -1,28 +1,49 @@
var logStreams = {}
var logStreamWiggler = {}
var logStreamWiggling = {}
var logStreamLastTimeEl = {}
var monitorLogStreamElement = $(`#tab-monitorSettings .logs`);
$(document).ready(function(e){ $(document).ready(function(e){
var theWindow = $('#tab-logViewer') var theWindow = $('#tab-logViewer')
var logTypeSelector = $('#log_monitors') var logTypeSelector = $('#log_monitors')
var dateSelector = $('#logs_daterange') var dateSelector = $('#logs_daterange')
var savedLogRows = $('#saved-logs-rows') var savedLogRows = $('#saved-logs-rows')
var globalLogStream = $('#global-log-stream')
var theForm = theWindow.find('form') var theForm = theWindow.find('form')
var logViewerDataInMemory = {} var logViewerDataInMemory = {}
//log viewer //log viewer
loadDateRangePicker(dateSelector,{ function setLogStreamElements(monitorId){
onChange: function(start, end, label) { logStreams[monitorId] = $(`.logViewerStream[data-mid="${monitorId}"],.monitor_item[data-mid="${monitorId}"] .logs:visible`)
drawLogRows() logStreamWiggler[monitorId] = $(`#logViewerStreamContainer_${monitorId} .fa-exclamation-triangle`)
logStreamLastTimeEl[monitorId] = $(`#logViewerStreamContainer_${monitorId} .lastlogtime`)
} }
function drawMonitorContainer(monitor){
var groupKey = monitor.ke
var monitorId = monitor.mid
var notExist = $(`#logViewerStreamContainer_${monitorId}`).length === 0;
if(notExist){
var dataTarget = `.logViewerStream[data-mid='${monitorId}']`
var classToggle = (dashboardOptions().class_toggle || {})[dataTarget] || []
var html = `<div id="logViewerStreamContainer_${monitorId}" class="card ${definitions.Theme.isDark ? 'btn-default' : ''} mb-3">
<div id="logViewerStreamHeader_${monitorId}" class_toggle="d-none" data-target="${dataTarget}" class="card-header cursor-pointer d-flex">
<div class="col">
<i class="fa fa-exclamation-triangle"></i> &nbsp; ${monitor.name} <small>(${monitor.mid})</small>
</div>
<div class="lastlogtime col text-end"></div>
</div>
<div data-mid="${monitorId}" data-ke="${groupKey}" class="logViewerStream card-body ${classToggle[1] === 1 ? 'd-none' : ''}"></div>
</div>`
globalLogStream.append(html);
setLogStreamElements(monitorId)
}
}
function drawMonitorContainers(){
globalLogStream.empty()
drawMonitorContainer({ mid: '_USER', ke: $user.ke, name: lang['User Logs'] })
$.each(loadedMonitors,function(n,monitor){
drawMonitorContainer(monitor)
}) })
addOnTabOpen('logViewer',function(){ }
logTypeSelector.find('optgroup option').remove()
var html = ''
$.each(loadedMonitors,function(n,v){
html += createOptionHtml({
value: v.mid,
label: v.name,
})
})
logTypeSelector.find('optgroup').html(html)
drawLogRows()
})
function drawLogRows(){ function drawLogRows(){
var html = '' var html = ''
var selectedLogType = logTypeSelector.val() var selectedLogType = logTypeSelector.val()
@ -62,4 +83,38 @@ $(document).ready(function(e){
downloadJSON(logViewerDataInMemory,'Shinobi_Logs_'+(new Date())+'.json') downloadJSON(logViewerDataInMemory,'Shinobi_Logs_'+(new Date())+'.json')
return false; return false;
}) })
loadDateRangePicker(dateSelector,{
onChange: function(start, end, label) {
drawLogRows()
}
})
addOnTabOpen('logViewer',function(){
logTypeSelector.find('optgroup option').remove()
var html = ''
$.each(loadedMonitors,function(n,v){
html += createOptionHtml({
value: v.mid,
label: v.name,
})
})
logTypeSelector.find('optgroup').html(html)
drawLogRows()
})
drawMonitorContainers()
onDashboardReady(function(){
drawMonitorContainers()
})
onWebSocketEvent(function (d){
switch(d.f){
case'monitor_edit':
drawMonitorContainer(d.mon)
break;
case'monitor_watch_on':
setLogStreamElements(d.id || d.mid)
break;
case'monitor_watch_off':case'monitor_stopping':
setLogStreamElements(d.id || d.mid)
break;
}
})
}) })

View File

@ -971,7 +971,7 @@ var showInputMappingFields = function(showMaps){
function setFieldVisibilityNewWay(){ function setFieldVisibilityNewWay(){
var validation = getMonitorEditFormFields() var validation = getMonitorEditFormFields()
if(!validation.ok){ if(!validation.ok){
return console.log('Failed setFieldVisibilityNewWay',new Error(),validation) return console.log('Failed setFieldVisibilityNewWay', validation)
} }
var monitorConfig = validation.monitorConfig var monitorConfig = validation.monitorConfig
var monitorDetails = safeJsonParse(monitorConfig.details) var monitorDetails = safeJsonParse(monitorConfig.details)

View File

@ -679,6 +679,7 @@ function redAlertNotify(options) {
hide: options.hide === undefined ? false : options.hide, hide: options.hide === undefined ? false : options.hide,
delay: options.delay || 30000 delay: options.delay || 30000
}; };
try{
if (redAlertNotice) { if (redAlertNotice) {
redAlertNotice.update(notifyOptions); redAlertNotice.update(notifyOptions);
} else { } else {
@ -687,6 +688,9 @@ function redAlertNotify(options) {
redAlertNotices[title] = null; redAlertNotices[title] = null;
}); });
} }
}catch(err){
console.error('redAlertNotify ERROR',err)
}
} }
function buildPosePoints(bodyParts, x, y){ function buildPosePoints(bodyParts, x, y){
let theArray = [] let theArray = []

View File

@ -164,7 +164,7 @@ onWebSocketEvent(function (d){
} }
break; break;
case'log': case'log':
logWriterDraw('[data-mid="'+d.mid+'"][data-ke="'+d.ke+'"]',d) logWriterDraw(d.mid, d)
break; break;
case'os'://indicator case'os'://indicator
//cpu //cpu