Example #1
0
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);
}
Example #2
0
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);
}
Example #3
0
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");
}
Example #4
0
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);
        }
    }
}