반응형

출처 : http://cafe.naver.com/q69/5103

 

로그파일이란 ?


 

웹 서버를 관리하는 사용자에게 있어서 시스템의 성능은 상당히 중요한 문제로 인식되고 있으며, 로그 정보 와 시스템의 모니터링은 웹 서버의 성능을 파악하는데 중요합니다. 웹 서버를 운영하는 관리자들은 아파치의 확장된 로깅기능을 이용하여 웹 서버의 활동을 살펴볼 수가 있습니다. 기본적으로 아파치에서는 다음과 같은 로그파일 등을 제공하였습니다.

 

n        에러로그

n        접속 로그

n        에이전트 로그

n        참조로그
 

에러로그에는 웹 서버 운영시에 발생되는 로그 및 CGI 와 같은 스크립트의 에러가 기록되게 되며, 우리가 생각하는 대부분의 접속 정보중의 하나인 access.log 에는 서버로부터 전송되어 지는 정보가 기록되어 집니다. 사용자가 사용한 브라우저 정보는 에이전트 로그에 쌓이며 , 참조로그는 외부의 어떤 URL 을 참조하여 들어올 경우 설정이 되어 지게 됩니다.


 

그러나, 지금 아파치 1.3.X 에 와서는 이렇게 나누어져 있는 것이 크게 의미는 없습니다. 왜냐하면, mod_log_config 모듈이 기본 access 로그를 대체하여 설정을 하게 되어져 있기 때문입니다.

 

 

자아 그럼 에러로그 파일부터 하나 하나 살펴볼까요 ?
 

에러로그 파일은 ErrorLog 지시어를 이용하여 아파치 웹 서버 운영시에 발생되는 모든 에러를 어디에 기록할지를 지정하는 것입니다. 이것은 기본으로 포함하고 있는 지시어이며, 디폴트로 설정되는 로그파일의 경로는 여러분들이 아파치를 설치한 <아파치 서버의 루트>/logs/error_log 가 됩니다. 만약 에러로그를 설정하지 않을 경우라 하더라도 다음과 같은 위치에 로그를 남기게 됩니다.
 

             ErrorLog            /var/log/httpd/error_log

 

로그파일을 남기지 않는 방법은 없나요 ?

  ErrorLog  /dev/null 와 값이 /dev/null 을 이용하시면 간단합니다.

 

유닉스를 사용해 보신 분들은 아시겠지만 시스템로그와 관련하여 로그 데몬인 syslog 가 있습니다. 이 것을 언급하는 이유는 ErrorLog 를 통하여 로그를 남기는 것이 아니라 syslog 쪽으로 로그를 리다이렉트 시킬 수도 있다는 점입니다.


 

로그를 남기는 방법에도 시스템의 syslog 와 마찬가지로 가장 하단의 debug 에서부터 최상위인 Emerg 까지 8 개의 범주를 가지고 있습니다. 로그레벨은 다음과 같이 LogLevel 을 통해 레벨을 결정하며, debug 와 같은 레벨을 선택하게 되면 아파치에서 발생하는 모든 에러메시지와 간단한 내용들도 로그에 남게 되므로, 자원의 공간 및 프로세스 타임을 낭비하는 결과를 초래하게 됩니다. 


 

             LogLevel            debug

 

다음 <표> 는 로그레벨을 나타낸 것입니다 :

로그레벨

에러의 의미

Emerg

불안정한 시스템 상황

Alert

즉각적인 조치 필요

Crit

중대한 에러

Error

비교적 중대하지 않은 에러

Warn

경고

Notice

중대한 것은 아닌 일반적인 메시지

Info

정보

Debug

디버그 레벨

 

 

다른 프로그램들과 마찬가지로 아파치 웹 서버 또한 로그 파일을 syslog 로 보낼 수 있다 하였는데 어떻게 하는 것인지 잠깐 알아보고 가겠습니다. ErrorLog 지시어에 에러 로그파일의 위치 경로를 넣었었는데, 이것 대신 syslog 문자열로 대체를 해야만 syslog에서 로그를 남길 수가 있답니다.


 

             ErrorLog syslog

 


디폴트로, 아파치 로그는 syslog에 local7 의 이름을 통해 에러가 기록되게 되며 syslogd 가 어떠한 에러 정보를 받을 것인지에 대해 지정하는 syslog.conf에서 제어가 됩니다. 전형적인 syslog.conf 는 다음과 같은 라인을 가지게 됩니다 :


 

local7.*                                         /var/log/httpd.log


물론 local7.* 과는 달리 위에서 잠깐 언급하였던 로그레벨에 기반 해서 로그를 따로 저장할 수가 있습니다. 리눅스를 포함한 유닉스 시스템은 아파치에서 사용하는 로그레벨과 같은 같은 등급의 구조를 가지고 있기 때문에 syslog.conf 에서의 적용도 같은 효과를 미치게 됩니다.


Local7.warn                                                /var/log/httpd.warn_log


Local7.debug.!=notice                                /var/log/httpd.error_log


 

이것은 warn 로그레벨이상의 정보를 httpd.warn_log에 저장하고, debug 보다 높으며 notice 이하의 내용을 httpd.error_log에 기록하게 됩니다.

웹 서버 문제 발생시에는 우선 에러로그를 먼저 살펴보세요!

아파치 웹 서버를 처음 접하시는 초보 사용자 분들이 설치를 하신후 얘기치 못한 문제에 봉착하여 에러메세지를 받고 당황하실 수 있습니다. 그러나 이러한 내용의 대부분은 에러로그를 찾아봄으로써 문제의 대부분을 해결하실 수 있답니다.


지금까지는 문제를 해결하는 데 중요한 역할을 하고 있는 에러로그 파일에 대해서 알아보았고 다음은 사용자 정보를 수집하는데 있어서 큰 역할을 담당하고 있는 접속로그를 알아보겠습니다.


 

이 로그는 여러분들께서 많이 접해보셨던 access 로그로도 알려져 있으며 서버로부터 HTTP 프로토콜을 통하여 전송된 각각의 정보들이 요약되어 기록되어져 있습니다. 이번 주제인 방문자 정보를 알아내기 위하여서는 이 정보가 중요하기도 하지만, 에러로그와 달리 이 로그는 어찌 보면 사용자 접속이 아주 많은 사이트와 같은 곳에서는 로그를 처리하기 위하여 많은 공간과 시간을 필요로 하기 때문에 필요하지 않을 수 도 있습니다. 달리 보아 생각하면 접속이 많은 경우 사업에 있어서 더 중요한 정보가 될지도 모르겠지만요 여하튼 엑세스 로그를 남기느냐 아님 그렇지 않느냐는 여러분들의 자유에 맡기도록 하겠습니다.


전송로그는 TransferLog 지시어를 사용하여 어느 위치에 로그를 남길 것인지 결정합니다 :


             TransferLog                                  /var/log/access_log


웹 서버의 접속로그인 access_log에는 CLF(Common Log Format) 기본포맷으로 내용이 저장되어 집니다. 뒤에서 다루게 될 CustomLog 에 의해 따로 로그포맷이 지정되어 지지 않으면 바로 이것을 사용한다는 것이며, 대부분의 웹 서버는 이 방식을 표준으로 사용하고 있습니다.


CLF 의 기본포맷은 각 클라이언트 요청에 한 라인으로 구성 되어 있으며, 각 라인은 공백에 의해 7 개의 아이템으로 구분되어 집니다.


             host ident authuser date request status bytes

 


각 아이템에 값이 주어지지 않을 경우에는 하이픈(-) 으로 표시되어 지며, 각 아이템이 의미하는 바는 다음 <표 > 와 같습니다.

 

아이템

의미

Host

클라이언트의 호스트이름이나 IP Address

Ident

IdentityCheck 가 enable 되어 있고, 클라이언트가 ident 에 응답을 보내면 identity 정보를 남기게 되며, 보통은 -로 대체된다.

Authuser

인증이 있을 경우 여기에 사용자 이름이 기록되게 되며, 그렇지 않을 경우 - 로 대체된다.

Date

접속한 시간과 날짜를 나타내며, 포맷은 다음과 같다 :

날짜포맷 = [day/month/year:hour:minute:second zone]

               day = 2*digit

               month = 3*letter

               year = 4*digit

               hour = 2*digit

               minute = 2*digit

               second = 2*digit

               zone = (`+' | `-') 4*digit

Request

클라이언트가 요청한 자료

Status

요청한 것에 대한 서버의 처리사항으로 상태 코드라 한다.

Bytes

헤더를 제외한 전송된 Byte 양


다음은 실제 웹 서버의 로그파일의 일부분 입니다 :


203.251.189.47 - - [03/Aug/2000:21:56:55 +0900] "GET /doc/images/sub.gif HTTP/1.1" 200 6083

203.251.189.47 - - [03/Aug/2000:21:56:55 +0900] "GET /doc/images/index.gif HTTP/1.1" 200 1540

203.251.189.47 - - [03/Aug/2000:21:57:25 +0900] "GET /doc/mod/directives.html HTTP/1.1" 200 11339

203.251.189.47 - - [03/Aug/2000:21:57:25 +0900] "GET /doc/images/home.gif HTTP/1.1" 200 1465

211.52.197.57 - - [03/Aug/2000:21:57:26 +0900] "POST /cgi-bin/bbs HTTP/1.1" 200 3840


      기본로그포맷에 대해서 살펴보았으니,  사용자에 의해 정의 될 수 있는 로그포맷에 대해서알아보겠습니다.


LogFormat 지시어를 이용하면 기본 포맷인 CLF 의 포맷을 변경할 수가 있습니다. 이 뜻은 기본 포맷방법 대신 여러분들이 좀더 이해하기 쉬운 형식으로 만들 수 있다는 것입니다.


             LogFormat          %h %l %u %t %r %>s %b


많이 쓰이지 않는 ident 와 authuser 아이템 등을 빼 놓음으로써 좀더 효율적인 로그파일을 만들어 볼 수도 있으며 다음의 예는 에이전트와 참조 로그를 한 로그파일에 만든 것 입니다.


 

LogFormat  %h %l %u %t %r %>s %b %{Referer}i %{User-Agent}i 


로그포맷에서 사용하는 포맷은 다음과 같습니다 :

포맷


의미

%a

원격지 IP 주소

%A

로컬 IP 주소

%B

HTTP 헤더를 제외하고 전송된 바이트

%b

HTTP 헤더를 제외하고 전송된 바이트. CLF 포맷에서는 , 전송된 것이 없을 경우 0 으로 표시하기 보다는 - 로 표시한다.

%{FOOBAR}e

서버에 의해 지정된 환경변수

%f         

파일 이름

%h         

원격지 호스트

%H                    

요청한 프로토콜

%{Foobar}i

Foobar 의 내용: 클라이언트에서 서버로 요청된 헤더라인으로 예를 들자면, Referer 헤더일 경우 %{Referer}i 로 사용되어 진다. 

%l         

원격지 사용자이름 (이것이 사용되어 지기 위해서는 IdentityCheck 가 반드시 enable 되어져 있어야 한다)

%m                    

요청방식

%{Foobar}o

서버에서 응답되어 지는 HTTP 헤더. 예를들면 :

%{Content-Type}o, %{Last-Modified}o

%p         

요청을 처리하는 서버의 참조적인 포트

%P        

현 요청을 처리하고 있는 아파치 자식 프로세서의 프로세스 ID

%q                     

쿼리 문자열 (쿼리가 있을 경우 ? 뒤로 쿼리문이 포함되며 그렇지 않을 경우 공백으로 처리된다)

%r         

HTTP 메소드를 포함한 요청의 첫 라인

%s         

HTTP 상태코드. 만약 클라이언트의 요청이 내부적인 리다이렉트를 발생시켰을 경우 %s 는 초기 요청의 상태코드를 %>s 는 최종상태 코드를 포함하게 된다. 일반적으로, %s 의 사용 보다는 %>s 가 유용하다.

%t         

요청한 시간과 날짜 (standard english format)

%{format}t

strftime() function 을 이용한 포맷형식에 따른 시간

[Day/Month/Year:Hours:Minutes:Seconds Time Zone]

%T        

요청을 처리하는데 걸린 시간 (초)

%u         

인증이 요청된 원격 사용자 이름

%U        

요청된 URL

%v         

요청을 처리하는 서버의 참조적인 서버 이름

%V        

UseCanonicalName 설정에 따른 서버 이름


CustomLog 는 위에서 배운 TransferLog 와 LogFormat 을 하나로 합쳐놓은 지시어라 쉽게 생각하시면 됩니다. 그럼 예를 하나 들어보겠습니다. 이것은 참조로그를 만들어 보는 것입니다.


포맷 :

CustomLog         logfile    format|nickname env=[!]environment-variable


             CustomLog        /logs/referrer_log %{Referer}I -> %U


 

여기서 꼭 알아야 할 한가지는 HostNameLookups 가 1.3.X 대에서는 기본으로 Off 로 설정되어져 있어 로그파일에는 도메인 네임 대신 IP로 로그가 남게 된다는 것입니다. 아파치 웹 서버의 성능을 위하여 이 기능은 Off로 설정하여 사용하시는 것이 바람직 하며 로그분석시에는 logresolve 를 통하여 로그파일 안의 IP를 도메인으로 변경할 수 있습니다.


 

사용방법 : logresolve [-s filename] [-c] < access_log > new_log


CustomLog 또는 LogFormat 을 이용한 방법에는 각각의 모든 요청에 대해서 항상 로그를 남기기 때문에 시간의 소비와 불필요한 정보까지 남기게 된다는 점이 있습니다. 최근에는 HTML 파일 안에 이미지 파일이 들어가는 경우가 아주 많으므로 수백 수천의 페이지가 엑세스가 되어지는 경우 그에 따른 이미지 파일 또한 같이 로그에 포함되게 된다는 점입니다.


이에 대한 해결은 아파치의 또 다른 모듈을 같이 이용하면 해결할 수 있습니다.


다음은 mod_setenvif 모듈 기능을 이용하여 응용한 것입니다.


(ㄱ)  SetEnvIf Request_URI .gif$ gif-image

(ㄴ)  CustomLog gif-requests.log common env=gif-image

(ㄷ)  CustomLog nongif-requests.log common env=!gif-image

(ㄹ)  LogFormat %h %l %u %t %r %>s %b common

(ㅁ)  SetEnvIf Request_URI .gif$ image=gif

(ㅂ)  SetEnvIf Request_URI .jpg$ image=jpg

(ㅅ)  CustomLog logs/access_log common env=!image


(ㄱ) ? (ㄷ) 까지는 Gif 이미지를 gif-requests.log 에, 그 이외의 것은 nongif-requests.log 에 저장하는 것이며,  나머지 (ㄹ)-(ㅅ) 은 CLF 포맷으로 이미지 파일인 gif,jpg 를 제외한 로그를 access_log 에 남기라는 의미입니다.


SetEnvIf Referer www.apache.kr.net apache_site_referral


www.apache.kr.net 을 통해서 들어오게 되면 apache_site_referral 변수를 설정하여 로그를 남길 수도 있습니다.


주의 !

SetEnvIf[NoCase]에 의한 환경 변수 지정은 CustomLog 와 같이 변수를 이용한 저장을 할 경우 CustomLog 지시어 전에 설정이 되어 있어야 합니다.


어떠세요 ? 아파치에서 제공하는 여러 모듈등을 응용하여 사용하니 아주 다양하게 설정할 수가 있죠. 그럼 이번에는 가상호스트를 많이 운영하시는 분들을 위하여 여러 개의 로그파일을 하나의 파일로 만드는 방법을 알려드리도록 하겠습니다.
 

             LogFormat %v [%A:%p] -> %h %l %u %t %r %>s %b virtualhost


             CustomLog logs/access_log virtualhost


이것은 기본 로그포맷 앞에 canonical name 과 IP 주소, 포트번호를 나타내는 추가적인 정보가 더 기술되어져 있습니다. 이러한 방식을 통한 운영은 모든 가상호스트 마다 개별적인 로그파일을 만들 경우 동시에 파일을 열수 있는 개수 등이 제한되어져 있는 것과 같은 경우에 효율적으로 사용할 수가 있습니다. 물론 관리자가 여러 명 이거나 할 경우에는 이러한 방식이 더 부 적당할 수도 있습니다.

 


로그파일 알맞게 잘라내기

 


웹 서버를 운영하면서 겪는 문제중의 하나가 한도 끝도 없이 커지는 로그파일 문제입니다.대부분의 많은 분들께서는 특별한 설정 없이access_log 와 같이 하나의 파일로 설정해 사용하고 계실 것으로 생각되어 집니다. 한 파일의 용량이 커지면 관리하기도 힘들고 불편한 점이 한두 가지가 아니죠 ? 그렇다면 지금 이 글을 읽어 보시고 방법을 한번 바꾸어 보시지 않겠어요?


아파치 웹 서버는 이러한 것을 염두해 두고 관련 파일을 제공해 주고 있습니다. 유심히 살펴 보신 분들은 아시겠지만 src/support 안에서 찾아보실 수 있습니다.
 

그 중의 하나인 rotatelogs 프로그램은 아파치 웹 서버를 죽이지 않고 로그파일을 나눌 수 있는 기능을 가진 간단한 프로그램이며, 다음과 같이 아파치의 파이프라인(|)기능 을 이용하여 쉽게 적용하실 수가 있습니다 :
 

             TransferLog "|rotatelogs   /path/to/logs/access_log   86400"


              마지막 86400 은 로그파일 경로                         나눠질 시간 (초) 입니다.


 

/path/to/logs/access_log.nnnn 과 같이 만들어지며 로그파일 뒤에 붙은 nnnn 은 만들어진 시간이 자동으로 뒤에 붙게 되는 것입니다. 여기 예에서는, 86400(24 시간) 초 뒤에 새로운 로그파일이 생성되어 지도록 되어 있군요.


,다른 프로그램을 알아볼까요 ? rotatelogs 와 비슷한 cronlog 라는 것이 있습니다.


사용법은 비슷하며, 일별 또는 월별로 나눌 수 있다는 장점이 있습니다.

TransferLog "|/www/sbin/cronolog /www/logs/%Y/%m/%d/access.log"
ErrorLog    "|/www/sbin/cronolog /www/logs/%Y/%m/%d/errors.log"

       (%Y,%m,%d 는 차례로 년, 월,  일을 나타냅니다.)

 


데이트 포맷방식은 유닉스의 date 포맷과 같으니 man date로 참고하여 사용하시기 바랍니다.  Cronlog를 통하여 생성된 로그는 다음과 같습니다 :

/www/logs/1997/01/01/access.log
/www/logs/1997/01/01/errors.log


 

cronlog 를 사용하기 전에 주의해야 점은 아파치 1.2 이전 버전에서는 이 것을 사용할 수 없다는 점입니다. 잊지마세요!


위에서 LogFormat을 이용하여 여러 개의 가상호스트 로그를 하나로 만드는 부분이 있었는데 기억하시죠 ? 하나의 파일에 모여있는 경우 아파치 웹 서버에서 제공해 주고 있는 split-logfile 스크립트를 이용하시면 %v를 기반으로 %v의 이름.log 와 같이 따로 로그파일을 만들 수도 있습니다.


알고 보니 제공해 주는 기능이 참 많죠. 이래서 많은 사용자들이 아파치 웹 서버를 사용하는 이유가 아닐까 생각합니다. ^^

 

cronlog는 다음의 사이트에서 구할 수 있습니다

http://www.apache.kr.net/dist/log-analyzer/cronolog-1.6.1.tar.gz


HTTP/1.1에서 정의된 에러코드는 다음 <표 > 와 같습니다.

상태코드

설명

상태코드

설명

100 

Continue

404

Not Found

101

Switching Protocols

405

Method Not Allowed

200

OK

406

Not Acceptable

201

Created

407

Proxy Authentication Require

202

Accepted

408

Request Time-out

203

Non-Authoritative Information

409

Conflict

204

No Content

410

Gone

205

Reset Content

411

Length Required

206

Partial Content

412

Precondition Failed

300

Multiple Choices

413

Request Entity Too Large

301

Moved Permanently

414

Request-URI Too Large

302

Moved Temporarily

415

Unsupported Media Type

303

See Other

500

Internal Server Error

304

Not Modified

501

Not Implemented

305

Use Proxy

502

Bad Gateway

400

Bad Request

503

Service Unavailable

401

Unauthorized

504

Gateway Time-out

402

Payment Required

505

HTTP Version not supported

403

Forbidden

색깔이 들어가 있는 부분은 HTTP 1.0 에서 지원하는 코드 입니다.


로그분석 툴 소개

 


로그파일에는 CLF 포맷을 기반으로 또는 사용자에 의해 지정된 형식으로 운영자에게 다양한 정보를 제공해 주고 있기는 하지만, 기록된 내용만 가지고서는 전체적인 통계 등을 파악하기에는 힘이 듭니다. 바로 이러한 것들을 좀더 손쉽게 처리하기 위하여 여러분들이 흔히 알고 있는 웹트랜즈와 같은 웹 서버 로그 분석 프로그램을 이용하여 다양한 정보를 한눈에 파악해 볼 수가 있습니다. 여러 다양한 웹 로그분석 프로그램 중에 자유롭게 널리 사용되어 지고 있는 WebAlizer 프로그램을 알아보고자 합니다.


알아보기 전에 한가지 알아두셔야 할 점은, 분석된 결과 자료에만 너무 의존하지 말아야 한다는 점입니다. 어떤 페이지가 얼마나 방문 되었고 하는 정보를 정확히 알려줄 수 있을까요 ? 물론 수치상으로 기록된 정보로는 그렇지만 , 프록시 캐쉬 등을 통한 경우에는 웹 서버에 직접적으로 접근하지 않으므로 로그에 기록되지 않습니다.


자 그럼 본격적인 로그분석 여행을 떠나볼까요 ?


로그분석을 본격적으로 진행하기 전에 무엇보다도 필요한 것이 있겠죠. 바로 webalizer 프로그램 소스입니다. 제가 이미 apache.kr.net/dist/log-analyzer에 넣어두었으니 다운로드 받으시기 바랍니다.


Webalizer 의 컴파일은 다음과 같은 순서로 진행하시면 됩니다.


*잠깐 ! 컴파일 하시기 전에 여러분들의 시스템에 GD 라이브러리가 설치되어져 있는지 확인해 보시기 바랍니다. GD 라이브러리는http://www.boutell.com/gd 에서 구할 수가 있습니다. GD 라이브러리가 없을 경우 libgd not found 에러를 얻게 됩니다.
 

       ./configure

       make

       make install


 

사용방법 : webalizer [options] [log_file]


로그를 분석하기 위한 방법은 다음과 같은 방법으로 아주 간단하게 수행할 수가 있습니다.


webalizer /home/httpd/logs/access_log
 

이것은 /home/httpd/logs 밑에 결과값을 출력하게 되며, -c 옵션을 이용하면 특정 설정파일을 지정하여 좀더 다양하게 결과값을 조절할 수가 있습니다.


 

             webalizer -c somehost.conf
 

이렇듯 설정파일을 지정할 수가 있기 때문에 여러 웹 사이트를 운영하는 곳에서는 그 사이트에 맞는 환경을 지정하여 로그를 분석할 수가 있기 때문에 효율적으로 운영할 수가 있습니다. 기본적으로 LogFile , OutputDir 설정 정도만 하시면 간단히 이용 하실 수 있습니다.
 

분석이 끝난 후에는 설정파일에서 지정한 OutputDir 에 분석한 내용들이 들어가게 되며, 브라우저를 통해 접속하시면 <그림> 과 같이 상세한 방문자 정보를 얻으실 수 있습니다.


또한, 스크립트를 만들어 넣어두면 주기적으로 일,월별로 로그분석을 할 수가 있습니다. 다음은 스크립트의 한 예를 다룬 것으로 여러분들의 환경에 맞추어 변경하시면 됩니다. 이 예는 webalizer 에 포함된 것으로서, 웹 서버의 작동을 중지한 다음 다시 시작하도록 되어 있으나 지금까지 위에서 배웠던 내용들을 응용하시면 사용자에게 일,월별로 로그분석을 제공해 줄 수가 있습니다.
 

< rotate_logs >



#!/bin/sh


# halt the server


kill `cat /var/lib/httpd/logs/httpd.pid`


# define backup names


OLD_ACCESS_LOG=/var/lib/httpd/logs/old/access_log.`date +%y%m%d-%H%M%S`


OLD_ERROR_LOG=/var/lib/httpd/logs/old/error_log.`date +%y%m%d-%H%M%S`


# make end of month copy for analyzer


cp /var/lib/httpd/logs/access_log /var/lib/httpd/logs/access_log.backup


# move files to archive directory


mv /var/lib/httpd/logs/access_log `echo $OLD_ACCESS_LOG`


mv /var/lib/httpd/logs/error_log  `echo $OLD_ERROR_LOG`


# restart web server


/usr/sbin/httpd


# compress the archived files


/bin/gzip $OLD_ACCESS_LOG


/bin/gzip $OLD_ERROR_LOG

반응형

+ Recent posts