Skip to content

Commit fbc428b

Browse files
thoronwenThulinma
authored andcommitted
LSP: display of added log metadata (binary, pid, linenumber etc) and logs tab now uses logs module (and websocket)
1 parent e63fde0 commit fbc428b

4 files changed

Lines changed: 162 additions & 170 deletions

File tree

lsp/main.css

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1758,36 +1758,61 @@ section.processes table div.logs {
17581758
overflow: hidden auto;
17591759
font-size: 0.9em;
17601760
}
1761-
main[data-tab="Status"] section.logs > div.logs > * > *:not(:last-child):not(:empty),
1762-
main[data-tab="Preview"] section.logs > div.logs > * > *:not(:last-child):not(:empty),
1761+
/*main[data-tab="Status"] section.logs > div.logs > * > *:not(:last-child):not(:empty),
1762+
main[data-tab="Preview"] section.logs > div.logs > * > *:not(:last-child):not(:empty),*/
17631763
main[data-tab="Status"] section.accesslogs > div.accesslogs > * > *:not(:last-child):not(:empty),
17641764
main[data-tab="Preview"] section.accesslogs > div.accesslogs > * > *:not(:last-child):not(:empty) {
17651765
padding-right: 0.5em;
17661766
}
1767-
main[data-tab="Status"] section.logs > div.logs > * > *:nth-child(2):not(:empty):before,
1768-
main[data-tab="Preview"] section.logs > div.logs > * > *:nth-child(2):not(:empty):before {
1769-
content: '[';
1770-
opacity: 0.5;
1767+
div.logs .message:not([data-debuglevel="FAIL"]) :is(.debuglevel,.message) {
1768+
color: var(--highlightedColor);
17711769
}
1772-
main[data-tab="Status"] section.logs > div.logs > * > *:nth-child(2):not(:empty):after,
1773-
main[data-tab="Preview"] section.logs > div.logs > * > *:nth-child(2):not(:empty):after {
1774-
content: ']';
1775-
opacity: 0.5;
1770+
div.logs .message :is(.time,.binary,.pid) {
1771+
color: var(--secondaryTextColor);
17761772
}
1777-
div.logs > [data-debuglevel="WARN"],
1778-
div.logs > [data-debuglevel="ERROR"],
1779-
div.logs > [data-debuglevel="FAIL"] {
1773+
div.logs .message:is([data-debuglevel="WARN"],[data-debuglevel="ERROR"],[data-debuglevel="FAIL"]) :is(.debuglevel,.message) {
17801774
font-weight: bold;
1775+
}
1776+
div.logs .message[data-debuglevel="WARN"] :is(.debuglevel,.message) {
17811777
color: darkorange;
17821778
}
1783-
div.logs > [data-debuglevel="ERROR"] {
1779+
div.logs .message[data-debuglevel="ERROR"] :is(.debuglevel,.message) {
17841780
color: var(--red);
17851781
}
1786-
div.logs > [data-debuglevel="FAIL"] > * {
1782+
div.logs .message[data-debuglevel="FAIL"] > * {
17871783
color: white;
17881784
background: var(--red);
17891785
outline: 2px solid var(--red);
17901786
}
1787+
div.logs .message .copy_but_hide { position: absolute; opacity: 0; pointer-events: none; }
1788+
section.logs { position: relative; }
1789+
section.logs button.down {
1790+
position: absolute;
1791+
right: 1em;
1792+
bottom: 1em;
1793+
opacity: 0.8;
1794+
}
1795+
section.logs:has(.logs[data-scrolling="true"]) button.down {
1796+
display: none;
1797+
}
1798+
1799+
main[data-tab="Logs"] {
1800+
max-height: 100%;
1801+
overflow: hidden;
1802+
min-height: 30em;
1803+
flex-shrink: 1;
1804+
display: grid;
1805+
grid-template-columns: 100%;
1806+
grid-template-rows: auto auto 1fr;
1807+
}
1808+
main[data-tab="Logs"] .buttons { text-align: right; }
1809+
main[data-tab="Logs"] section.logs { display: contents; }
1810+
main[data-tab="Logs"] section.logs > div.logs {
1811+
max-height: 100%;
1812+
overflow: auto;
1813+
}
1814+
main[data-tab="Logs"] .buttons button:after { content: ' (for saving and copying)'; }
1815+
17911816
main[data-tab="Status"] div.accesslogs > * > *[title],
17921817
main[data-tab="Preview"] div.accesslogs > * > *[title] {
17931818
overflow: hidden;

lsp/minified.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lsp/mist.js

Lines changed: 121 additions & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -8135,104 +8135,16 @@ context_menu: function(){
81358135
$('[name=triggeron]').trigger('change');
81368136

81378137
break;
8138-
case 'Logs':
8139-
var $refreshbutton = $('<button>').text('Refresh now').click(function(){
8140-
$(this).text('Loading..');
8141-
mist.send(function(){
8142-
buildLogsTable();
8143-
$refreshbutton.text('Refresh now');
8144-
});
8145-
}).css('padding','0.2em 0.5em').css('flex-grow',0);
8146-
8147-
$main.append(UI.buildUI([{
8148-
type: 'help',
8149-
help: 'Here you have an overview of all edited settings within MistServer and possible warnings or errors MistServer has encountered. MistServer stores up to 100 logs at a time.'
8150-
},{
8151-
label: 'Refresh every',
8152-
type: 'select',
8153-
select: [
8154-
[10,'10 seconds'],
8155-
[30,'30 seconds'],
8156-
[60,'minute'],
8157-
[300,'5 minutes']
8158-
],
8159-
value: 30,
8160-
'function': function(){
8161-
UI.interval.clear();
8162-
UI.interval.set(function(){
8163-
mist.send(function(){
8164-
buildLogsTable();
8165-
});
8166-
},$(this).val()*1e3);
8167-
},
8168-
help: 'How often the table below should be updated.'
8169-
},{
8170-
label: '..or',
8171-
type: 'DOMfield',
8172-
DOMfield: $refreshbutton,
8173-
help: 'Instantly refresh the table below.'
8174-
}]));
8175-
8176-
$main.append(
8177-
$('<button>').text('Purge logs').click(function(){
8178-
mist.send(function(){
8179-
mist.data.log = [];
8180-
UI.navto('Logs');
8181-
},{clearstatlogs:true});
8182-
})
8183-
);
8184-
var $tbody = $('<tbody>').css('font-size','0.9em');
8185-
$main.append(
8186-
$('<table>').addClass('logs').append($tbody)
8187-
);
8188-
8189-
function color(string){
8190-
var $s = $('<span>').text(string);
8191-
switch (string) {
8192-
case 'WARN':
8193-
$s.addClass('orange');
8194-
break;
8195-
case 'ERROR':
8196-
case 'FAIL':
8197-
$s.addClass('red');
8198-
break;
8199-
}
8200-
return $s;
8201-
}
8202-
function buildLogsTable(){
8203-
var logs = mist.data.log;
8204-
if (!logs) { return; }
8205-
8206-
if ((logs.length >= 2) && (logs[0][0] < logs[logs.length-1][0])){
8207-
logs.reverse();
8208-
}
8209-
8210-
$tbody.html('');
8211-
for (var index in logs) {
8212-
var $content = $('<span>').addClass('content');
8213-
if ((logs[index].length >= 4) && (logs[index][3] != "")) $content.append($("<span>").text("["+logs[index][3]+"] "));
8214-
var split = logs[index][2].split('|');
8215-
for (var i in split) {
8216-
$content.append(
8217-
$('<span>').text(split[i])
8218-
);
8219-
}
8220-
8221-
8222-
$tbody.append(
8223-
$('<tr>').html(
8224-
$('<td>').text(UI.format.dateTime(logs[index][0],'long')).css('white-space','nowrap')
8225-
).append(
8226-
$('<td>').html(color(logs[index][1])).css('text-:align','center')
8227-
).append(
8228-
$('<td>').html($content).css('text-align','left')
8229-
)
8230-
);
8231-
}
8232-
}
8233-
buildLogsTable();
8234-
8138+
case 'Logs': {
8139+
let $buttons = $("<div>").addClass("buttons");
8140+
let $logs = UI.modules.logs();
8141+
$buttons.append($logs.find("> button").first());
8142+
$logs.find("> h3").remove();
8143+
8144+
$main.append($buttons).append($logs);
8145+
82358146
break;
8147+
}
82368148
case 'Statistics':
82378149
var $UI = $('<span>').text('Loading..');
82388150
$main.append($UI);
@@ -10250,62 +10162,7 @@ context_menu: function(){
1025010162
});
1025110163
},
1025210164
logs: function(streamname){
10253-
var $logs = $("<div>").attr("onempty","None.").addClass("logs");
10254-
10255-
var tab = false;
10256-
10257-
UI.sockets.ws.active_streams.subscribe(function(type,data){
10258-
if (type == "log") {
10259-
var scroll = ($logs[0].scrollTop >= $logs[0].scrollHeight - $logs[0].clientHeight); //scroll to bottom unless scrolled elsewhere
10260-
10261-
if (data[3] != "" && data[3] != streamname.split("+")[0]) { //filter out messages about other streams
10262-
return;
10263-
}
10264-
if (data[1] == "ACCS") { return; } //the access log has its own container
10265-
10266-
var $msg = $("<div>").attr("data-debuglevel",data[1]).html(
10267-
$("<span>").addClass("description").text(UI.format.dateTime(data[0]))
10268-
).append(
10269-
$("<span>").text(data[3]) //stream, if any
10270-
).append(
10271-
$("<span>").text(data[1]+":") //debug level
10272-
).append(
10273-
$("<span>").text(data[2]) //message
10274-
);
10275-
$logs.append($msg);
10276-
10277-
if (scroll) $logs[0].scrollTop = $logs[0].scrollHeight;
10278-
10279-
if (tab) {
10280-
try {
10281-
var scroll = (tab.document.scrollingElement.scrollTop >= tab.document.scrollingElement.scrollHeight - tab.document.scrollingElement.clientHeight);
10282-
tab.document.write($msg[0].outerHTML);
10283-
if (scroll) tab.document.scrollingElement.scrollTop = tab.document.scrollingElement.scrollHeight;
10284-
}
10285-
catch (e) {}
10286-
}
10287-
10288-
}
10289-
else if (type == "error") {
10290-
var $msg = $("<div>").text(data);
10291-
$logs.append($msg);
10292-
}
10293-
});
10294-
10295-
return $("<section>").addClass("logs").append(
10296-
$("<h3>").text("MistServer logs")
10297-
).append(
10298-
$("<button>").text("Open raw").click(function(){
10299-
tab = window.open("", "MistServer logs for "+streamname);
10300-
tab.document.write(
10301-
"<html><head><title>MistServer logs for '"+streamname+"'</title><meta http-equiv=\"content-type\" content=\"application/json; charset=utf-8\"><style>body{padding-left:2em;text-indent:-2em;}body>*>*:not(:last-child):not(:empty){padding-right:.5em;}.description{font-size:.9em;color:#777}</style></head><body>"
10302-
);
10303-
tab.document.write($logs[0].innerHTML);
10304-
tab.document.scrollingElement.scrollTop = tab.document.scrollingElement.scrollHeight;
10305-
})
10306-
).append(
10307-
$logs
10308-
);
10165+
return UI.modules.logs(streamname);
1030910166
},
1031010167
accesslogs: function(streamname){
1031110168
var $accesslogs = $("<div>").attr("onempty","None.").addClass("accesslogs");
@@ -11378,6 +11235,117 @@ context_menu: function(){
1137811235
)
1137911236
}
1138011237
},
11238+
logs: function(streamname){
11239+
var scroll = true;
11240+
var $logs = $("<div>").attr("onempty","None.").attr("data-scrolling",scroll).addClass("logs").on("scroll",function(){
11241+
//scroll to bottom unless scrolled elsewhere
11242+
if (this.scrollTop + this.clientHeight >= this.scrollHeight - 5) {
11243+
scroll = true;
11244+
}
11245+
else {
11246+
scroll = false;
11247+
}
11248+
$logs.attr("data-scrolling",scroll);
11249+
});
11250+
11251+
var tab = false;
11252+
11253+
UI.sockets.ws.active_streams.subscribe(function(type,data){
11254+
if (type == "log") {
11255+
if (streamname && (data[3] != "") && (data[3] != streamname.split("+")[0])) { //filter out messages about other streams
11256+
return;
11257+
}
11258+
if (data[1] == "ACCS") { return; } //the access log has its own container
11259+
11260+
var $msg = $("<div>").addClass("message").attr("data-debuglevel",data[1]).html(
11261+
$("<span>").addClass("time").html(
11262+
$("<span>").append(
11263+
$("<span>").addClass("description").text("[")
11264+
).append(
11265+
$("<span>").text(UI.format.dateTime(data[0]))
11266+
).append(
11267+
$("<span>").addClass("description").text("] ")
11268+
).children()
11269+
)
11270+
).append(
11271+
$("<span>").addClass("binary").attr("title","binary name").text(data[5])
11272+
).append(
11273+
$("<span>").addClass("stream").attr("title","stream name").html(
11274+
data[3] ? $("<span>").append(
11275+
$("<span>").addClass("description").text(":")
11276+
).append(
11277+
$("<span>").text(data[3])
11278+
).children() : ""
11279+
)
11280+
).append(
11281+
$("<span>").addClass("pid").attr("title","pid").html(
11282+
data[4] ? $("<span>").append(
11283+
$("<span>").addClass("description").text(" (")
11284+
).append(
11285+
$("<span>").text(data[4])
11286+
).append(
11287+
$("<span>").addClass("description").text(")")
11288+
).children() : ""
11289+
)
11290+
).append(
11291+
$("<span>").addClass("debuglevel").attr("title","debug level").html(
11292+
$("<span>").append(
11293+
$("<span>").addClass("description").text(" [")
11294+
).append(
11295+
$("<span>").text(data[1])
11296+
).append(
11297+
$("<span>").addClass("description").text("]")
11298+
).children()
11299+
)
11300+
).append(
11301+
$("<span>").addClass("message").text(" "+data[2])
11302+
).append(
11303+
$("<span>").addClass("line").addClass("copy_but_hide").attr("title","line number").html(data[6] ? "&nbsp;("+data[6]+")" : "")
11304+
);
11305+
$logs.append($msg);
11306+
11307+
if ($logs.children().length > 1000) {
11308+
$logs.children().first().remove();
11309+
}
11310+
11311+
if (scroll) $logs[0].scrollTop = $logs[0].scrollHeight;
11312+
11313+
if (tab) {
11314+
try {
11315+
let s = (tab.document.scrollingElement.scrollTop >= tab.document.scrollingElement.scrollHeight - tab.document.scrollingElement.clientHeight);
11316+
tab.document.write($msg[0].outerHTML);
11317+
if (s) tab.document.scrollingElement.scrollTop = tab.document.scrollingElement.scrollHeight;
11318+
}
11319+
catch (e) {}
11320+
}
11321+
11322+
}
11323+
else if (type == "error") {
11324+
var $msg = $("<div>").text(data);
11325+
$logs.append($msg);
11326+
}
11327+
});
11328+
11329+
return $("<section>").addClass("logs").append(
11330+
$("<h3>").text("MistServer logs")
11331+
).append(
11332+
$("<button>").text("Open raw").click(function(){
11333+
tab = window.open("", "MistServer logs"+(streamname ? " for "+streamname : ""));
11334+
tab.document.write(
11335+
"<html><head><title>MistServer logs"+(streamname ? " for '"+streamname+"'" : "")+"</title><meta http-equiv=\"content-type\" content=\"application/json; charset=utf-8\"><style>body{padding-left:2em;text-indent:-2em;font-family:monospace}.description,.message :is(.time,.binary,.pid,.line){font-size:.9em;color:#777}.message:is([data-debuglevel=\"WARN\"],[data-debuglevel=\"ERROR\"],[data-debuglevel=\"FAIL\"]){font-weight:bold;}</style></head><body>"
11336+
);
11337+
tab.document.write($logs[0].innerHTML);
11338+
tab.document.scrollingElement.scrollTop = tab.document.scrollingElement.scrollHeight;
11339+
})
11340+
).append(
11341+
$logs
11342+
).append(
11343+
$("<button>").addClass("down").attr("data-icon","down").attr("title","Snap to bottom").click(function(){
11344+
scroll = true;
11345+
$logs[0].scrollTop = $logs[0].scrollHeight;
11346+
})
11347+
);
11348+
},
1138111349
pushes: function(options){
1138211350
if (!options) {
1138311351
options = {};

src/controller/controller_api.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,6 @@ void APIConn::log(uint64_t time, const std::string & kind, const std::string & m
272272
tmp[1u].append(progPid);
273273
tmp[1u].append(exe);
274274
tmp[1u].append(line);
275-
if (progPid) { tmp[1u].append(progPid); }
276275
W->sendFrame(tmp.toString());
277276
}
278277

0 commit comments

Comments
 (0)