Refactor logging

This commit is contained in:
Theo Arends 2020-12-19 17:29:14 +01:00
parent 5d7e911ef7
commit 5f7aacf13c
4 changed files with 96 additions and 133 deletions

View File

@ -17,9 +17,6 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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) {

View File

@ -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();

View File

@ -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)

View File

@ -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 "\"}");