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

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

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

Написать программу анализирующую лог файл сервера apache, рассчитывающую увеличение нагрузки на сервере по часам суток. В результате нужно вывести на экран значения массива из 24 элементов, в каждом элементе которого записано значение соответствующее определенному часу.

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

textual
Листинг программы
#include <string.h>
 
typedef struct Httpd_ts
{
    struct tm time;
    char date[256];
    char content[256];
} HTTPD_TS;
 
HTTPD_TS& ParseTime(char* psz);
bool IsEqualTime(HTTPD_TS& _ts1, HTTPD_TS& _ts2);
 
int main()
{
    FILE* fp = NULL; 
    char* filename = "access.log";
    if ((fp = fopen(filename,"r")) == NULL)
        printf("Unable to open file %s\n",filename);
 
    static char line[256] = "\0";
    while (fgets(line, 256, fp) != NULL)
    {
        int count = 1;
        HTTPD_TS ts = ParseTime(line);
        printf("%s\t",ts.content);
        
        while ((fgets(line, 256, fp) != NULL) && 
            IsEqualTime(ParseTime(line),ts)) count++;
        
        printf("count = %d\n",count+1);
    }
 
    fclose(fp);
 
    return 0;
}
 
bool IsEqualTime(HTTPD_TS& _ts1, HTTPD_TS& _ts2)
{ return (_ts1.time.tm_hour == _ts2.time.tm_hour) && 
    (strcmp(_ts1.date, _ts2.date) == 0); }
 
HTTPD_TS& ParseTime(char* psz)
{
    struct tm time; 
    HTTPD_TS httpd_ts; char* pch = NULL;
    if ((pch = strchr(psz,'[')) != NULL)
    {
        int i = 0; char* pchtm = NULL;
        while ((*pch++ != ']') && (*pch != '\0')) 
            httpd_ts.content[i++] = *pch; 
 
        httpd_ts.content[i-1] = '\0';
 
        if ((pchtm = strchr(httpd_ts.content,':')) != NULL)
        {
            int k = 0; int i = 0; char psztime[256] = "\0";
            while(httpd_ts.content[i] != *pchtm)
                httpd_ts.date[i] = httpd_ts.content[i++];
 
            httpd_ts.date[i] = '\0';
 
            while (*pchtm++ != ' ')     psztime[k++] = *pchtm;
 
            sscanf(psztime,"%d:%d:%d",&time.tm_hour,
                &time.tm_min,&time.tm_sec);
 
            httpd_ts.time = time;
        }
    }
 
    return httpd_ts;
}

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

  1. Структура HTTPD_TS содержит поля time и date, а также массив char content размером 256 байт.
  2. Функция ParseTime принимает строку и возвращает объект HTTPD_TS, заполненный данными из этой строки.
  3. В функции ParseTime сначала ищется подстрока '[' и, если найдена, из нее извлекается подстрока, следующая за ней, до первого вхождения ']'. Эта подстрока сохраняется в поле content объекта HTTPD_TS.
  4. Затем ищется подстрока ':', и если найдена, из нее извлекается подстрока, следующая за ней, до первого вхождения пробела. Эта подстрока сохраняется в поле date объекта HTTPD_TS.
  5. С помощью функции sscanf извлекаются значения часов, минут и секунд из подстроки psztime и заполняются поля tm_hour, tm_min и tm_sec объекта time структуры tm.
  6. В поле time объекта HTTPD_TS записывается объект time.
  7. Функция main открывает файл access.log для чтения и считывает его построчно.
  8. Для каждой строки, считанной из файла, вызывается функция ParseTime, чтобы заполнить объект HTTPD_TS.
  9. Затем выводится значение поля content объекта HTTPD_TS.
  10. Далее, пока не встретится строка, в которой поле date совпадает с полем date текущего объекта HTTPD_TS (с учетом того, что строки разделяются считыванием), вызывается функция IsEqualTime, и если она возвращает true, выводится значение поля content объекта HTTPD_TS.
  11. Функция IsEqualTime сравнивает значения полей tm_hour и сравнивает строки, используя функцию strcmp.
  12. Значения поля content объектов HTTPD_TS не сравниваются.
  13. В конце программы файл закрывается.
  14. Если при открытии файла возникает ошибка, выводится сообщение об ошибке.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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