Написать программу анализирующую лог файл сервера 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;
}
Объяснение кода листинга программы
- Создание и инициализация массива
months, содержащего названия месяцев. - Объявление функции
find_month, которая принимает строку в качестве аргумента и возвращает указатель на соответствующий элемент массиваmonths. Если соответствующий элемент не найден, функция возвращаетNULL. - Объявление переменных
counts,good,bad,i,mon,logиentry. - Проверка корректности входных аргументов функции
main. Если аргументов недостаточно, выводится сообщение об ошибке и программа завершается с кодом ошибки 1. - Открытие файла лога в режиме чтения. Если файл не может быть открыт, выводится сообщение об ошибке и программа завершается с кодом ошибки 1.
- Чтение лог-записей из файла и анализ их содержимого.
- Поиск месяца в заданной строке с помощью функции
find_month. Если месяц не найден, выводится сообщение об ошибке и увеличивается счетчикbad. - Если месяц найден, увеличивается соответствующий счетчик
counts. - Если в файле произошла ошибка чтения, выводится сообщение об ошибке и программа завершается с кодом ошибки 1.
- Вывод статистики по найденным месяцам.
- Закрытие файла лога.
- Вывод общего количества проанализированных лог-записей и завершение программы с кодом ошибки 0.