mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-28 05:06:32 +00:00
Refactor logging
This commit is contained in:
parent
5d7e911ef7
commit
5f7aacf13c
@ -17,9 +17,6 @@
|
|||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
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 "C" {
|
||||||
extern struct rst_info resetInfo;
|
extern struct rst_info resetInfo;
|
||||||
}
|
}
|
||||||
@ -1901,6 +1898,9 @@ void SetSyslog(uint32_t loglevel)
|
|||||||
|
|
||||||
void Syslog(void)
|
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
|
// Destroys TasmotaGlobal.log_data
|
||||||
|
|
||||||
uint32_t current_hash = GetHash(SettingsText(SET_SYSLOG_HOST), strlen(SettingsText(SET_SYSLOG_HOST)));
|
uint32_t current_hash = GetHash(SettingsText(SET_SYSLOG_HOST), strlen(SettingsText(SET_SYSLOG_HOST)));
|
||||||
@ -1925,53 +1925,58 @@ void Syslog(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SyslogAsync(void) {
|
void SyslogAsync(void) {
|
||||||
static uint32_t counter = 1;
|
static uint32_t index = 1;
|
||||||
|
|
||||||
if (!TasmotaGlobal.syslog_level ||
|
char* line;
|
||||||
(counter == TasmotaGlobal.log_buffer_pointer) ||
|
size_t len;
|
||||||
TasmotaGlobal.global_state.network_down) { return; }
|
while (GetLog(TasmotaGlobal.syslog_level, &index, &line, &len)) {
|
||||||
|
if (len > 13) {
|
||||||
do {
|
strlcpy(TasmotaGlobal.log_data, line +13, len -13); // Skip mxtime
|
||||||
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
|
|
||||||
Syslog();
|
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) {
|
bool GetLog(uint32_t req_loglevel, uint32_t* index_p, char** entry_pp, size_t* len_p) {
|
||||||
char* entry_p = nullptr;
|
uint32_t index = *index_p;
|
||||||
size_t len = 0;
|
|
||||||
uint32_t loglevel = 0;
|
if (!req_loglevel || (index == TasmotaGlobal.log_buffer_pointer)) { return false; }
|
||||||
if (idx) {
|
|
||||||
char* it = TasmotaGlobal.log_buffer;
|
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 {
|
do {
|
||||||
uint32_t cur_idx = *it;
|
uint32_t cur_idx = *entry_p;
|
||||||
it++;
|
entry_p++;
|
||||||
size_t tmp = strchrspn(it, '\1');
|
size_t tmp = strchrspn(entry_p, '\1');
|
||||||
tmp++; // Skip terminating '\1'
|
tmp++; // Skip terminating '\1'
|
||||||
if (cur_idx == idx) { // Found the requested entry
|
if (cur_idx == index) { // Found the requested entry
|
||||||
loglevel = *it - '0';
|
loglevel = *entry_p - '0';
|
||||||
it++; // Skip loglevel
|
entry_p++; // Skip loglevel
|
||||||
len = tmp -1;
|
len = tmp -1;
|
||||||
entry_p = it;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
it += tmp;
|
entry_p += tmp;
|
||||||
} while (it < TasmotaGlobal.log_buffer + LOG_BUFFER_SIZE && *it != '\0');
|
} while (entry_p < TasmotaGlobal.log_buffer + LOG_BUFFER_SIZE && *entry_p != '\0');
|
||||||
}
|
index++;
|
||||||
*entry_pp = entry_p;
|
if (index > 255) { index = 1; } // Skip 0 as it is not allowed
|
||||||
*len_p = len;
|
*index_p = index;
|
||||||
|
if ((len > 0) &&
|
||||||
return loglevel;
|
(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) {
|
void AddLog(uint32_t loglevel) {
|
||||||
|
@ -3022,31 +3022,23 @@ void HandleHttpCommand(void)
|
|||||||
if (svalue.length() && (svalue.length() < MQTT_MAX_PACKET_SIZE)) {
|
if (svalue.length() && (svalue.length() < MQTT_MAX_PACKET_SIZE)) {
|
||||||
ExecuteWebCommand((char*)svalue.c_str(), SRC_WEBCOMMAND);
|
ExecuteWebCommand((char*)svalue.c_str(), SRC_WEBCOMMAND);
|
||||||
if (TasmotaGlobal.log_buffer_pointer != curridx) {
|
if (TasmotaGlobal.log_buffer_pointer != curridx) {
|
||||||
uint32_t counter = curridx;
|
|
||||||
WSContentSend_P(PSTR("{"));
|
WSContentSend_P(PSTR("{"));
|
||||||
bool cflg = false;
|
bool cflg = false;
|
||||||
do {
|
uint32_t index = curridx;
|
||||||
char* tmp;
|
char* line;
|
||||||
size_t len;
|
size_t len;
|
||||||
uint32_t loglevel = GetLog(counter, &tmp, &len);
|
while (GetLog(Settings.weblog_level, &index, &line, &len)) {
|
||||||
if ((len > 0) &&
|
// [14:49:36.123 MQTT: stat/wemos5/RESULT = {"POWER":"OFF"}] > [{"POWER":"OFF"}]
|
||||||
(loglevel <= Settings.weblog_level) &&
|
char* JSON = (char*)memchr(line, '{', len);
|
||||||
(TasmotaGlobal.masterlog_level <= Settings.weblog_level)) {
|
if (JSON) { // Is it a JSON message (and not only [15:26:08 MQT: stat/wemos5/POWER = O])
|
||||||
// [14:49:36 MQTT: stat/wemos5/RESULT = {"POWER":"OFF"}] > [{"POWER":"OFF"}]
|
size_t JSONlen = len - (JSON - line);
|
||||||
char* JSON = (char*)memchr(tmp, '{', len);
|
if (JSONlen > sizeof(TasmotaGlobal.mqtt_data)) { JSONlen = sizeof(TasmotaGlobal.mqtt_data); }
|
||||||
if (JSON) { // Is it a JSON message (and not only [15:26:08 MQT: stat/wemos5/POWER = O])
|
char stemp[JSONlen];
|
||||||
size_t JSONlen = len - (JSON - tmp);
|
strlcpy(stemp, JSON +1, JSONlen -2);
|
||||||
if (JSONlen > sizeof(TasmotaGlobal.mqtt_data)) { JSONlen = sizeof(TasmotaGlobal.mqtt_data); }
|
WSContentSend_P(PSTR("%s%s"), (cflg) ? "," : "", stemp);
|
||||||
char stemp[JSONlen];
|
cflg = true;
|
||||||
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("}"));
|
WSContentSend_P(PSTR("}"));
|
||||||
} else {
|
} else {
|
||||||
WSContentSend_P(PSTR("{\"" D_RSLT_WARNING "\":\"" D_ENABLE_WEBLOG_FOR_RESPONSE "\"}"));
|
WSContentSend_P(PSTR("{\"" D_RSLT_WARNING "\":\"" D_ENABLE_WEBLOG_FOR_RESPONSE "\"}"));
|
||||||
@ -3080,9 +3072,6 @@ void HandleConsole(void)
|
|||||||
|
|
||||||
void HandleConsoleRefresh(void)
|
void HandleConsoleRefresh(void)
|
||||||
{
|
{
|
||||||
bool cflg = true;
|
|
||||||
uint32_t counter = 0; // Initial start, should never be 0 again
|
|
||||||
|
|
||||||
String svalue = Webserver->arg("c1");
|
String svalue = Webserver->arg("c1");
|
||||||
if (svalue.length() && (svalue.length() < MQTT_MAX_PACKET_SIZE)) {
|
if (svalue.length() && (svalue.length() < MQTT_MAX_PACKET_SIZE)) {
|
||||||
AddLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_COMMAND "%s"), svalue.c_str());
|
AddLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_COMMAND "%s"), svalue.c_str());
|
||||||
@ -3091,36 +3080,24 @@ void HandleConsoleRefresh(void)
|
|||||||
|
|
||||||
char stmp[8];
|
char stmp[8];
|
||||||
WebGetArg("c2", stmp, sizeof(stmp));
|
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);
|
WSContentBegin(200, CT_PLAIN);
|
||||||
WSContentSend_P(PSTR("%d}1%d}1"), TasmotaGlobal.log_buffer_pointer, Web.reset_web_log_flag);
|
WSContentSend_P(PSTR("%d}1%d}1"), TasmotaGlobal.log_buffer_pointer, Web.reset_web_log_flag);
|
||||||
if (!Web.reset_web_log_flag) {
|
if (!Web.reset_web_log_flag) {
|
||||||
counter = 0;
|
index = 0;
|
||||||
Web.reset_web_log_flag = true;
|
Web.reset_web_log_flag = true;
|
||||||
}
|
}
|
||||||
if (counter != TasmotaGlobal.log_buffer_pointer) {
|
bool cflg = (index);
|
||||||
if (!counter) {
|
char* line;
|
||||||
counter = TasmotaGlobal.log_buffer_pointer;
|
size_t len;
|
||||||
cflg = false;
|
while (GetLog(Settings.weblog_level, &index, &line, &len)) {
|
||||||
}
|
if (len > sizeof(TasmotaGlobal.mqtt_data) -2) { len = sizeof(TasmotaGlobal.mqtt_data); }
|
||||||
do {
|
char stemp[len +1];
|
||||||
char* tmp;
|
strlcpy(stemp, line, len);
|
||||||
size_t len;
|
WSContentSend_P(PSTR("%s%s"), (cflg) ? "\n" : "", stemp);
|
||||||
uint32_t loglevel = GetLog(counter, &tmp, &len);
|
cflg = true;
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
WSContentSend_P(PSTR("}1"));
|
WSContentSend_P(PSTR("}1"));
|
||||||
WSContentEnd();
|
WSContentEnd();
|
||||||
|
@ -292,29 +292,18 @@ void MqttUnsubscribe(const char *topic)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MqttPublishLoggingAsync(void) {
|
void MqttPublishLoggingAsync(void) {
|
||||||
static uint32_t counter = 1;
|
static uint32_t index = 1;
|
||||||
|
|
||||||
if (!Settings.flag.mqtt_enabled || // SetOption3 - Enable MQTT
|
if (!Settings.flag.mqtt_enabled) { return; } // SetOption3 - Enable MQTT
|
||||||
!Settings.mqttlog_level ||
|
|
||||||
(counter == TasmotaGlobal.log_buffer_pointer) ||
|
|
||||||
TasmotaGlobal.global_state.mqtt_down) { return; }
|
|
||||||
|
|
||||||
do {
|
char* line;
|
||||||
char* tmp;
|
size_t len;
|
||||||
size_t len;
|
while (GetLog(Settings.mqttlog_level, &index, &line, &len)) {
|
||||||
uint32_t loglevel = GetLog(counter, &tmp, &len);
|
strlcpy(TasmotaGlobal.mqtt_data, line, len); // No JSON and ugly!!
|
||||||
if ((len > 0) &&
|
char stopic[TOPSZ];
|
||||||
(loglevel <= Settings.mqttlog_level) &&
|
GetTopic_P(stopic, STAT, TasmotaGlobal.mqtt_topic, PSTR("LOGGING"));
|
||||||
(TasmotaGlobal.masterlog_level <= Settings.mqttlog_level)) {
|
MqttPublishLib(stopic, false);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MqttPublish(const char* topic, bool retained)
|
void MqttPublish(const char* topic, bool retained)
|
||||||
|
@ -292,32 +292,24 @@ String TelegramExecuteCommand(const char *svalue) {
|
|||||||
uint32_t curridx = TasmotaGlobal.log_buffer_pointer;
|
uint32_t curridx = TasmotaGlobal.log_buffer_pointer;
|
||||||
ExecuteCommand(svalue, SRC_CHAT);
|
ExecuteCommand(svalue, SRC_CHAT);
|
||||||
if (TasmotaGlobal.log_buffer_pointer != curridx) {
|
if (TasmotaGlobal.log_buffer_pointer != curridx) {
|
||||||
uint32_t counter = curridx;
|
|
||||||
response = F("{");
|
response = F("{");
|
||||||
bool cflg = false;
|
bool cflg = false;
|
||||||
do {
|
uint32_t index = curridx;
|
||||||
char* tmp;
|
char* line;
|
||||||
size_t len;
|
size_t len;
|
||||||
uint32_t loglevel = GetLog(counter, &tmp, &len);
|
while (GetLog(Settings.weblog_level, &index, &line, &len)) {
|
||||||
if ((len > 0) &&
|
// [14:49:36.123 MQTT: stat/wemos5/RESULT = {"POWER":"OFF"}] > [{"POWER":"OFF"}]
|
||||||
(loglevel <= Settings.weblog_level) &&
|
char* JSON = (char*)memchr(line, '{', len);
|
||||||
(TasmotaGlobal.masterlog_level <= Settings.weblog_level)) {
|
if (JSON) { // Is it a JSON message (and not only [15:26:08 MQT: stat/wemos5/POWER = O])
|
||||||
// [14:49:36 MQTT: stat/wemos5/RESULT = {"POWER":"OFF"}] > [{"POWER":"OFF"}]
|
size_t JSONlen = len - (JSON - line);
|
||||||
char* JSON = (char*)memchr(tmp, '{', len);
|
if (JSONlen > sizeof(TasmotaGlobal.mqtt_data)) { JSONlen = sizeof(TasmotaGlobal.mqtt_data); }
|
||||||
if (JSON) { // Is it a JSON message (and not only [15:26:08 MQT: stat/wemos5/POWER = O])
|
char stemp[JSONlen];
|
||||||
size_t JSONlen = len - (JSON - tmp);
|
strlcpy(stemp, JSON +1, JSONlen -2);
|
||||||
if (JSONlen > sizeof(TasmotaGlobal.mqtt_data)) { JSONlen = sizeof(TasmotaGlobal.mqtt_data); }
|
if (cflg) { response += F(","); }
|
||||||
char stemp[JSONlen];
|
response += stemp;
|
||||||
strlcpy(stemp, JSON +1, JSONlen -2);
|
cflg = true;
|
||||||
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("}");
|
response += F("}");
|
||||||
} else {
|
} else {
|
||||||
response = F("{\"" D_RSLT_WARNING "\":\"" D_ENABLE_WEBLOG_FOR_RESPONSE "\"}");
|
response = F("{\"" D_RSLT_WARNING "\":\"" D_ENABLE_WEBLOG_FOR_RESPONSE "\"}");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user