diff --git a/interface/src/project/EMSESPDashboard.tsx b/interface/src/project/EMSESPDashboard.tsx index 55a396085..b567aa79f 100644 --- a/interface/src/project/EMSESPDashboard.tsx +++ b/interface/src/project/EMSESPDashboard.tsx @@ -24,7 +24,10 @@ class EMSESP extends Component { onChange={(e, path) => this.handleTabChange(path)} variant="fullWidth" > - + diff --git a/interface/src/project/EMSESPDevicesController.tsx b/interface/src/project/EMSESPDevicesController.tsx index 6b958f722..7300a5a48 100644 --- a/interface/src/project/EMSESPDevicesController.tsx +++ b/interface/src/project/EMSESPDevicesController.tsx @@ -22,7 +22,7 @@ class EMSESPDevicesController extends Component { render() { return ( - + } diff --git a/interface/src/system/LogEventConsole.tsx b/interface/src/system/LogEventConsole.tsx index 6ad675c4e..7c945134c 100644 --- a/interface/src/system/LogEventConsole.tsx +++ b/interface/src/system/LogEventConsole.tsx @@ -108,12 +108,10 @@ const LogEventConsole: FC = (props) => { {events.map((e) => (
- {e.time} - - {paddedLevelLabel(e.level)}{' '} - - {paddedNameLabel(e.name)} - {e.message} + {e.t} + {paddedLevelLabel(e.l)} + {paddedNameLabel(e.n)} + {e.m}
))}
diff --git a/interface/src/system/LogEventController.tsx b/interface/src/system/LogEventController.tsx index 9782762d4..4cf78a70a 100644 --- a/interface/src/system/LogEventController.tsx +++ b/interface/src/system/LogEventController.tsx @@ -22,6 +22,9 @@ import LogEventConsole from './LogEventConsole'; import { LogEvent, LogSettings } from './types'; +import { Decoder } from '@msgpack/msgpack'; +const decoder = new Decoder(); + interface LogEventControllerState { eventSource?: EventSource; events: LogEvent[]; @@ -71,12 +74,13 @@ class LogEventController extends Component< fetch(FETCH_LOG_ENDPOINT) .then((response) => { if (response.status === 200) { - return response.json(); + return response.arrayBuffer(); } else { throw Error('Unexpected status code: ' + response.status); } }) - .then((json) => { + .then((arrayBuffer) => { + const json: any = decoder.decode(arrayBuffer); this.setState({ events: json.events }); }) .catch((error) => { diff --git a/interface/src/system/LogEventForm.tsx b/interface/src/system/LogEventForm.tsx index e266788c2..5518c81e2 100644 --- a/interface/src/system/LogEventForm.tsx +++ b/interface/src/system/LogEventForm.tsx @@ -5,6 +5,8 @@ import { SelectValidator } from 'react-material-ui-form-validator'; +import { Typography } from '@material-ui/core'; + import MenuItem from '@material-ui/core/MenuItem'; import { @@ -79,6 +81,9 @@ class LogEventForm extends Component { DEBUG TRACE + + Only the last {data.max_messages} messages are shown + ); } diff --git a/interface/src/system/types.ts b/interface/src/system/types.ts index ea0a446df..0f236c1f8 100644 --- a/interface/src/system/types.ts +++ b/interface/src/system/types.ts @@ -47,12 +47,13 @@ export enum LogLevel { } export interface LogEvent { - time: string; - level: LogLevel; - name: string; - message: string; + t: string; + l: LogLevel; + n: string; + m: string; } export interface LogSettings { level: LogLevel; + max_messages: number; } diff --git a/mock-api/server.js b/mock-api/server.js index 634f07686..d15d30fc5 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -18,46 +18,47 @@ const ES_ENDPOINT_ROOT = '/es/' const LOG_SETTINGS_ENDPOINT = REST_ENDPOINT_ROOT + 'logSettings' const log_settings = { level: 6, + max_messages: 25, } const FETCH_LOG_ENDPOINT = REST_ENDPOINT_ROOT + 'fetchLog' const fetch_log = { events: [ { - time: '000+00:00:00.001', - level: 3, - name: 'system', - message: 'this is message 3', + t: '000+00:00:00.001', + l: 3, + n: 'system', + m: 'this is message 3', }, { - time: '000+00:00:00.002', - level: 4, - name: 'system', - message: 'this is message 4', + t: '000+00:00:00.002', + l: 4, + n: 'system', + m: 'this is message 4', }, { - time: '000+00:00:00.002', - level: 5, - name: 'system', - message: 'this is message 5', + t: '000+00:00:00.002', + l: 5, + n: 'system', + m: 'this is message 5', }, { - time: '000+00:00:00.002', - level: 6, - name: 'system', - message: 'this is message 6', + t: '000+00:00:00.002', + l: 6, + n: 'system', + m: 'this is message 6', }, { - time: '000+00:00:00.002', - level: 7, - name: 'emsesp', - message: 'this is message 7', + t: '000+00:00:00.002', + l: 7, + n: 'emsesp', + m: 'this is message 7', }, { - time: '000+00:00:00.002', - level: 8, - name: 'mqtt', - message: 'this is message 8', + t: '000+00:00:00.002', + l: 8, + n: 'mqtt', + m: 'this is message 8', }, ], } @@ -753,7 +754,9 @@ const emsesp_devicedata_3 = { // LOG app.get(FETCH_LOG_ENDPOINT, (req, res) => { - res.json(fetch_log) + const encoded = msgpack.encode(fetch_log) + res.write(encoded, 'binary') + res.end(null, 'binary') }) app.get(LOG_SETTINGS_ENDPOINT, (req, res) => { res.json(log_settings) diff --git a/src/web/WebLogService.cpp b/src/web/WebLogService.cpp index 5d1c534a5..d80b11d1b 100644 --- a/src/web/WebLogService.cpp +++ b/src/web/WebLogService.cpp @@ -33,6 +33,7 @@ WebLogService::WebLogService(AsyncWebServer * server, SecurityManager * security // for bring back the whole log server->on(FETCH_LOG_PATH, HTTP_GET, std::bind(&WebLogService::fetchLog, this, _1)); + // get when page is loaded server->on(LOG_SETTINGS_PATH, HTTP_GET, std::bind(&WebLogService::getLevel, this, _1)); // for setting a level @@ -104,10 +105,10 @@ void WebLogService::loop() { void WebLogService::transmit(const QueuedLogMessage & message) { DynamicJsonDocument jsonDocument = DynamicJsonDocument(EMSESP_JSON_SIZE_SMALL); JsonObject logEvent = jsonDocument.to(); - logEvent["time"] = uuid::log::format_timestamp_ms(message.content_->uptime_ms, 3); - logEvent["level"] = message.content_->level; - logEvent["name"] = message.content_->name; - logEvent["message"] = message.content_->text; + logEvent["t"] = uuid::log::format_timestamp_ms(message.content_->uptime_ms, 3); + logEvent["l"] = message.content_->level; + logEvent["n"] = message.content_->name; + logEvent["m"] = message.content_->text; size_t len = measureJson(jsonDocument); char * buffer = new char[len + 1]; @@ -120,18 +121,18 @@ void WebLogService::transmit(const QueuedLogMessage & message) { // send the current log buffer to the API void WebLogService::fetchLog(AsyncWebServerRequest * request) { - AsyncJsonResponse * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_XLARGE_DYN); - JsonObject root = response->getRoot(); + MsgpackAsyncJsonResponse * response = new MsgpackAsyncJsonResponse(false, EMSESP_JSON_SIZE_XXLARGE_DYN); // 8kb buffer + JsonObject root = response->getRoot(); JsonArray log = root.createNestedArray("events"); for (const auto & msg : log_messages_) { JsonObject logEvent = log.createNestedObject(); auto message = std::move(msg); - logEvent["time"] = uuid::log::format_timestamp_ms(message.content_->uptime_ms, 3); - logEvent["level"] = message.content_->level; - logEvent["name"] = message.content_->name; - logEvent["message"] = message.content_->text; + logEvent["t"] = uuid::log::format_timestamp_ms(message.content_->uptime_ms, 3); + logEvent["l"] = message.content_->level; + logEvent["n"] = message.content_->name; + logEvent["m"] = message.content_->text; } log_message_id_tail_ = log_messages_.back().id_; @@ -140,7 +141,7 @@ void WebLogService::fetchLog(AsyncWebServerRequest * request) { request->send(response); } -// sets the level +// sets the level after a POST void WebLogService::setLevel(AsyncWebServerRequest * request, JsonVariant & json) { if (not json.is()) { return; @@ -157,14 +158,12 @@ void WebLogService::setLevel(AsyncWebServerRequest * request, JsonVariant & json request->send(response); } -// return the current log level +// return the current log level after a GET void WebLogService::getLevel(AsyncWebServerRequest * request) { AsyncJsonResponse * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_SMALL); JsonObject root = response->getRoot(); - - auto level = log_level(); - root["level"] = level; - + root["level"] = log_level(); + root["max_messages"] = maximum_log_messages(); response->setLength(); request->send(response); } diff --git a/src/web/WebLogService.h b/src/web/WebLogService.h index a888c00d6..12bf8afe6 100644 --- a/src/web/WebLogService.h +++ b/src/web/WebLogService.h @@ -34,7 +34,7 @@ namespace emsesp { class WebLogService : public uuid::log::Handler { public: - static constexpr size_t MAX_LOG_MESSAGES = 50; + static constexpr size_t MAX_LOG_MESSAGES = 30; WebLogService(AsyncWebServer * server, SecurityManager * securityManager); @@ -71,8 +71,8 @@ class WebLogService : public uuid::log::Handler { uint64_t last_transmit_ = 0; // Last transmit time size_t maximum_log_messages_ = MAX_LOG_MESSAGES; // Maximum number of log messages to buffer before they are output unsigned long log_message_id_ = 0; // The next identifier to use for queued log messages - unsigned long log_message_id_tail_ = 0; - std::list log_messages_; // Queued log messages, in the order they were received + unsigned long log_message_id_tail_ = 0; // last event shown on the screen after fetch + std::list log_messages_; // Queued log messages, in the order they were received }; } // namespace emsesp