ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 

  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА














     АРХИВ :: Apache-Talk
Apache-Talk mailing list archive (apache-talk@lists.lexa.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [apache-talk] Rotating logs





Igor Sysoev wrote:

> Dmitry Morozovsky wrote in message ...
>
> >AL> я думал можно заставить Апач без перезапуска ротэйтить.
> >
> >graceful вместо restart -- и все в порядке, только надо подождать, пока
> >все детки закончат в логи писать (их легко вычислить по Zombie status)
>
> На самом деле, не все в порядке. Есть некоторые наблюдения, что
> некоторые модули апача при получении сигнала (как graceful, так и hup)
> иногда не освобождают некоторую память, что ведет в memory leak.
> У меня, например, иногда такое случается - через некоторое время
> папа начинает набирать по килобайт двести после каждого сигнала.

А почему так сложно сигналы и др
Почему не направить лог в трубу и разобрать его
Маленькая программа не шедевр но работает вроде
Получилась последовательным ломанием rotatelogs.c
//------------------------------------------------------------------------------------

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>

#define BUFSIZE         128ul*1024ul
#define TIMEBUFSIZE     1024
#define MAX_PATH        1024
int Mon(char *buf){
char *mon[]={
 "jan"
,"feb"
,"mar"
,"apr"
,"may"
,"jun"
,"jul"
,"aug"
,"sep"
,"oct"
,"nov"
,"dec"
};
int i;
   if(buf[0]>='A'&& buf[0]<='Z')buf[0]=(buf[0]-'A')+'a';
   if(buf[1]>='A'&& buf[1]<='Z')buf[1]=(buf[1]-'A')+'a';
   if(buf[2]>='A'&& buf[2]<='Z')buf[2]=(buf[1]-'A')+'a';
   for(i=0;i<12;i++){
       if(buf[0]==mon[i][0]&& buf[1]==mon[i][1] && buf[2]==mon[i][2])return i+1;
   }
   perror("bad date");
return 0;
}

char       buf[BUFSIZE];

int main (int N, char **arg){
char       timebuf[TIMEBUFSIZE];
char       filename[MAX_PATH];
int        file;
int        size;
char      *userfilename;
char      *userfileext;
int        mon;
int        log_mon;
int        day;
int        year;
char      *ret;
char       buf_mon[16];

    /*----------------------------------------------------------------------*/
    tzset();
    file         =-1;
    buf[0]       ='\0';
    filename[0]  ='\0';
    userfilename ="./";
    userfileext  ="";
    timebuf[0]   ='\0';
    mon          =0;
    log_mon      =0;
    day          =0;
    year         =0;
    /*----------------------------------------------------------------------*/

    if(N < 2){
       fprintf(stderr,
               "%s <logfile>  <logfileext>\n\n",
               arg[0]);
       fprintf(stderr,
               "Add this:\n\nTransferLog \"|%s /some/where  .log\"\n\n",
               arg[0]);
       fprintf(stderr,
               "to httpd.conf. The generated name will be /some/where.nnnn "
               "where nnnn is the\nsystem time at which the log nominally "
               "starts (N.B. this time will always be a\nmultiple of the "
               "rotation time, so you can synchronize cron scripts with it).\n"
               "At the end of each rotation time a new log is started.\n");
       exit(1);
    }

    userfilename = arg[1];
    if(N >= 3)userfileext  = arg[2];

    /*----------------------------------------------------------------------*/

    while(1){
        buf[0]='\0';
        ret=fgets(buf,sizeof buf, stdin);
        if(ret==NULL)exit(3);
        //if(ret==EOF)exit(3);
        size=strlen(buf);
        if(size == 0)exit(3);
        /*-----------------------------------------------------------------*/
        sscanf(buf,"%*s %*s %*s %s",timebuf);
        if(timebuf[0]=='[')timebuf[0]=' ';
        buf_mon[0]='\0';
        sscanf(timebuf
              ,"%2d/%3s/%4d"
              ,&day,buf_mon,&year);
        mon=Mon(buf_mon);
        /*-----------------------------------------------------------------*/
        if(file >= 0 && mon != log_mon){
            close(file);
            file = -1;
        }
        if(file < 0){
            log_mon=mon;
            sprintf(filename, "%s%04d%02d%s", userfilename, 
year,mon,userfileext);

            file=open(filename, O_WRONLY | O_CREAT | O_APPEND, 0666);
            if(file < 0){
               perror(filename);
               exit(2);
            }
        }
        /*-----------------------------------------------------------------*/
        if(write(file, buf, size) != size){
           perror(filename);
           exit(5);
        }
    }
/*return 0;*/
}
//--------------------------------------------------------------------------------

--
---------------------------------------------
Andrey Vladimirovich Shadrin
mailto:av@tsbgu.nnov.su
tel:+7 (8312)319654 fax:+7 (8312)319656
B.Pokrovskaya,26a,N.Novgorod,Russia,603000
---------------------------------------------


=============================================================================
=               Apache-Talk@lists.lexa.ru mailing list                      =
Mail "unsubscribe apache-talk" to majordomo@lists.lexa.ru if you want to quit.
=       Archive avaliable at http://www.lexa.ru/apache-talk                 =



 




Copyright © Lexa Software, 1996-2009.