Ключевые слова:squid, log, filter, time, (найти похожие документы)
From: Александр <sasha@toroid.net.ru.>
Newsgroups: email
Date: Mon, 12 Jun 2005 18:21:07 +0000 (UTC)
Subject: Фильтр для перевода в наглядный вид времени в логе squid
Squid (proxy squid log time) Изменение времени в секундах в понятное время
Не нашёл ничего подходящего, кроме как сделать свою программу для изменения
записанного времени в лог файле программы SQUID.
Программа нахождения строк, начинающихся со времени в секундах, и
изменения их на понятное время для оператора.
Программа принимает строки или из файла, указанного в командной строке,
или из стандартного ввода. Выводит результат в стандартный вывод.
Программа находит пробел после числа в секундах и превращвет его в
интервал времени, прошедший с 01.10.1970 "1117906805.123 abcd...", при
этом увеличивает строку на один символ.
Использование:
cat File.txt | ThisProgram > OutFile.txt
или
ThisProgram File.txt > OutFile.txt
перестроить исходник в FreeBSD или Linux можно командой:
cc -o logtime logtime.c
logtime - исполняемая программа для Unix
logtime.c - Исходняй текст программы.
40.txt - файл для проверки работы
Можно взять архив программы тут
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
char *strToTime(char *strIn,char a);
int strInA(char const *strA,char a);
int Go(FILE *ff);
int main(int argv,char* args[])
{
int ret=0;
FILE *f;
switch(argv)
{
case 1:
ret = Go(stdin);
return(ret);
break;
case 2:
printf("Файл %s",args[1]);
f = fopen(args[1],"r");
if(f==NULL)
break;
ret = Go(f);
return(ret);
fclose(f);
break;
default: printf("\nМного параметров\n");
}
printf("Nikitushkin Alexandr sasha@toroid.net.ru\nЯ принимаю строки, max 512b\n и печатаю переведя номер, до пробела, во время, типа:\n\"1117906805.123 abcd...\"\n\
Examples:\ncat File.txt | ThisProg > OutFile.txt\nor\nThisProg File.txt > OutFile.txt\n\n");
return(-1);
}
int Go(FILE *ff)
{
char str[512],a,*sstr;
fgets(str,512,ff);
while(!feof(ff))
{
sstr = strToTime(str,' ');
printf("%s",sstr);
if(sstr!=str)
free(sstr);
fgets(str,512,ff);
}
return(0);
}
char *strToTime(char *strIn,char a)
{
char ss[128];
int istrP,i;
long l=0;
double dA;
time_t t,t1;
char *str;
struct tm *tma;
istrP=strInA(strIn,a); //получаю номер появления символа в строке
if(istrP==0)
return(strIn);
strncpy(ss,strIn,istrP); //Копирую строку для даты в ss
ss[istrP]='\0'; // Устанавливаю конец строки
t1=atof(ss); //"1117906485.847");
str = (char*) malloc(strlen(strIn)-istrP+16);
tma=localtime(&t1); //Сделал структуру с временем.
sprintf(str,"%02d%02d%02d-%02d:%02d:%02d%c%s",
tma->tm_mday,tma->tm_mon+1,tma->tm_year-100,tma->tm_hour,tma->tm_min,tma->tm_sec,a,strIn+istrP);
return (str);
}
int strInA(char const *strA,char a)
{
char *sstr;
int istrP;
sstr=strchr(strA,a);
if(sstr==NULL)
return(0);
istrP = (int)(sstr-strA+1);
return(istrP);
}
}
Tщё пару замечаний:
1. *** glibc detected *** double free or corruption (!prev): 0x09ecf008 ***
Aborted - Аккуратней с памятью!
2. Это простая задача, которую я решал на сях лет 5 назад. Не имеет смысла писать это на С - больше геммора, как видите однострочник на perl'e всё решил.
3. sprintf(str,"%02d%02d%02d-%02d:%02d:%02d%c%s", tma->tm_mday,tma->tm_mon+1,tma->tm_year-100,tma->tm_hour,tma->tm_min,tma->tm_sec,a,strIn+istrP);
Шо це було? Чёрт с ними миллисекундами! strftime и вперед.
4. Строка 27: return(ret);
fclose(f);
Выходим из программы, а потом закрываем файл :) - круто.
5. Что за код возврата (-1) ?
6. Зачем эта консрукция:
ret = Go(f);
return(ret);
если функция Go(FILE* ff) в любом случае возвращает 0?
7. Если это первая программа, то не спорю, нормально: есть идея и реализация, она прихрамывает, но всё же.