static void klog_rotate_parts(void) { int result = klog_init_file(LOG_PATH, strlen(LOG_PATH), 32, 3); int size; TEST_ASSERT_EQUAL_INT(result, 0); // This should be a line length of 21 KLOG_WARN("a", "b"); KLOG_WARN("a", "b"); klog_cleanup(); TEST_ASSERT(_fstat(LOG_PATH ".000", &size)); TEST_ASSERT_EQUAL_INT(size, 42); KLOG_WARN("a", "b"); klog_cleanup(); TEST_ASSERT(_fstat(LOG_PATH ".000", &size)); TEST_ASSERT_EQUAL_INT(size, 42); TEST_ASSERT(_fstat(LOG_PATH ".001", &size)); TEST_ASSERT_EQUAL_INT(size, 21); KLOG_WARN("a", "b"); klog_cleanup(); TEST_ASSERT(_fstat(LOG_PATH ".000", &size)); TEST_ASSERT_EQUAL_INT(size, 42); TEST_ASSERT(_fstat(LOG_PATH ".001", &size)); TEST_ASSERT_EQUAL_INT(size, 42); // force rotation KLOG_WARN("a", "b"); KLOG_WARN("a", "b"); klog_cleanup(); TEST_ASSERT(_fstat(LOG_PATH ".000", &size)); TEST_ASSERT_EQUAL_INT(size, 0); TEST_ASSERT(_fstat(LOG_PATH ".001", &size)); TEST_ASSERT_EQUAL_INT(size, 42); TEST_ASSERT(_fstat(LOG_PATH ".002", &size)); TEST_ASSERT_EQUAL_INT(size, 42); KLOG_WARN("aa", "bb"); klog_cleanup(); TEST_ASSERT(_fstat(LOG_PATH ".000", &size)); TEST_ASSERT_EQUAL_INT(size, 23); TEST_ASSERT(_fstat(LOG_PATH ".001", &size)); TEST_ASSERT_EQUAL_INT(size, 42); TEST_ASSERT(_fstat(LOG_PATH ".002", &size)); TEST_ASSERT_EQUAL_INT(size, 42); }
static void klog_file_log(void) { klog_file_level = LOG_INFO; int result = klog_init_file(LOG_PATH, strlen(LOG_PATH), 256, 1); TEST_ASSERT_EQUAL_INT(result, 0); KLOG_INFO("test", "123:%d", 456); KLOG_WARN("logger", "hi"); KLOG_ERR("o", "error"); KLOG_DEBUG("b", "debug"); klog_cleanup(); FILE *log_file = fopen(LOG_PATH ".000", "r"); TEST_ASSERT_NOT_NULL(log_file); char buffer[256]; char lines[4][64]; int i = 0; fread(buffer, 1, 256, log_file); for (char *token = strtok(buffer, "\n"); token; token = strtok(NULL, "\n"), i++) { strcpy(lines[i], token); } ASSERT_STRING_STARTS_WITH(&lines[0][14], " test:I 123:456"); ASSERT_STRING_STARTS_WITH(&lines[1][14], " logger:W hi"); ASSERT_STRING_STARTS_WITH(&lines[2][14], " o:E error"); TEST_ASSERT_EQUAL_INT(i, 4); }
static void tearDown(void) { klog_console_level = LOG_INFO; klog_file_level = LOG_DEBUG; klog_cleanup(); remove_if_exists(LOG_PATH ".000"); remove_if_exists(LOG_PATH ".001"); remove_if_exists(LOG_PATH ".002"); remove_if_exists(LOG_PATH ".003"); remove_if_exists(LOG_PATH ".004"); }
static void _next_log_file(void) { char buf[KLOG_PATH_LEN]; char *tail; uint32_t pos = 0; struct stat st; klog_cleanup(); if (!_file_path) { return; } _current_part = -1; _current_part_size = 0; strncpy(buf, _file_path, _file_path_len); tail = buf + _file_path_len; for (uint8_t i = 0; i < _max_parts; i++) { sprintf(tail, ".%03d", i); if (stat(buf, &st) == -1) { if (errno == ENOENT) { klog_console(LOG_DEBUG, "klog", "creating %s", buf); _log_file = fopen(buf, "w+"); _current_part = i; _current_part_size = 0; break; } continue; } if (st.st_size < (off_t) _part_size) { _log_file = fopen(buf, "r+"); _current_part = i; pos = st.st_size - 1; _current_part_size = st.st_size; break; } } if (!_log_file) { // no empty or partial log file found, rotate _current_part++; if (_current_part > _max_parts) { _current_part = 0; } sprintf(tail, ".%03d", _current_part); remove(buf); klog_console(LOG_DEBUG, "klog", "rotating to %s", buf); _log_file = fopen(buf, "w+"); } if (_log_file) { klog_console(LOG_INFO, "klog", "logging to %s", buf); klog_file_logging = true; if (pos > 0) { fseek(_log_file, 0, SEEK_END); } } }