Написать программу анализирующую лог файл сервера apache - C (СИ) (77483)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте!!! Помогите пожалуйста написать программу на языке Си анализирующую лог файл сервера apache, рассчитывающую увеличение нагрузки на сервере по месяцам года. В результате нужно вывести на экран значения массива из 12 элементов, в каждом элементе которого записано значение соответствующее определенному месяцу.

Решение задачи: «Написать программу анализирующую лог файл сервера apache»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 
static const char* months[] = {
    "Jan", "Feb", "Mar", "Apr", "May", "Jun",
    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
    
const char** find_month(const char*);
 
#define ENTRY_SIZE 512
 
int main(int argc, char* argv[])
{
    char entry[ENTRY_SIZE];
    size_t counts[12] = {0}, good = 0, bad = 0, i;
    char mon[4];
    FILE *log;
        
    if(argc != 2)
    {
        fprintf(stderr, 
                "Filename expected:\n"
                "Usage:\n\tanalize FILE\n");
        exit(1);
    }
 
    log = fopen(argv[1], "r");
 
    if(log == NULL)
    {
        perror(argv[1]);
        exit(1);
    }
 
    while(fgets(entry, ENTRY_SIZE, log) != NULL)
    {
        const char** found;
        
        if(sscanf(entry, "[%*3s %3s", mon) != 1)
        {
            fprintf(stderr, "Malformed entry: %s", entry);
            ++bad;
            continue;
        }
        
        found = find_month(mon);
        
        if(found == NULL)
        {
            fprintf(stderr, "No such month %s\n", mon);
            ++bad;
            continue;
        }
 
        ++counts[found - months];
        ++good;
    }
    
    if(ferror(log))
    {
        perror(argv[1]);
        exit(1);
    }
 
    for(i = 0; i < 12; ++i)
        printf("%s %zd\n", months[i], counts[i]);
    
    printf("\n%zd log entries analized (%zd malformed)\n", good + bad, bad);
    
    fclose(log);
        
    exit(0);
}
 
const char** find_month(const char* mon)
{
    size_t i;
    
    for(i = 0; i < sizeof(months) / sizeof(*months); ++i)
        if(strcmp(months[i], mon) == 0)
            return months + i;
    return NULL;
}

Объяснение кода листинга программы

  1. Создание и инициализация массива months, содержащего названия месяцев.
  2. Объявление функции find_month, которая принимает строку в качестве аргумента и возвращает указатель на соответствующий элемент массива months. Если соответствующий элемент не найден, функция возвращает NULL.
  3. Объявление переменных counts, good, bad, i, mon, log и entry.
  4. Проверка корректности входных аргументов функции main. Если аргументов недостаточно, выводится сообщение об ошибке и программа завершается с кодом ошибки 1.
  5. Открытие файла лога в режиме чтения. Если файл не может быть открыт, выводится сообщение об ошибке и программа завершается с кодом ошибки 1.
  6. Чтение лог-записей из файла и анализ их содержимого.
  7. Поиск месяца в заданной строке с помощью функции find_month. Если месяц не найден, выводится сообщение об ошибке и увеличивается счетчик bad.
  8. Если месяц найден, увеличивается соответствующий счетчик counts.
  9. Если в файле произошла ошибка чтения, выводится сообщение об ошибке и программа завершается с кодом ошибки 1.
  10. Вывод статистики по найденным месяцам.
  11. Закрытие файла лога.
  12. Вывод общего количества проанализированных лог-записей и завершение программы с кодом ошибки 0.

Оцени полезность:

12   голосов , оценка 4.083 из 5
Похожие ответы