12장. 로그
이 장에서는 로그를 다룬다. 서비스는 로그로 시작해서 로그로 끝난다. 로그는 금이며, 법이며, 분쟁지역의 평화유지군이다.
로그는 전역과 가상호스트로 구분된다. 모든 로그는 기록여부를 설정할 수 있으며, 공통속성을 가진다.
<XXX Type="time" Unit="1440" Retention="10" Compression="OFF">ON</XXX>
Type (기본: time)
,Unit (기본: 1440분)
로그 롤링조건을 설정한다.time
설정된unit
시간(단위: 분)마다 로그 파일을 롤링한다.size
설정된unit
크기(단위: MB)마다 로그 파일을 롤링한다.both
콤마(,)로 구분하여 시간과 크기를 동시에 설정한다. 예를 들어 Unit=”1440, 100”인 경우 시간이 24시간(1440분) 또는 100MB 인 경우 로그 파일을 롤링한다.
Retention (기본: 10개)
단위 로그파일을 최대 n개 유지한다.Compression (기본: OFF)
로그가 롤링될 때 압축을 진행한다. 예를 들어 access_20140715_0000.log파일이 롤링되면 access_20140715_0000.log.gz로 압축되어 저장된다.
Type
이 “time” , Unit
이 10이면 로그는 매 10분에 롤링된다.
예를 들어 서비스를 2:18분에 시작해도 로그는 매 10분인 2:20, 2:30, 2:40에 롤링된다.
마찬가지로 하루에 한번 매일 0시 0분에 롤링하려면 1440(60분 X 24시)으로 Unit
값을 설정한다.
time
설정에서 로그는 하루에 한번 무조건 롤링되므로 Unit
의 최대값은 1440을 넘을 수 없다.
최대 값인 24시간(Unit=1440)마다 로그가 롤링되도록 설정했다면 다음 그림과 같이 로그가 기록된다.
Install 로그
설치/업데이트 시 모든 내용이 install.log에 기록된다. 이 로그는 별도의 설정이 없다.
#DownloadURL: http://foobar.com/ston/ston.2.0.0.rhel.2.6.32.x64.tar.gz
#DownloadTime: 13 sec
#Target: STON 2.0.0
#Date: 2014.03.03 16:48:35
Prepare for STON 2.0.0 install process
Stopping STON...
STON stopped
[Copying files]
`./fuse.conf' -> `/etc/fuse.conf'
`./libfuse.so.2' -> `/usr/local/ston/libfuse.so.2'
`./libtbbmalloc_proxy.so' -> `/usr/local/ston/libtbbmalloc_proxy.so'
`./start-stop-daemon' -> `/usr/sbin/start-stop-daemon'
`./libtbbmalloc_proxy.so.2' -> `/usr/local/ston/libtbbmalloc_proxy.so.2'
`./libtbbmalloc.so' -> `/usr/local/ston/libtbbmalloc.so'
`./libtbbmalloc.so.2' -> `/usr/local/ston/libtbbmalloc.so.2'
`./libtbb.so' -> `/usr/local/ston/libtbb.so'
`./libtbb.so.2' -> `/usr/local/ston/libtbb.so.2'
`./stond' -> `/usr/local/ston/stond'
`./stonx' -> `/usr/local/ston/stonx'
`./stonr' -> `/usr/local/ston/stonr'
`./stonu' -> `/usr/local/ston/stonu'
`./stonapi' -> `/usr/local/ston/stonapi'
`./server.xml.default' -> `/usr/local/ston/server.xml.default'
`./vhosts.xml.default' -> `/usr/local/ston/vhosts.xml.default'
`./ston_format.sh' -> `/usr/local/ston/ston_format.sh'
`./ston_diskinfo.sh' -> `/usr/local/ston/ston_diskinfo.sh'
`./wm.sh' -> `/usr/local/ston/wm.sh'
[Exporting config files]
#Export so directory
/usr/local/ston/ to ld.so.conf
#Export sysctl to /etc/sysctl.conf
vm.swappiness=0
vm.min_free_kbytes=524288
#Export sudoers for WM
Defaults !requiretty
winesoft ALL=NOPASSWD: /etc/init.d/ston stop, /etc/init.d/ston start, /bin/ps -ef
[Configuring STON daemon script]
STON deamon activate in run-level 2345.
[Installing sub-packages]
curl installed.
libjpeg installed.
libgomp installed.
rrdtool installed.
[Installing WM]
Stopping WM...
WM stopped
`./wm.server_default.xml' -> `/usr/local/ston/wm/tmp/conf/server_default.xml'
`./wm.vhost_default.xml' -> `/usr/local/ston/wm/tmp/conf/vhost_default.xml'
WM configuration found. Current WM port : 8500
PHP module for Legacy(CentOS 5.5) installed
`./libphp5.so.5.5' -> `/usr/local/ston/wm/modules/libphp5.so'
WM installation almost complete. Changing WM privileges.
Installation successfully complete
Info 로그
Info로그는 전역설정(server.xml)에 설정한다.
# server.xml - <Server><Cache>
<InfoLog Type="size" Unit="1" Retention="5">ON</InfoLog>
<InfoLog> (기본: ON, Type: size, Unit: 1)
STON의 동작과 설정변경에 대해 기록한다.
Deny 로그
Deny로그는 전역설정(server.xml)에 설정한다.
# server.xml - <Server><Cache>
<DenyLog Type="size" Unit="1" Retention="5">ON</DenyLog>
<DenyLog> (기본: ON, Type: size, Unit: 1)
서버 접근제어 에 의해 접근차단된 IP를 기록한다.
#Fields: date time c-ip deny 2012.11.15 07:06:10 1.1.1.1 AP 2012.11.15 07:06:26 2.2.2.2 GIN 2012.11.15 07:06:30 3.3.3.3 3.3.3.1-255
모든 필드는 공백으로 구분되며 각 필드의 의미는 다음과 같다.
date
날짜time
시간c-ip
클라이언트 IPdeny
차단조건
OriginError 로그
OriginError로그는 전역설정(server.xml)에 설정한다.
# server.xml - <Server><Cache>
<OriginErrorLog Type="size" Unit="5" Retention="5" Warning="OFF">ON</OriginErrorLog>
<OriginErrorLog> (기본: OFF, Type: size, Unit: 5, Warning: OFF)
모든 가상호스트의 원본서버에서 발생한 장애만을 기록한다. 장애는 접속장애와 전송장애를 의미하며 원본서버 배제/복구 결과가 기록된다.
#Fields: date time vhostname level s-domain s-ip cs-method cs-uri time-taken sc-error sc-resinfo s-port 2012.11.15 07:06:10 [example.com] [ERROR] 192.168.0.13 192.168.0.13 GET /Upload/ProductImage/stock/1716439_SM.jpg 20110 Connect-Timeout - 80 2012.11.15 07:06:26 [example.com] [ERROR] 192.168.0.13 192.168.0.13 GET /Upload/ProductImage/stock/1716439_SM.jpg 20110 Connect-Timeout - 80 2012.11.15 07:06:30 [example.com] [ERROR] 192.168.0.13 192.168.0.13 GET /Upload/ProductImage/stock/1716439_SM.jpg 20110 Connect-Timeout - 80 #2012.11.15 07:06:30 [example.com] 192.168.0.13 excluded from service #2012.11.15 07:06:31 [example.com] Origin server list: 192.168.0.14 #2012.11.15 07:11:11 [example.com] 192.168.0.13 recovered back in service #2012.11.15 07:11:12 [example.com] Origin server list: 192.168.0.13
모든 필드는 공백으로 구분되며 각 필드의 의미는 다음과 같다.
date
장애발생 날짜time
장애발생 시간vhostname
[가상호스트]level
[장애레벨(Error 또는 Warning)]s-domain
원본서버 도메인s-ip
원본서버 IPcs-method
STON이 원본서버에게 보낸 HTTP Methodcs-uri
STON이 원본서버에게 보낸 URItime-taken
장애가 발생 할때 까지 소요된 시간sc-error
장애의 종류sc-resinfo
장애발생시 서버 응답 정보(“,”문자로 구분)s-port
원본서버 Port
Warning
속성이ON
이라면 다음 예제처럼 잘못된 HTTP통신이 발생한 경우에 기록한다.2012.11.15 07:09:03 [example.com] [WARNING] 10.10.10.10 121.189.63.219 GET /716439_SM.jpg 20110 PartialResponseOnNormalRequest Res=206,Len=2635 2012.11.15 07:09:03 [example.com] [WARNING] 10.10.10.10 121.189.63.219 GET /716439_SM.jpg 20110 ClosedWithoutResponse -
잘못된 HTTP통신의 경우는 다음과 같다.
ClosedWithoutResponse
원본서버에 의한 연결종료. HTTP 응답을 받지 못했다.ClosedWhenDownloading
원본서버에 의한 연결종료. Content-Length 만큼 다운로드하지 못했다.NotPartialResponseOnRangeRequest
Range요청을 했으나 응답코드가 206이 아니다.DifferentContentLengthOnRangeRequest
요청한 Range와 Content-Length가 다르다.PartialResponseOnNormalRequest
Range요청이 아닌데 응답코드가 206이다.
SysLog 전송
syslog 프로토콜을 사용하여 로그를 UDP로 실시간 포워딩한다. 모든 로그에 대하여 syslog로 전송되도록 설정할 수 있다.
# server.xml - <Server><Cache>
<InfoLog SysLog="OFF">ON</InfoLog>
<DenyLog SysLog="OFF">ON</DenyLog>
<OriginErrorLog SysLog="OFF">ON</OriginErrorLog>
SysLog
OFF (기본)
syslog를 사용하지 않는다.ON
이 태그 하위에 설정된<SysLog>
로 로그를 전송한다.
다음은 <OriginErrorLog>
가 기록될 때 syslog를 설정하는 예제이다.
# server.xml - <Server><Cache>
<OriginErrorLog SysLog="ON">
<SysLog Priority="local3.info" Dest="192.168.0.1:514" />
<SysLog Priority="user.alert" Dest="192.168.0.2" />
<SysLog Priority="mail.debug" Dest="log.example.com" />
</OriginErrorLog>
<OriginErrorLog>
의SysLog
속성을ON
으로 설정한다.<OriginErrorLog>
의 하위에<SysLog>
태그를 생성한다. n대의 서버로 동시에 전송가능하다.<SysLog>
의Priority
속성을 설정한다. 이 표현은 syslog의 Facility Levels 과 Severity levels 의 조합으로 구성한다.<SysLog>
의Dest
속성을 설정한다. syslog수신서버를 의미하며 수신포트가 514인 경우 생략가능하다.
위 설정으로 기록된 sys로그 예제는 다음과 같다. syslog의 tag는 STON/{로그명}으로 기록된다.
Mar 12 11:24:24 192.168.0.1 STON/ORIGINERROR: 2013-03-12 14:09:20 [ERROR] [example.com] - 192.168.0.14 GET /1.gifd 1996 Connect-Timeout -
Mar 12 11:24:24 192.168.0.1 STON/ORIGINERROR: 2013-03-12 14:09:22 [ERROR] [example.com] - 192.168.0.14 GET /favicon.ico 1995 Connect-Timeout -
Mar 12 11:24:24 192.168.0.1 STON/ORIGINERROR: 2013-03-12 14:09:24 [ERROR] [example.com] - 192.168.0.14 GET /1.gifd22 2020 Connect-Timeout -
Mar 12 11:24:24 192.168.0.1 STON/ORIGINERROR: #2013 .03.12 14:09:24 [example.com] 192.168.0.14:102 excluded from service
Mar 12 11:24:24 192.168.0.1 STON/ORIGINERROR: #2013 .03.12 14:09:24 [example.com] Origin server list:
가상호스트별 로그저장
가상호스트별로 로그는 별도로 기록된다.
로그가 OFF
로 설정되어 있어도 로컬파일에만 써지지 않을 뿐이므로
Log Trace 는 정상동작한다.
# server.xml - <Server><VHostDefault>
# vhosts.xml - <Vhosts><Vhost>
<Log Dir="/cache_log">
... (생략) ...
</Log>
<Log>
Dir
속성으로 로그가 기록될 디렉토리를 설정한다. 로그는 설정한 디렉토리 하위의 가상호스트 디렉토리에 생성된다.
DNS 로그
원본서버 주소가 Domain으로 설정되었다면 Resolving결과를 기록한다.
# server.xml - <Server><VHostDefault><Log>
# vhosts.xml - <Vhosts><Vhost><Log>
<Dns Type="size" Unit="10" Retention="10" SysLog="OFF" Compression="OFF">ON</Dns>
#Fields: date time domain ttl ip-list ip-count time-taken result
2014-07-30 12:10:33 example.com 157 173.194.127.15,173.194.127.23,173.194.127.24,173.194.127.31 4 5007 success
2014-07-30 12:10:38 example.com 152 173.194.127.23,173.194.127.24,173.194.127.31,173.194.127.15 4 9 success
2014-07-30 12:11:03 example.com 127 173.194.127.31,173.194.127.15,173.194.127.23,173.194.127.24 4 15007 success
2014-07-30 12:12:53 example.com 17 173.194.127.15,173.194.127.23,173.194.127.24,173.194.127.31 4 6 success
2014-07-30 12:23:16 test.com 0 - 0 10008 fail
2014-07-30 12:23:21 test.com 0 - 0 5007 fail
2014-07-30 12:23:26 test.com 0 - 0 5011 fail
2014-07-30 12:24:38 example.com 152 173.194.127.23,173.194.127.24,173.194.127.31,173.194.127.15 4 9 success
2014-07-30 12:25:03 example.com 127 173.194.127.31,173.194.127.15,173.194.127.23,173.194.127.24 4 15007 success
모든 필드는 공백으로 구분되며 각 필드의 의미는 다음과 같다.
date
날짜time
시간domain
대상 Domainttl
레코드 유효시간(Time To Live)ip-list
IP 리스트ip-count
IP 개수time-taken
수행시간result
success 또는 fail
Access 로그
모든 클라이언트의 HTTP 트랜잭션을 기록한다. 로그 기록 시점은 HTTP 트랜잭션이 완료되는 시점이며 전송완료 또는 전송중단 시점을 의미한다.
# server.xml - <Server><VHostDefault><Log>
# vhosts.xml - <Vhosts><Vhost><Log>
<Access Type="time" Unit="1440" Retention="10" XFF="on" Form="ston" Local="Off">ON</Access>
XFF
ON (기본)
클라이언트가 보낸 XFF(X-Forwarded-For)헤더 값과 클라이언트 IP를 같이 기록한다. 없다면OFF
와 같다.OFF
클라이언트 IP를 기록한다.TrimCIP
XFF헤더가 없을 경우 클라이언트 IP를, 있는 경우 (클라이언트 IP를 제외한) XFF헤더만을 기록한다.
Form
ston (기본)
W3C표준 + 확장필드apache
Apache 형식iis
IIS 형식custom
admin-log-access-custom
Local
OFF (기본)
로컬통신(Loopback)은 기록하지 않는다.ON
로컬통신(Loopback)도 기록한다.
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-bytes time-taken cs-referer sc-resinfo cs-range sc-cachehit cs-acceptencoding session-id sc-content-length
2012.06.27 16:52:24 220.134.10.5 GET /web/h.gif - 80 - 61.50.7.9 Chrome/19.0.1084.56 200 98141 5 - Bypass+gzip+SSL3 - TCP_HIT gzip+deflate 7 1273735
2012.06.27 16:52:26 220.134.10.5 GET /favicon.ico - 80 - 61.50.7.9 Chrome/19.0.1084.56 200 949 2 - - - TCP_HIT gzip+deflate 35 14875
2012.06.27 17:00:06 220.168.0.13 GET /setup.Eexe - 80 - 61.168.0.102 Mozilla/5.0+(Windows+NT+6.1;+WOW64)+AppleWebKit/536.11+(KHTML,+like+Gecko)+Chrome/20.0.1132.57+Safari/536.11 206 20971800 7008 - - 398458880-419430399 TCP_HIT - 41 89764358
모든 필드는 공백으로 구분되며 각 필드의 의미는 다음과 같다.
date
HTTP 트랜잭션이 완료된 날짜time
HTTP 트랜잭션이 완료된 시간s-ip
서버 IPcs-method
클라이언트가 보낸 HTTP Methodcs-uri-stem
클라이언트가 보낸 URL중 QueryString을 제외한 부분cs-uri-query
클라이언트가 보낸 URL중 QueryStrings-port
서버 포트cs-username
클라이언트 usernamec-ip
클라이언트 IP. XFF설정이 “ON”이라면 X-Forwarded-For헤더 값과 클라이언트 IP를 기록한다.cs(User-Agent)
클라이언트가 보낸 HTTP User-Agentsc-status
서버 응답코드sc-bytes
서버가 보낸 Bytes (헤더 + 컨텐츠)time-taken
HTTP트랜잭션이 완료될 때까지 소요된 전체시간(밀리세컨드)cs-referer
클라이언트가 보낸 HTTP Referersc-resinfo
부가 정보. “+”문자로 구분된다. 압축된 컨텐츠를 서비스했다면 압축옵션(gzip 또는 deflate)이 명시된다. 보안통신이라면 SSL 프로토콜 버전(SSL3, TLS1, TLS1.1, TLS1.2)이 명시된다. 바이패스한 통신이라면 “Bypass”가 명시된다.cs-range
클라이언트가 보낸 Range 헤더를 기록한다.sc-cachehit
캐시 HIT결과cs-acceptencoding
클라이언트가 보낸 Accept-Encoding헤더session-id
HTTP 클라이언트 세션 ID (unsigned int64)sc-content-length
서버 응답 Content-Length 헤더 값
Access로그는 전송 성공/실패 여부에 상관없이 모든 HTTP 트랜잭션을 기록한다.
HTTP 트랜잭션은 클라이언트가 HTTP요청을 보낼 때 시작된다.
STON이 클라이언트에게 응답을 보내기 전에 HTTP연결이 종료된다면 HTTP 트랜잭션 역시
종료된 것으로 간주한다.
로그에는 sc-status
와 sc-bytes
가 0으로 기록된다.
주로 STON이 원본서버로부터 응답을 받기 전에 클라이언트가 연결을 종료하는 경우 이런
로그가 기록된다.
참고
[CDN v2.6.6][Enterprise v18.12.1]부터 Type이 size
인 경우 파일명에 초 단위까지 명시한다.
이는 설정된 size
까지 1분 안에 도달할 경우 로그가 유실될 우려가 있기 때문이다.
사용자정의 Access 로그포맷
Access 로그형식을 사용자정의 로그로 설정한다.
# server.xml - <Server><VHostDefault><Log>
# vhosts.xml - <Vhosts><Vhost><Log>
<Access Form="custom">ON</Access>
<AccessFormat>%a %A %b id=%{userid}C %f %h %H "%{user-agent}i" %m %P "%r" %s %t %T %X %I %O %R %e %S %K</AccessFormat>
<Access>
의Form
속성을custom
으로 설정한다.<AccessFormat>
사용자정의 로그 형식.
위 예제의 경우 다음과 같이 Access로그가 기록된다. (#Fields는 기록하지 않는다.)
192.168.0.88 192.168.0.12 163276 id=winesoft; image.jpg example.com HTTP "STON" GET 80 "GET /ston/image.jpg?type=png HTTP/1.1" 200 2014-04-03 21:21:54 1 C 204 163276 1 2571978 TCP_MISS HTTP/1.1
192.168.0.88 192.168.0.12 63276 id=winesoft; vod.mp4 example.com HTTP "STON" POST 80 "GET /ston/vod.mp4?start=10 HTTP/1.1" 200 2014-04-03 21:21:54 12 C 304 363276 2 2571979 TCP_REFRESH_HIT HTTP/1.1
192.168.0.88 192.168.0.12 3634276 id=ston; news.html example.com HTTPS "STON" GET 443 "GET /news.html HTTP/1.1" 200 2014-04-03 21:21:54 30 X 156 2632576 1 2571980 TCP_MISS HTTP/1.1
192.168.0.88 192.168.0.12 6332476 id=winesoft; style.css example.com HTTP "STON" HEAD 80 "GET /style.css HTTP/1.1" 200 2014-04-03 21:21:54 10 X 234 653276 2 2571981 TCP_REFRESH_HIT HTTP/1.1
192.168.0.88 192.168.0.12 6276 id=ston; ui.js example.com HTTP "STON" GET 80 "GET /ui.js HTTP/1.1" 200 2014-04-03 21:21:54 1 X 233 63276 1 2571982 TCP_MISS HTTP/1.1
192.168.0.88 192.168.0.12 626 id=winesoft; hls.m4u8 example.com HTTP "STON" GET 80 "GET /hls.m4u8 HTTP/1.1" 200 2014-04-03 21:21:54 2 X 124 6312333276 2 2571983 TCP_REFRESH_HIT HTTP/1.1
Apache로그 형식 을 기반으로 개발되었으며 일부 확장필드가 있다. 각 필드의 구분자에는 제한이 없지만 Space를 사용할 경우, User-Agent처럼 Space가 포함될 수 있는 필드는 따옴표(”…”)로 묶어서 설정한다.
%...a
클라이언트 IP192.168.0.66
%...A
서버IP 주소192.168.0.14
%...b
HTTP헤더를 제외한 전송 바이트수1024
%...{foobar}C
서버가 수신한 요청의 Foobar 쿠키의 내용%{id=}c 로 입력하면 Cookie 에서 id=에 해당하는 값을 기록
%...D
요청을 처리하는데 걸린 시간(MS)3000
%...f
파일명/mp4/iu.mp4 라면 iu.mp4를 기록
%...F
파일명원본서버 선택이유
%...h
HostNameexample.com
%...H
요청 프로토콜http 또는 https
%...{foobar}i
서버가 수신한 요청에서 foobar: 헤더의 내용%{User-Agent}i 로 입력 할 경우 User-Agent의 값을 기록
%...m
요청 MethodGET 또는 POST 또는 HEAD
%...P
Server PORT80
%...q
QueryStringId=10&value=20
%...{foobar}Q
서버가 수신한 Foobar 쿼리스트링의 내용문자열
%...r
요청의 첫번째 줄(Request Line)GET /img.jpg HTTP/1.1
%...s
응답코드200
%...t
STON 기본 시간형식2014-01-01 15:27:02
%...{format}t
Format에 정의된 날짜 형식%{%Y-%m-%d %H:%M:%S}T 로 입력하면 2014-08-07 06:12:23으로 기록.
%...T
TimeTaken(초단위)10
%...U
ShortURI/img/img.jpg
%...u
FullURI/img/img.jpg?session=1232&id=37
%...X
트랜잭션이 완료되었을 때의 상태X
응답이 완료되기 전에 종료C
응답이 완료 되었음
C
%...I
요청헤더를 포함한 수신바이트2048
%...O
응답헤더를 포함한 송신바이트2048
%...R
응답시간(MS)2
%...e
Session-ID1
%...S
캐싱 HIT 결과TCP_HIT
%...K
요청 HTTP 버전HTTP/1.1
%...y
요청 HTTP 헤더 크기488
%...z
응답 HTTP 헤더 크기362
설정한 필드의 값이 존재하지 않으면 - 로 표기한다. 형식이 잘못되었다면 STON 기본 포맷(Form=”ston”)으로 동작한다.
위 표에서 각 필드의 …에는 (e.g. “%h %U %r %b) 아무것도 명시하지 않거나, 기록 조건을 명시할 수 있다(조건을 만족하지 않으면 - 로 기록). 조건은 HTTP 상태코드 목록으로 설정하거나 !로 NOT 조건을 설정할 수 있다.
다음 예제는 400(Bad Request) 오류 또는 501(Not Implemented) 오류 일 때만 User-agent를 기록한다.
"%400,501{User-agent}i"
다음 예제는 정상적인 상태가 아닌 모든 요청에 대해 Referer를 로그에 남긴다.
"%!200,304,302{Referer}i"
Origin 로그
원본서버의 모든 HTTP 트랜잭션을 기록한다. 기록 시점은 HTTP 트랜잭션이 완료되는 시점이며 전송완료 또는 전송중단 시점을 의미한다.
# server.xml - <Server><VHostDefault><Log>
# vhosts.xml - <Vhosts><Vhost><Log>
<Origin Type="time" Unit="1440" Retention="10" Local="Off">ON</Origin>
#Fields: date time cs-sid cs-tcount c-ip cs-method s-domain cs-uri s-ip sc-status cs-range sc-sock-error sc-http-error sc-content-length cs-requestsize sc-responsesize sc-bytes time-taken time-dns time-connect time-firstbyte time-complete cs-reqinfo cs-acceptencoding sc-cachecontrol s-port sc-contentencoding session-id session-type time-sock-creation x-cs-retry time-request cs-balance
2012.06.27 17:40:00 357 899 192.168.0.13 GET i.example.com /t/2.gif 115.71.9.136 200 - - - 3874 197 271 3874 20 0 0 17 3 - gzip+deflate - 80 gzip 7 cache rr
2012.06.27 17:40:00 357 900 192.168.0.13 GET i.example.com /ex1.gif 115.71.9.136 200 - - - 5673 223 272 5673 24 0 0 21 3 - - - 80 - 8 cache rr
2012.06.27 17:40:00 357 901 192.168.0.13 GET i.example.com /exB.jpg 115.71.9.136 200 - - - 8150 189 273 8150 13 0 0 9 4 Bypass - - 80 - 7 cache rr
#[ERROR:01] 2012.06.27 17:40:01 220.73.216.5 220.73.216.5 GET /web/nmb/img/main/v1/h1.gif 1824 Connect-Timeout - 11 cache rr
2012.06.27 17:40:00 357 901 192.168.0.13 GET i.example.com /exB1.jpg 115.71.9.136 200 - - - 8150 189 273 8150 13 0 0 9 4 - max-age=3600 80 - 12 cache rr
2012.06.27 17:40:00 357 901 192.168.0.13 GET i.example.com /exB2.jpg 115.71.9.136 200 - - - 8150 189 273 8150 13 0 0 9 4 - no-cache 80 - 35 cache rr
2012.06.27 17:40:00 357 901 192.168.0.13 GET i.example.com /exB3.jpg 115.71.9.136 200 - - - 8150 189 273 8150 13 0 0 9 4 - - 80 - 35 cache rr
원본서버에 장애가 발생했다면 #[ERROR:xx]로 시작하는 에러 로그가 기록된다. 모든 필드는 공백으로 구분되며 각 필드의 의미는 다음과 같다.
date
HTTP 트랜잭션이 완료된 날짜time
HTTP 트랜잭션이 완료된 시간cs-sid
세션의 고유ID. 같은 세션을 통해 처리된(재사용된) HTTP 트랜잭션은 같은 값을 가진다.cs-tcount
트랜잭션 카운트. 이 HTTP 트랜잭션이 현재 세션에서 몇 번째로 처리된 트랜잭션인지 기록한다. 같은cs-sid
값을 가지는 트랜잭션이라면 이 값은 중복될 수 없다.c-ip
STON의 IPcs-method
원본서버에게 보낸 HTTP Methods-domain
원본서버 도메인cs-uri
원본서버에게 보낸 URIs-ip
원본서버 IPsc-status
원본서버 HTTP 응답코드cs-range
원본서버에게 보낸 Range요청 값sc-sock-error
소켓 에러코드Connect-Timeout
연결 시간초과Receive-Timeout
수신대기 시간 초과Server-Close
원본에서의 연결종료Client-Close
STON에서의 연결종료 (바이패스 중 클라이언트가 먼저 연결을 종료하는 경우)Non-Existent-Domain
연결할 Domain이 존재하지 않음
sc-http-error
원본서버가 4xx 또는 5xx응답을 줬을 때 응답코드를 기록sc-content-length
원본서버가 보낸 Content Lengthcs-requestsize (단위: Bytes)
원본서버로 보낸 HTTP 요청 헤더 크기sc-responsesize (단위: Bytes)
원본서버가 응답한 HTTP 헤더 크기sc-bytes (단위: Bytes)
수신한 컨텐츠 크기(헤더 제외)time-taken (단위: ms)
HTTP 트랜잭션이 완료될 때까지 소요된 전체시간. 세션 재사용이 아니라면 소켓 접속시간까지 포함한다.time-dns (단위: ms)
DNS쿼리에 소요된 시간time-connect (단위: ms)
원본서버와 소켓 Established까지 소요된 시간time-firstbyte (단위: ms)
요청을 보내고 응답이 올때까지 소요된 시간time-complete (단위: ms)
첫 응답부터 완료될 때까지 소요된 시간cs-reqinfo
부가 정보. “+”문자로 구분한다. 바이패스한 통신이라면 “Bypass”, Private바이패스라면 “PrivateBypass”로 기록된다.cs-acceptencoding
원본서버에 압축된 컨텐츠를 요청하면 “gzip+deflate”로 기록된다.sc-cachecontrol
원본서버가 보낸 cache-control헤더s-port
원본서버 포트sc-contentencoding
원본서버가 보낸 Content-Encoding헤더session-id
원본서버 요청을 발생시킨 HTTP 클라이언트 세션 ID (unsigned int64)session-type
원본서버에 요청한 세션 타입cache
캐싱용도로 사용된 세션recovery
장애감지와 복구 에서 복구용도로 사용된 세션healthcheck
Health-Checker 가 사용한 세션
time-sock-creation (단위: ms)
- 소켓 생성 소요시간x-cs-retry
- 해당 세션 Retry 상태 (Retry 시Y
, Retry 하지 않았다면N
)time-request
- 원본서버 요청시간.시간:분:초.밀리세컨드 (hh:mm:ss.SSS)
양식(v2.7.35
부터 지원)cs-balance
- 원본서버 선택이유rr
원본 선택RoundRobin
설정hash
원본 선택Hash
설정session
원본 선택Session
설정boaf
원본서버 고정OriginAffinity
속성 활성화 바이패스bs
원본서버 고정Sticky
속성 활성화 바이패스-
장애감지와 복구 또는 Health-Checker
참고
카운터 기반 분산 으로 동작할 경우 분산 알고리즘과 판단 조건이 같이 기록된다.
rr;47>30 # AccessGt(30)보다 더 많은 요청(47)이 기록되어 RR로 원본 선택
Image 로그
On-the-fly 이미지 처리 결과를 기록한다.
Image.log는 Access.log와 Origin.log사이에 위치하며 다음과 같은 관계를 가진다.
Access.log
신규 가공일 경우(TCP_MISS)에만 Image.log에 기록된다.Origin.log
Image.log에만 기록되었다면 원본 이미지는 이미 캐싱되어 있는 상태이다.
기존 로그 설정방식과 동일하며, Access.log, Origin.log와 동일하게 가상호스트별로 설정한다.
# server.xml - <Server><VHostDefault><Log>
# vhosts.xml - <Vhosts><Vhost><Log>
<Image Type="time" Unit="1440" Retention="10">OFF</Image>
기본 값은 OFF
이다.
#Fields: date time cs-sid cs-uri x-result x-error x-origin-size x-processed-size time-taken time-processed
2019-01-24 14:59:18 11 /hideface/10.jpg/dims/format/ 500 format 248838 0 139 79
2019-01-24 14:59:35 34 /hideface/10.jpg/dims/format/webp/resize/x 500 resize 248838 0 90 85
2019-01-24 14:59:55 21 /hideface/10.jpg/dims/resize/x/format/webp/ 500 resize 248838 0 29 25
2019-01-24 15:00:05 49 /hideface/10.jpg/dims/resize/100x123/format/webp/ 200 - 248838 15618 92 86
2019-01-24 15:00:36 12 /img/transfersmallfile.php/dims/resize/100x123/format/webp/ 400 404 1162 0 26 0
2019-01-24 15:02:24 15 /10.jpg/dims/resize/100x100 401 11326337 11326337 0 757 0
모든 필드는 공백으로 구분되며 각 필드의 의미는 다음과 같다.
date
이미지 가공이 완료된 날짜time
이미지 가공이 완료된 날짜cs-sid
이미지 가공을 요청한 클라이언트 세션 IDcs-uri
클라이언트가 요청한 URIx-result
이미지 가공 결과코드200
성공304
변환된 이미지의 TTL이 연장되었다. (= 원본 이미지가 변경되지 않았다.)400
원본 이미지의 응답코드가 200이 아니다. (x-error
: 원본 HTTP 응답코드)401
원본 이미지 크기가 유효 범위가 아니다. (x-error
: 원본 Content-Length)402
원본 이미지가 100% 로딩되지 못했다.500
이미지 가공 중 에러가 발생했다. (x-error
: 실패 사유)501
이미지 가공은 완료되었으나 저장과정 중 에러가 발생하였다.
x-error
이미지 가공 에러 상세내용x-origin-size (단위: Bytes)
원본 이미지 크기x-processed-size (단위: Bytes)
가공된 크기time-taken (단위: 밀리세컨드)
이미지 가공 HTTP 트랜잭션이 완료될 때까지의 전체 소요시간time-processed (단위: 밀리세컨드)
이미지 가공 소요시간
Monitoring 로그
5분 평균 통계를 기록한다.
# server.xml - <Server><VHostDefault><Log>
# vhosts.xml - <Vhosts><Vhost><Log>
<Monitoring Type="size" Unit="10" Retention="10" Form="json">ON</Monitoring>
Form
로그형식을 지정한다. (json
또는xml
)
FileSystem 로그
19장. File System 을 통해 발생하는 모든 File I/O 트랜잭션을 기록한다.
# server.xml - <Server><VHostDefault><Log>
# vhosts.xml - <Vhosts><Vhost><Log>
<FileSystem Type="time" Unit="1440" Retention="10">ON</FileSystem>
File I/O 트랜잭션이 종료될 때 기록된다. 트랜잭션 종료 시점은 cs-method의 형태에 따라 달라진다.
#Fields: date time cs-method cs-path sc-status sc-bytes response-time time-taken sc-cachehit attr session-id
2012.06.27 16:52:24 ATTR /t 200 0 100 100 TCP_HIT FOLDER 1
2012.06.27 16:52:24 ATTR /t/2.gif 200 0 100 100 TCP_HIT FILE 1
2012.06.27 16:52:24 OPEN /file.txt 200 0 100 2000 TCP_HIT FILE 2
2012.06.27 16:52:24 READ /file.txt 200 1024768 100 2000 TCP_HIT FILE 2
date
File I/O 트랜잭션이 완료된 날짜time
File I/O 트랜잭션이 완료된 시간cs-method
File I/O 접근 형태. 다음 3가지 중 하나를 가진다.ATTR
getattr함수 호출. 함수가 리턴될 때 로그 기록OPEN
파일은 열었지만 READ 하지 않음. 파일이 닫힐 때 로그 기록READ
파일을 열고 READ 하였음. 파일이 닫힐 때 로그 기록
cs-path
접근 경로sc-status
응답코드. 정상적인 서비스(200)를 제외한 처리 실패코드는 다음과 같다.200
정상 서비스301
바이패스 필요302
서비스 거부303
Redirect 필요400
잘못된 요청401
가상호스트를 찾지 못했음402
원본으로부터 초기화 실패500
객체 초기화 실패501
객체 Open실패502
저장경로 생성실패503
메모리 초기화 실패504
Emergency 상태600
파일 서비스 대기 중 Timeout601
파일 데이터 서비스 대기 중 Timeout602
파일 서비스 대기 중 파일초기화 실패603
파일 데이터 서비스 대기 중 데이터 초기화 실패701
잘못된 Offset702
파일의 특정 영역을 로딩 실패703
Not enough memory704
원본세션 생성 실패
sc-bytes
Read된 크기response-time
함수 호출 ~ 서비스객체를 연결하는데 소요된 시간time-taken
함수 호출 ~ File I/O Transaction이 완료되는데 소요된 시간.sc-cachehit
캐시 HIT결과.attr
FILE 또는 FOLDERsession-id
File I/O 세션 ID (unsigned int64)참고
session-id
는 Client(HTTP 또는 File I/O) Context가 생성될 때 할당된다. 일반적인 파일 처리 과정인 Open -> Read -> Close에서는 Open시점에 Client Context가 생성되며 Close시점에 파괴된다. 반면 getattr함수는 원자성(Atomic)함수이므로 매번 Client Context가 생성/파괴되어 항상 새로운 session-id를 할당 받는다.
FTP 전송
로그가 롤링될 때 지정된 FTP클라이언트를 통해 로그를 업로드 한다.
FTP 클라이언트
FTP 클라이언트를 설정한다. 롤링된 로그를 실시간으로 FTP서버로 업로드한다.
FTP 클라이언트는 위 그림과 같이 STON외부에 존재한다. STON은 로컬에 존재하는 로그를 FTP클라이언트 큐에 입력할 뿐 FTP의 동작에는 관여하지 않는다. FTP클라이언트는 자신의 설정에 따라 업로드를 진행한다.
FTP 클라이언트는 전역설정(server.xml)에 설정한다.
# server.xml - <Server>
<Ftp Name="backup1">
<Mode>Passive</Mode>
<Address>ftp.winesoft.co.kr:21</Address>
<Account>
<ID>test</ID>
<Password>12345abc</Password>
</Account>
<ConnectTimeout>10</ConnectTimeout>
<TransferTimeout>600</TransferTimeout>
<TrafficCap>0</TrafficCap>
<DeleteUploaded>OFF</DeleteUploaded>
<BackupOnFail>OFF</BackupOnFail>
<UploadPath>/log_backup/%v/%s-%e.%p.log</UploadPath>
<TransferTime Type="Rotate" />
</Ftp>
<Ftp Name="backup2">
<Mode>Active</Mode>
<Address>192.168.0.14:21</Address>
<Account>
<ID>test</ID>
<Password>qwerty</Password>
</Account>
<ConnectTimeout>3</ConnectTimeout>
<TransferTimeout>100</TransferTimeout>
<TrafficCap>10240</TrafficCap>
<DeleteUploaded>ON</DeleteUploaded>
<BackupOnFail>ON</BackupOnFail>
<TransferTime Type="Static">04:00</TransferTime>
</Ftp>
<Ftp>
FTP 클라이언트를 설정한다.Name
속성으로 고유의 이름을 설정한다.Mode (기본: Passive)
접속모드 (Passive
또는Active
)Address
FTP주소.Account
FTP 계정. 만약 비밀번호(예를 들어 qwerty)를 암호화하고 싶다면 다음 API 사용한다./command/encryptpassword?plain=qwerty
암호화된 비밀번호는 다음과 같이 설정한다.
<Password Type="enc">dXR9k0xNUZVVYQsK5Bi1cg==</Password>
ConnectTimeout
연결대기 시간TransferTimeout
전송대기 시간TrafficCap (단위: KB)
0보다 큰 값으로 설정할 경우 전송 최대 대역폭을 설정한다.DeleteUploaded (기본: OFF)
전송완료 후 해당로그를 삭제한다.BackupOnFail (기본: OFF)
전송실패 시 로그가 삭제되지 않도록 해당로그를 다음 경로에 백업한다./usr/local/ston/stonb/backup/
백업된 로그는 재전송하지 않으며 관리자가 삭제하기 전까지 삭제되지 않는다.
UploadPath
업로드 경로를 설정한다. 별도로 설정하지 않으면 “/가상호스트/” 에 업로드 한다. example.com의 로그는 /example.com/ 디렉토리에 업로드된다.%{time format}s
로그 시작 시간%{time format}e
로그 끝 시간%p
prefix%v
가상호스트 이름%h
장비 HOST 이름
예를 들어 다음과 같이 설정했다면
# server.xml - <Server><Ftp> <UploadPath>/log_backup/%v/%s-%e.%p.log</UploadPath>
업로드 경로는 다음과 같다.
/log_backup/example.com/200140722_0000-200140722_2300.access.log
TransferTime
로그 전송시간을 지정한다.Type
속성에 따라 값의 형식이 달라진다.Rotate (기본)
롤링되면 바로 전송한다. 값을 가지지 않는다.Static
하루에 한번 지정된 시간에 전송한다. 예를 들어 04:00으로 설정됐다면 새벽 4시에 전송을 시작한다.Interval
일정시간 간격으로 전송한다. 예를 들어 4로 설정했다면 4시간 간격으로 로그를 전송한다.
전송시간을 설정할 경우 해당 시점에 로그가 롤링되지 않도록 적절히 로그관리 정책을 구성해야 한다.
FTP클라이언트는 curl을 사용한다.
FTP 로그
FTP로그는 /usr/local/ston/sys/stonb/stonb.log에 통합하여 저장된다.
#Fields: date time local-path cs-url file-size time-taken sc-status sc-error-msg
2014-04-23 17:10:20 /ston_log/winesoft.co.kr/origin_20140423_080000.log ftp://ftp.winesoft.co.kr:21/winesoft.co.kr/origin_20140423_080000.log 381 10006 fail "curl: (7) couldn't connect to host"
2014-04-23 17:10:20 /ston_log/winesoft.co.kr/access_20140423_1700.log ftp://192.168.0.14:21/winesoft.co.kr/access_20140423_1700.log 260 60 success "-"
2014-04-23 17:11:00 /ston_log/winesoft.co.kr/origin_20140423_080000.log ftp://ftp.winesoft.co.kr:21/winesoft.co.kr/origin_20140423_080000.log 381 10008 fail "curl: (7) couldn't connect to host"
2014-04-23 17:11:00 /ston_log/winesoft.co.kr/filesystem_20140423_080000.log ftp://192.168.0.14:21/winesoft.co.kr/filesystem_20140423_080000.log 179 60 success "-"
모든 필드는 공백으로 구분되며 각 필드의 의미는 다음과 같다.
date
날짜time
시간local-path
전송할 로그의 로컬경로cs-url
전송할 FTP주소file-size
전송 파일크기time-taken (단위: ms)
전송 소요시간sc-status
전송 성공/실패(success 또는 fail)sc-error-msg
전송 실패 시 curl 에러 메세지
로그 FTP전송
로그가 롤링될 때 지정된 FTP 클라이언트 를 통해 업로드 한다. 콤마(,)로 구분하면 여러 FTP 클라이언트 를 동시에 사용할 수 있다.
# server.xml - <Server><VHostDefault>
# vhosts.xml - <Vhosts><Vhost>
<Log>
<Access Ftp="backup1, backup2">ON</Access>
<Origin Ftp="backup_org">ON</Origin>
<Monitoring Ftp="backup1">ON</Monitoring>
<FileSystem Ftp="backup2">ON</FileSystem>
</Log>
Ftp
사용할 FTP 클라이언트
ftp://{FTP서버 주소}/{가상호스트이름}/{롤링된 로그 이름} 으로 로그를 업로드 한다. 예를 들어 ftp.dummy.com서버에 가상호스트 example.com의 롤링된 로그(access_20140424_0000.log)를 업로드하는 주소는 ftp://ftp.dummy.com/example.com/access_20140424_0000.log가 된다.