diff --git a/tasmota/support.ino b/tasmota/support.ino index a5f18ce59..16dd1927e 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -17,9 +17,6 @@ along with this program. If not, see . */ -IPAddress syslog_host_addr; // Syslog host IP address -uint32_t syslog_host_hash = 0; // Syslog host name hash - extern "C" { extern struct rst_info resetInfo; } @@ -1901,6 +1898,9 @@ void SetSyslog(uint32_t loglevel) void Syslog(void) { + static IPAddress syslog_host_addr; // Syslog host IP address + static uint32_t syslog_host_hash = 0; // Syslog host name hash + // Destroys TasmotaGlobal.log_data uint32_t current_hash = GetHash(SettingsText(SET_SYSLOG_HOST), strlen(SettingsText(SET_SYSLOG_HOST))); @@ -1925,53 +1925,58 @@ void Syslog(void) } void SyslogAsync(void) { - static uint32_t counter = 1; + static uint32_t index = 1; - if (!TasmotaGlobal.syslog_level || - (counter == TasmotaGlobal.log_buffer_pointer) || - TasmotaGlobal.global_state.network_down) { return; } - - do { - char* tmp; - size_t len; - uint32_t loglevel = GetLog(counter, &tmp, &len); - if ((len > 13) && - (loglevel <= TasmotaGlobal.syslog_level) && - (TasmotaGlobal.masterlog_level <= TasmotaGlobal.syslog_level)) { - strlcpy(TasmotaGlobal.log_data, tmp +13, len -13); // Skip mxtime + char* line; + size_t len; + while (GetLog(TasmotaGlobal.syslog_level, &index, &line, &len)) { + if (len > 13) { + strlcpy(TasmotaGlobal.log_data, line +13, len -13); // Skip mxtime Syslog(); } - counter++; - counter &= 0xFF; - if (!counter) { counter++; } // Skip 0 as it is not allowed - } while (counter != TasmotaGlobal.log_buffer_pointer); + } } -uint32_t GetLog(uint32_t idx, char** entry_pp, size_t* len_p) { - char* entry_p = nullptr; - size_t len = 0; - uint32_t loglevel = 0; - if (idx) { - char* it = TasmotaGlobal.log_buffer; +bool GetLog(uint32_t req_loglevel, uint32_t* index_p, char** entry_pp, size_t* len_p) { + uint32_t index = *index_p; + + if (!req_loglevel || (index == TasmotaGlobal.log_buffer_pointer)) { return false; } + + if (!index) { // Dump all + index = TasmotaGlobal.log_buffer_pointer +1; + if (index > 255) { index = 1; } + } + + do { + size_t len = 0; + uint32_t loglevel = 0; + char* entry_p = TasmotaGlobal.log_buffer; do { - uint32_t cur_idx = *it; - it++; - size_t tmp = strchrspn(it, '\1'); + uint32_t cur_idx = *entry_p; + entry_p++; + size_t tmp = strchrspn(entry_p, '\1'); tmp++; // Skip terminating '\1' - if (cur_idx == idx) { // Found the requested entry - loglevel = *it - '0'; - it++; // Skip loglevel + if (cur_idx == index) { // Found the requested entry + loglevel = *entry_p - '0'; + entry_p++; // Skip loglevel len = tmp -1; - entry_p = it; break; } - it += tmp; - } while (it < TasmotaGlobal.log_buffer + LOG_BUFFER_SIZE && *it != '\0'); - } - *entry_pp = entry_p; - *len_p = len; - - return loglevel; + entry_p += tmp; + } while (entry_p < TasmotaGlobal.log_buffer + LOG_BUFFER_SIZE && *entry_p != '\0'); + index++; + if (index > 255) { index = 1; } // Skip 0 as it is not allowed + *index_p = index; + if ((len > 0) && + (loglevel <= req_loglevel) && + (TasmotaGlobal.masterlog_level <= req_loglevel)) { + *entry_pp = entry_p; + *len_p = len; + return true; + } + delay(0); + } while (index != TasmotaGlobal.log_buffer_pointer); + return false; } void AddLog(uint32_t loglevel) { diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 012294b82..e2de549fa 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -3022,31 +3022,23 @@ void HandleHttpCommand(void) if (svalue.length() && (svalue.length() < MQTT_MAX_PACKET_SIZE)) { ExecuteWebCommand((char*)svalue.c_str(), SRC_WEBCOMMAND); if (TasmotaGlobal.log_buffer_pointer != curridx) { - uint32_t counter = curridx; WSContentSend_P(PSTR("{")); bool cflg = false; - do { - char* tmp; - size_t len; - uint32_t loglevel = GetLog(counter, &tmp, &len); - if ((len > 0) && - (loglevel <= Settings.weblog_level) && - (TasmotaGlobal.masterlog_level <= Settings.weblog_level)) { - // [14:49:36 MQTT: stat/wemos5/RESULT = {"POWER":"OFF"}] > [{"POWER":"OFF"}] - char* JSON = (char*)memchr(tmp, '{', len); - if (JSON) { // Is it a JSON message (and not only [15:26:08 MQT: stat/wemos5/POWER = O]) - size_t JSONlen = len - (JSON - tmp); - if (JSONlen > sizeof(TasmotaGlobal.mqtt_data)) { JSONlen = sizeof(TasmotaGlobal.mqtt_data); } - char stemp[JSONlen]; - strlcpy(stemp, JSON +1, JSONlen -2); - WSContentSend_P(PSTR("%s%s"), (cflg) ? "," : "", stemp); - cflg = true; - } + uint32_t index = curridx; + char* line; + size_t len; + while (GetLog(Settings.weblog_level, &index, &line, &len)) { + // [14:49:36.123 MQTT: stat/wemos5/RESULT = {"POWER":"OFF"}] > [{"POWER":"OFF"}] + char* JSON = (char*)memchr(line, '{', len); + if (JSON) { // Is it a JSON message (and not only [15:26:08 MQT: stat/wemos5/POWER = O]) + size_t JSONlen = len - (JSON - line); + if (JSONlen > sizeof(TasmotaGlobal.mqtt_data)) { JSONlen = sizeof(TasmotaGlobal.mqtt_data); } + char stemp[JSONlen]; + strlcpy(stemp, JSON +1, JSONlen -2); + WSContentSend_P(PSTR("%s%s"), (cflg) ? "," : "", stemp); + cflg = true; } - counter++; - counter &= 0xFF; - if (!counter) counter++; // Skip 0 as it is not allowed - } while (counter != TasmotaGlobal.log_buffer_pointer); + } WSContentSend_P(PSTR("}")); } else { WSContentSend_P(PSTR("{\"" D_RSLT_WARNING "\":\"" D_ENABLE_WEBLOG_FOR_RESPONSE "\"}")); @@ -3080,9 +3072,6 @@ void HandleConsole(void) void HandleConsoleRefresh(void) { - bool cflg = true; - uint32_t counter = 0; // Initial start, should never be 0 again - String svalue = Webserver->arg("c1"); if (svalue.length() && (svalue.length() < MQTT_MAX_PACKET_SIZE)) { AddLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_COMMAND "%s"), svalue.c_str()); @@ -3091,36 +3080,24 @@ void HandleConsoleRefresh(void) char stmp[8]; WebGetArg("c2", stmp, sizeof(stmp)); - if (strlen(stmp)) { counter = atoi(stmp); } + uint32_t index = 0; // Initial start, dump all + if (strlen(stmp)) { index = atoi(stmp); } WSContentBegin(200, CT_PLAIN); WSContentSend_P(PSTR("%d}1%d}1"), TasmotaGlobal.log_buffer_pointer, Web.reset_web_log_flag); if (!Web.reset_web_log_flag) { - counter = 0; + index = 0; Web.reset_web_log_flag = true; } - if (counter != TasmotaGlobal.log_buffer_pointer) { - if (!counter) { - counter = TasmotaGlobal.log_buffer_pointer; - cflg = false; - } - do { - char* tmp; - size_t len; - uint32_t loglevel = GetLog(counter, &tmp, &len); - if ((len > 0) && - (loglevel <= Settings.weblog_level) && - (TasmotaGlobal.masterlog_level <= Settings.weblog_level)) { - if (len > sizeof(TasmotaGlobal.mqtt_data) -2) { len = sizeof(TasmotaGlobal.mqtt_data); } - char stemp[len +1]; - strlcpy(stemp, tmp, len); - WSContentSend_P(PSTR("%s%s"), (cflg) ? "\n" : "", stemp); - cflg = true; - } - counter++; - counter &= 0xFF; - if (!counter) { counter++; } // Skip log index 0 as it is not allowed - } while (counter != TasmotaGlobal.log_buffer_pointer); + bool cflg = (index); + char* line; + size_t len; + while (GetLog(Settings.weblog_level, &index, &line, &len)) { + if (len > sizeof(TasmotaGlobal.mqtt_data) -2) { len = sizeof(TasmotaGlobal.mqtt_data); } + char stemp[len +1]; + strlcpy(stemp, line, len); + WSContentSend_P(PSTR("%s%s"), (cflg) ? "\n" : "", stemp); + cflg = true; } WSContentSend_P(PSTR("}1")); WSContentEnd(); diff --git a/tasmota/xdrv_02_mqtt.ino b/tasmota/xdrv_02_mqtt.ino index 145d5df16..87d1cf4a5 100644 --- a/tasmota/xdrv_02_mqtt.ino +++ b/tasmota/xdrv_02_mqtt.ino @@ -292,29 +292,18 @@ void MqttUnsubscribe(const char *topic) } void MqttPublishLoggingAsync(void) { - static uint32_t counter = 1; + static uint32_t index = 1; - if (!Settings.flag.mqtt_enabled || // SetOption3 - Enable MQTT - !Settings.mqttlog_level || - (counter == TasmotaGlobal.log_buffer_pointer) || - TasmotaGlobal.global_state.mqtt_down) { return; } + if (!Settings.flag.mqtt_enabled) { return; } // SetOption3 - Enable MQTT - do { - char* tmp; - size_t len; - uint32_t loglevel = GetLog(counter, &tmp, &len); - if ((len > 0) && - (loglevel <= Settings.mqttlog_level) && - (TasmotaGlobal.masterlog_level <= Settings.mqttlog_level)) { - strlcpy(TasmotaGlobal.mqtt_data, tmp, len); // No JSON and ugly!! - char stopic[TOPSZ]; - GetTopic_P(stopic, STAT, TasmotaGlobal.mqtt_topic, PSTR("LOGGING")); - MqttPublishLib(stopic, false); - } - counter++; - counter &= 0xFF; - if (!counter) { counter++; } // Skip 0 as it is not allowed - } while (counter != TasmotaGlobal.log_buffer_pointer); + char* line; + size_t len; + while (GetLog(Settings.mqttlog_level, &index, &line, &len)) { + strlcpy(TasmotaGlobal.mqtt_data, line, len); // No JSON and ugly!! + char stopic[TOPSZ]; + GetTopic_P(stopic, STAT, TasmotaGlobal.mqtt_topic, PSTR("LOGGING")); + MqttPublishLib(stopic, false); + } } void MqttPublish(const char* topic, bool retained) diff --git a/tasmota/xdrv_40_telegram.ino b/tasmota/xdrv_40_telegram.ino index 2ce3769d5..cf4ab4baa 100644 --- a/tasmota/xdrv_40_telegram.ino +++ b/tasmota/xdrv_40_telegram.ino @@ -292,32 +292,24 @@ String TelegramExecuteCommand(const char *svalue) { uint32_t curridx = TasmotaGlobal.log_buffer_pointer; ExecuteCommand(svalue, SRC_CHAT); if (TasmotaGlobal.log_buffer_pointer != curridx) { - uint32_t counter = curridx; response = F("{"); bool cflg = false; - do { - char* tmp; - size_t len; - uint32_t loglevel = GetLog(counter, &tmp, &len); - if ((len > 0) && - (loglevel <= Settings.weblog_level) && - (TasmotaGlobal.masterlog_level <= Settings.weblog_level)) { - // [14:49:36 MQTT: stat/wemos5/RESULT = {"POWER":"OFF"}] > [{"POWER":"OFF"}] - char* JSON = (char*)memchr(tmp, '{', len); - if (JSON) { // Is it a JSON message (and not only [15:26:08 MQT: stat/wemos5/POWER = O]) - size_t JSONlen = len - (JSON - tmp); - if (JSONlen > sizeof(TasmotaGlobal.mqtt_data)) { JSONlen = sizeof(TasmotaGlobal.mqtt_data); } - char stemp[JSONlen]; - strlcpy(stemp, JSON +1, JSONlen -2); - if (cflg) { response += F(","); } - response += stemp; - cflg = true; - } + uint32_t index = curridx; + char* line; + size_t len; + while (GetLog(Settings.weblog_level, &index, &line, &len)) { + // [14:49:36.123 MQTT: stat/wemos5/RESULT = {"POWER":"OFF"}] > [{"POWER":"OFF"}] + char* JSON = (char*)memchr(line, '{', len); + if (JSON) { // Is it a JSON message (and not only [15:26:08 MQT: stat/wemos5/POWER = O]) + size_t JSONlen = len - (JSON - line); + if (JSONlen > sizeof(TasmotaGlobal.mqtt_data)) { JSONlen = sizeof(TasmotaGlobal.mqtt_data); } + char stemp[JSONlen]; + strlcpy(stemp, JSON +1, JSONlen -2); + if (cflg) { response += F(","); } + response += stemp; + cflg = true; } - counter++; - counter &= 0xFF; - if (!counter) counter++; // Skip 0 as it is not allowed - } while (counter != TasmotaGlobal.log_buffer_pointer); + } response += F("}"); } else { response = F("{\"" D_RSLT_WARNING "\":\"" D_ENABLE_WEBLOG_FOR_RESPONSE "\"}");