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 =