이 글은 메일의 구조이므로 처음부터 뒤로 해서 봐야 합니다.

 

 

 

 

 

 

아파치의 rotatelog 는 과거에서 미래로 시간 정보(date)가 바뀌면 파일이 바뀌는데, 미래에서 과거로 가게되면, 파일이 안바뀌는 문제가 있었습니다..

 

 

오늘 약간 제가 시간이 되어 확인해 보니...

제가 cronolog를 이용하니, 밑의 메일에서 보이는 고질적인(?) 문제가 그대로 재현되어 사용에 대한 어려움이 있습니다.

 

그래서, 차라리 rotatelog를 수정하는 것이 좋을 듯 해서 소스를 수정하였습니다.

이 소스는 관리자에게 주면 소스 컴파일해서 설치하면 자연스럽게 사용할 수 있습니다.

 

테스트는 다음과 같이 하였습니다.

시간을 변경하였습니다.   [현재 -> 미래 -> 현재]

테스트 서버는 e65002서버입니다.

 

[e65002:/root]# /usr/bin/rdate -s time.naver.com
[e65002:/root]# date 01161111
2008. 01. 16. (
¼ö) 11:11:00 KST
[e65002:/root]# /usr/bin/rdate -s time.naver.com

 

[e65002 /home/www/src/httpd-2.0.59/support]# ./rotatelogs aaa-%y%m%d 86400
today is 1 15
today is 1 15

<시간을 변경함 15->16>
16th changed
16th changed 
n
n
n

<시간을 변경함 16->15>
today is 1 15
today is 1 15

 

 

결과 파일

[e65002 /home/www/src/httpd-2.0.59/support]# cat aaa-080115
today is 1 15
today is 1 15
today is 1 15
today is 1 15
[e65002 /home/www/src/httpd-2.0.59/support]# cat aaa-080116
16th changed
16th changed
n
n
n

  


원인은 시간정보와 관련이 있었습니다.

 

소스에서는 now, start, end (이름은 그냥 편하게 축약했습니다.)라는 변수를 사용합니다.

 

파일을 write할때마다 end 변수에 시간정보를 저장합니다.

end변수와 현재 시간정보를 비교합니다.

 

Now(현재 시간정보) end(과거에 저장되었던 시간정보)와 비교하여 만약 크면,, 파일을 생성하게 됩니다.

 

과거 (11 20) -> 현재 (11 23)

Now             11 20             11.23

End              11.20                   11.20

ð  파일 생성

 

미래 (11 29) -> 현재 (11 23)

Now             11 29             11.23

End              11.29                   11.29

ð  파일 생성하지 않음

 

개발 저자는 과거정보에서 미래로 가는 시점에만 체크하도록 되어 있고, 미래에서 과거로 가는 경우는 체크를 안해놨네요..

 

개인적으로 심심할 때, 수정이 가능한지 살펴보았겠네요.

 

 Cronlog는 테스트를 해보죠..^^

 ========================================

 

 

 

 

시나리오1

 

 실행 중간에 시간이 과거로 갔다가 현재로 돌아옴

 

실행

1) rotatelogs lcs_access_log.%Y%m%d%H 3600 +540

2) date 112001002007

1, 2,3, 4까지 입력

3) /usr/bin/rdate -s time.naver.com

1111, 2222입력

 

-rw-r--r--   1 www  www     16 11¿ù 20 01:00 lcs_access_log.2007112001

-rw-r--r--   1 www  www     19 11¿ù 23 11:49 lcs_access_log.2007112311

 

결과

원하는 결과 도출

[e65004 /home/www/src/httpd-2.0.59/support]# cat lcs_access_log.2007112001

1

2

3

4

[e65004 /home/www/src/httpd-2.0.59/support]# cat lcs_access_log.2007112311

1111

2222

ð  원하는 결과 나옴

 

 

 

시나리오2

실행 전부터 시간이 예전시간, 현재로 돌아옴

 

 

-rw-r--r--   1 www  www      8 11¿ù 20 01:00 lcs_access_log.2007112001

-rw-r--r--   1 www  www     10 11¿ù 23 11:53 lcs_access_log.2007112311

결과

원하는 결과 도출

[e65004 /home/www/src/httpd-2.0.59/support]# cat lcs_access_log.2007112001

1

2

3

4

[e65004 /home/www/src/httpd-2.0.59/support]# cat lcs_access_log.2007112311

1111

2222

ð  원하는 결과 나옴

 

 

시나리오3

실행 전부터 시간이 미래시간, 현재로 돌아옴

 

[e65004 /home/www/src/httpd-2.0.59/support]# cat lcs_access_log.2007112901

1

2

3

4

5

11111

2222

3333

 

ð  문제 발생

 

진짜 문제 있었습니다. 이 부분을 집중적으로 봐볼께요..

 

 

 -----------------------------------------

 

 

현재 상황으로는 아파치의 rotatelog는 현재 시간에 너무 밀접한 관계를 가지니까. 시간 셋팅에 대한 CRON job이 제대로 ㅣ되어 되어 있는지 확인을 해봤으면 좋겠습니다.

 

Logh-g001 서버 의 irteam 계정을 통해서 본 cron은 다음과 같습니다.

 

다른 서버의 경우는 root www에 아래와 같은 cron job이 있습니다.
이것이 제대로 셋팅되어 있는지 root 관리자에게 함 물어봐주세요..^^

13 * * * * /usr/sbin/ntpdate -s time.google.com

 

 

 

================================

 

약속한 대로 오늘 내로 파악했습니다. 아파치 메소드가 많아서 의미 파악하는데 시간이 조금 소요되었습니다.

 

Rotatelog rotatelog.c 라는 파일이구요. Lucy 어느 서버에나 다음에서 보실 수 있습니다.

 

/home/www/src/httpd-2.0.59/support]# cat rotatelogs.c

 

실제 아파치 httpd.conf 소스

/home1/irteam/google/apache/bin/rotatelogs /home1/irteam/googleapache/logs/lcs_access_log.%Y%m%d%H 3600 +540

 

동작원리는 다음과 같습니다.

 

무한대 {

먼저 입력을 받는다.

현재시간 정보(시스템)를 얻어와서 “lcs_access_log.%Y%m%d%H”파일를 있는지 확인하고, 없으면 생성한다. 파일이 있으면 append한다.

해당 파일을 연다. 입력된 값을 저장한다.

파일을 close한다.

}

아시겠지만, 3600 rolling하는 시간입니다. +540 utc_offset입니다. 모두 파일이름과 관련된 부분에만 관련하고 있습니다.

 

시간 정보를 얻어오는 부분은 다음과 같습니다.

apr_time_now()함수입니다.

 

아파치 2 apr 1.2.;11을 쓰고 있지요.

Apache Portable Runtime (APR) version 1.2.11

 

/* NB NB NB NB This returns GMT!!!!!!!!!! */

APR_DECLARE(apr_time_t) apr_time_now(void)

{

    struct timeval tv;

    gettimeofday(&tv, NULL);

    return tv.tv_sec * APR_USEC_PER_SEC + tv.tv_usec;

}

 

NB 뜻은 nota bene의 약자입니다. 구글링을 해보니.. Nota Bene is a Latin phrase meaning "Note Well," 이렇게 나오는군요.

중요한 것은 그게 아니고…

 

Gettimeofday 라는 함수입니다. 결국 커널로부터 시간정보를 얻어오네요.

http://www.joinc.co.kr/modules/moniwiki/wiki.php/man/2/gettimeofday

http://man.cx/gettimeofday(2)/ko

 

gettimeofday라는 함수가 첫번째 파라미터에 null을 넣지 않고, 두번째 파라미터에 null을 넣었습니다.

이것은 계속 변할 수 있는 값을 의미합니다.

 

이정도면 되겠는지요??

 

시스템 시간이 바뀌면 rotatelog에서 로깅하는 파일 시간도 바뀝니다…^^

 

만약 시스템 시간에 무관하게 찍을 려면, rotatelog를 수정해야 할 것 같네요. Apr apr_time_now() 함수를 다른 것으로 대체해야 할 듯으로 보입니다.

 

'unix and linux' 카테고리의 다른 글

bash 스트링 조작하기  (0) 2008.01.18
고급 Bash 스크립팅 가이드  (0) 2008.01.18
rotatelog.c 버그 수정해놓기  (0) 2008.01.16
getopt() 함수  (0) 2008.01.16
ssldump 설치하기  (0) 2008.01.04
모든 파일 안의 문자열 치환하기  (0) 2007.12.31
Posted by 김용환 '김용환'

댓글을 달아 주세요