.. _admin-log:
12장. 로그
******************
이 장에서는 로그를 다룬다.
로그는 전역과 가상호스트로 구분된다.
모든 로그는 기록여부를 설정할 수 있으며, 공통속성을 가진다. ::
ON
- ``Type (기본: time)`` , ``Unit (기본: 1440분)`` 로그 롤링조건을 설정한다.
- ``time`` 설정된 ``unit`` 시간(단위: 분)마다 로그 파일을 롤링한다.
- ``size`` 설정된 ``unit`` 크기(단위: MB)마다 로그 파일을 롤링한다.
- ``both`` 콤마(,)로 구분하여 시간과 크기를 동시에 설정한다.
예를 들어 Unit="1440, 100"인 경우 시간이 24시간(1440분) 또는 100MB 인 경우 로그 파일을 롤링한다.
- ``Retention (기본: 10개)`` 단위 로그파일을 최대 n개 유지한다.
- ``Unify (기본: OFF)``
- ``OFF (기본)`` 로그 저장경로 가상호스트 이름의 디렉토리를 생성하고, 용도별로 로그를 기록한다.
- ``ON`` 로그 저장경로에 단일 파일로 통합하여 기록한다. 가상호스트 구분을 위해 ``x-vhost`` 필드가 추가된다.
.. note::
로그 통합은 ``v2.11.4`` 부터 다음 로그에 대해 지원된다.
- :ref:`admin-log-access`
- :ref:`admin-log-origin`
- :ref:`admin-log-filesystem`
- :ref:`admin-log-image`
- :ref:`admin-log-dns`
- ``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을 넘을 수 없다.
.. figure:: img/log_rolling1.jpg
:align: center
최대 값인 24시간(Unit=1440)마다 로그가 롤링되도록 설정했다면 다음 그림과 같이 로그가 기록된다.
.. figure:: img/log_rolling2.jpg
:align: center
.. toctree::
:maxdepth: 2
.. _admin-log-install:
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
.. _admin-log-info:
Info 로그
====================================
Info로그는 전역설정(server.xml)에 설정한다. ::
# server.xml -
ON
- `` (기본: ON, Type: size, Unit: 1)``
STON의 동작과 설정변경에 대해 기록한다.
.. _admin-log-deny:
Deny 로그
====================================
Deny로그는 전역설정(server.xml)에 설정한다. ::
# server.xml -
ON
- `` (기본: ON, Type: size, Unit: 1)``
:ref:`access-control-serviceaccess` 에 의해 접근차단된 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`` 클라이언트 IP
- ``deny`` 차단조건
.. _admin-log-originerror:
OriginError 로그
====================================
OriginError로그는 전역설정(server.xml)에 설정한다. ::
# server.xml -
ON
- `` (기본: 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`` 원본서버 IP
- ``cs-method`` STON이 원본서버에게 보낸 HTTP Method
- ``cs-uri`` STON이 원본서버에게 보낸 URI
- ``time-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이다.
.. admin-log-syslog:
SysLog 전송
====================================
`syslog `_ 프로토콜을 사용하여 로그를 UDP로 실시간 포워딩한다.
모든 로그에 대하여 syslog로 전송되도록 설정할 수 있다. ::
# server.xml -
ON
ON
ON
- ``SysLog``
- ``OFF (기본)`` syslog를 사용하지 않는다.
- ``ON`` 이 태그 하위에 설정된 ```` 로 로그를 전송한다.
다음은 ```` 가 기록될 때 syslog를 설정하는 예제이다. ::
# server.xml -
1. ```` 의 ``SysLog`` 속성을 ``ON`` 으로 설정한다.
#. ```` 의 하위에 ```` 태그를 생성한다. n대의 서버로 동시에 전송가능하다.
#. ```` 의 ``Priority`` 속성을 설정한다.
이 표현은 syslog의 `Facility Levels `_ 과
`Severity levels `_ 의 조합으로 구성한다.
#. ```` 의 ``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`` 로 설정되어 있어도 로컬파일에만 써지지 않을 뿐이므로
:ref:`api-monitoring-logtrace` 는 정상동작한다. ::
# server.xml -
# vhosts.xml -
... (생략) ...
- ```` ``Dir`` 속성으로 로그가 기록될 디렉토리를 설정한다.
로그는 설정한 디렉토리 하위의 가상호스트 디렉토리에 생성된다.
.. _admin-log-dns:
DNS 로그
====================================
원본서버 주소가 Domain으로 설정되었다면 Resolving결과를 기록한다. ::
# server.xml -
# vhosts.xml -
ON
::
#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`` 대상 Domain
- ``ttl`` 레코드 유효시간(Time To Live)
- ``ip-list`` IP 리스트
- ``ip-count`` IP 개수
- ``time-taken`` 수행시간
- ``result`` success 또는 fail
.. _admin-log-access:
Access 로그
====================================
모든 클라이언트의 HTTP 트랜잭션을 기록한다.
로그 기록 시점은 HTTP 트랜잭션이 완료되는 시점이며 전송완료 또는 전송중단 시점을 의미한다. ::
# server.xml -
# vhosts.xml -
ON
- ``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`` 서버 IP
- ``cs-method`` 클라이언트가 보낸 HTTP Method
- ``cs-uri-stem`` 클라이언트가 보낸 URL중 QueryString을 제외한 부분
- ``cs-uri-query`` 클라이언트가 보낸 URL중 QueryString
- ``s-port`` 서버 포트
- ``cs-username`` 클라이언트 username
- ``c-ip`` 클라이언트 IP. XFF설정이 "ON"이라면 X-Forwarded-For헤더 값과 클라이언트 IP를 기록한다.
- ``cs(User-Agent)`` 클라이언트가 보낸 HTTP User-Agent
- ``sc-status`` 서버 응답코드
- ``sc-bytes`` 서버가 보낸 Bytes (헤더 + 컨텐츠)
- ``time-taken`` HTTP트랜잭션이 완료될 때까지 소요된 전체시간(밀리세컨드)
- ``cs-referer`` 클라이언트가 보낸 HTTP Referer
- ``sc-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 헤더 값
- ``time-response`` 서버에서 응답이 시작되기까지 걸린 시간
- ``x-transaction-status`` HTTP 트랜잭션 결과 ( ``c`` = Complete, ``x`` = Aborted )
- ``x-vhostlink`` 가상호스트 링크 정보
- ``x-vhost`` 통합로그 운용시 트래픽이 유입된 가상호스트
- ``x-sc-ssl-cipher`` TLS 암호화 알고리즘
Access로그는 전송 성공/실패 여부에 상관없이 모든 HTTP 트랜잭션을 기록한다.
HTTP 트랜잭션은 클라이언트가 HTTP요청을 보낼 때 시작된다.
STON이 클라이언트에게 응답을 보내기 전에 HTTP연결이 종료된다면 HTTP 트랜잭션 역시
종료된 것으로 간주한다.
로그에는 ``sc-status`` 와 ``sc-bytes`` 가 0으로 기록된다.
주로 STON이 원본서버로부터 응답을 받기 전에 클라이언트가 연결을 종료하는 경우 이런
로그가 기록된다.
.. note::
[CDN v2.6.6][Enterprise v18.12.1]부터 Type이 ``size`` 인 경우 파일명에 초 단위까지 명시한다.
이는 설정된 ``size`` 까지 1분 안에 도달할 경우 로그가 유실될 우려가 있기 때문이다.
.. _admin-log-accessextra:
추가 로그
------------------------
``v2.12.9`` 부터 :ref:`admin-log-access` , :ref:`admin-log-access-custom` 를 추가할 수 있다. ::
# server.xml -
# vhosts.xml -
OFF
%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
.. _admin-log-access-custom:
사용자정의 Access 로그포맷
====================================
Access 로그형식을 사용자정의 로그로 설정한다. ::
# server.xml -
# vhosts.xml -
ON
%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
- ```` 의 ``Form`` 속성을 ``custom`` 으로 설정한다.
- ```` 사용자정의 로그 형식.
위 예제의 경우 다음과 같이 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`` 클라이언트 IP ``192.168.0.66``
``%A`` 서버IP 주소 ``192.168.0.14``
``%b`` HTTP헤더를 제외한 전송 바이트수 ``1024``
``%B`` 초당 Bandwidth ``(sc-bytes / (timetaken / 1000)= Bandwidth)`` ``1024``
``%c`` 서버가 수신한 Content-Length ``1024``
``%{foobar}C`` 서버가 수신한 요청의 Foobar 쿠키의 내용 ``%{id=}c``
``%d`` access.log ``sc-resinfo`` 필드
``%D`` 요청을 처리하는데 걸린 시간(MS) ``3000``
``%e`` SessionID (STON에서 발급하는 SessionID) ``1``
``%f`` 파일명 ``/mp4/iu.mp4``
``%g`` Apache 로그 시간 형식 ``28/Jul/2006:10:27:32 -0300``
``%{foobar}G`` 서버가 수신한 요청헤더의 foobar 내용 (스페이스는 +로 인코딩) ``gzip,+deflate,+br,``
``%h`` HostName ``example.com``
``%H`` 클라이언트 요청 프로토콜 ``HTTP``
``%{foobar}i`` 서버가 수신한 요청헤더의 foobar 내용 ``%{X-Forwarded-For}i``
``%I`` HTTP 요청헤더를 포함한 서버가 송신한 바이트 수 ``1024``
``%j`` 서버가 수신한 Range 값 ``218103808-236978175``
``%k`` 서버가 수신한 Accept-Encoding 헤더의 값 ``gzip``
``%K`` 서버가 수신한 HTTP 버전 ``HTTP/1.0``
``%{foobar}l`` 서버가 송신 한 응답헤더의 foobar 내용 (스페이스는 +로 인코딩) ``my+customer+header``
``%L`` 가상호스트 링크 결과 값 ``foo.com``
``%m`` 서버가 수신한 HTTP Method ``GET``
``%{foobar}o`` 서버가 송신 한 응답헤더의 foobar 내용 ``my customer header``
``%O`` HTTP헤더를 포함한 전송 바이트수 ``1024``
``%p`` TLS Ciphersuite ``TLS_AES_128_GCM_SHA256``
``%P`` 서버 Port ``80``
``%q`` 쿼리스트링 ``a=1&b=2``
``%{foobar}Q`` 서버가 수신한 Foobar 쿼리스트링의 내용 ``value``
``%r`` 서버가 수신한 Request Line ``GET / HTTP/1/1``
``%R`` 서버에서 응답이 시작되기까지 걸린 시간 ``0``
``%s`` HTTP 응답 코드 ``200``
``%S`` Cache Result ``TCP_HIT``
``%{format}t`` 응답 시간({format}을 생략 할 경우 STON 기본 시간형식으로 기록) ``2024-12-20 14:45:01``
``%T`` TimeTaken(초단위) ``1``
``%u`` 요청 Full URI ``/index.html?v=1``
``%U`` 쿼리스트링을 제외한 URI ``/index.html``
``%v`` 제품 버전 ``2.11.1``
``%V`` 가상호스트 "설정상" 이름 ``www.example.com``
``%x`` HTTP 트랜잭션 결과 (소문자로 기록) ``c``
``%X`` HTTP 트랜잭션 결과 (대문자로 기록) ``C``
``%y`` HTTP 요청 헤더 크기 ``100``
``%z`` HTTP 응답 헤더 크기 ``100``
============== =================================================================== =========================================
설정한 필드의 값이 존재하지 않으면 - 로 표기한다.
형식이 잘못되었다면 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"
.. _admin-log-origin:
Origin 로그
====================================
원본서버의 모든 HTTP 트랜잭션을 기록한다.
기록 시점은 HTTP 트랜잭션이 완료되는 시점이며 전송완료 또는 전송중단 시점을 의미한다. ::
# server.xml -
# vhosts.xml -
ON
::
#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]로 시작하는 에러 로그가 기록된다.
모든 필드는 공백으로 구분되며 각 필드의 의미는 다음과 같다.
.. figure:: img/time_taken.jpg
:align: center
원본 시간측정 구간
- ``date`` HTTP 트랜잭션이 완료된 날짜
- ``time`` HTTP 트랜잭션이 완료된 시간
- ``cs-sid`` 세션의 고유ID. 같은 세션을 통해 처리된(재사용된) HTTP 트랜잭션은 같은 값을 가진다.
- ``cs-tcount`` 트랜잭션 카운트. 이 HTTP 트랜잭션이 현재 세션에서 몇 번째로 처리된 트랜잭션인지 기록한다. 같은 ``cs-sid`` 값을 가지는 트랜잭션이라면 이 값은 중복될 수 없다.
- ``c-ip`` STON의 IP
- ``cs-method`` 원본서버에게 보낸 HTTP Method
- ``s-domain`` 원본서버 도메인
- ``cs-uri`` 원본서버에게 보낸 URI
- ``s-ip`` 원본서버 IP
- ``sc-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 Length
- ``cs-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`` :ref:`origin_exclusion_and_recovery` 에서 복구용도로 사용된 세션
- ``healthcheck`` :ref:`origin-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`` :ref:`origin-balancemode` ``RoundRobin`` 설정
- ``hash`` :ref:`origin-balancemode` ``Hash`` 설정
- ``session`` :ref:`origin-balancemode` ``Session`` 설정
- ``boaf`` :ref:`bypass-affinity-sticky` ``OriginAffinity`` 속성 활성화 바이패스
- ``bs`` :ref:`bypass-affinity-sticky` ``Sticky`` 속성 활성화 바이패스
- ``-`` :ref:`origin_exclusion_and_recovery` 또는 :ref:`origin-health-checker`
.. note::
:ref:`origin-balancemode-on-counter` 으로 동작할 경우 분산 알고리즘과 판단 조건이 같이 기록된다. ::
rr;47>30 # AccessGt(30)보다 더 많은 요청(47)이 기록되어 RR로 원본 선택
.. _admin-log-image:
Image 로그
====================================
On-the-fly 이미지 처리 결과를 기록한다.
.. figure:: img/image_log1.png
:align: center
Image.log는 Access.log와 Origin.log사이에 위치하며 다음과 같은 관계를 가진다.
- ``Access.log`` 신규 가공일 경우(TCP_MISS)에만 Image.log에 기록된다.
- ``Origin.log`` Image.log에만 기록되었다면 원본 이미지는 이미 캐싱되어 있는 상태이다.
기존 로그 설정방식과 동일하며, Access.log, Origin.log와 동일하게 가상호스트별로 설정한다. ::
# server.xml -
# vhosts.xml -
OFF
기본 값은 ``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`` 이미지 가공을 요청한 클라이언트 세션 ID
- ``cs-uri`` 클라이언트가 요청한 URI
- ``x-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 (단위: 밀리세컨드)`` 이미지 가공 소요시간
.. _admin-log-monitoring:
Monitoring 로그
====================================
5분 평균 통계를 기록한다. ::
# server.xml -
# vhosts.xml -
ON
- ``Form`` 로그형식을 지정한다. ( ``json`` 또는 ``xml`` )
.. _admin-log-filesystem:
FileSystem 로그
====================================
:ref:`filesystem` 을 통해 발생하는 모든 File I/O 트랜잭션을 기록한다. ::
# server.xml -
# vhosts.xml -
ON
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`` 파일 서비스 대기 중 Timeout
- ``601`` 파일 데이터 서비스 대기 중 Timeout
- ``602`` 파일 서비스 대기 중 파일초기화 실패
- ``603`` 파일 데이터 서비스 대기 중 데이터 초기화 실패
- ``701`` 잘못된 Offset
- ``702`` 파일의 특정 영역을 로딩 실패
- ``703`` Not enough memory
- ``704`` 원본세션 생성 실패
- ``sc-bytes`` Read된 크기
- ``response-time`` 함수 호출 ~ 서비스객체를 연결하는데 소요된 시간
- ``time-taken`` 함수 호출 ~ File I/O Transaction이 완료되는데 소요된 시간.
- ``sc-cachehit`` 캐시 HIT결과.
- ``attr`` FILE 또는 FOLDER
- ``session-id`` File I/O 세션 ID (unsigned int64)
.. note::
``session-id`` 는 Client(HTTP 또는 File I/O) Context가 생성될 때 할당된다.
일반적인 파일 처리 과정인 Open -> Read -> Close에서는 Open시점에 Client Context가
생성되며 Close시점에 파괴된다.
반면 getattr함수는 원자성(Atomic)함수이므로 매번 Client Context가 생성/파괴되어
항상 새로운 session-id를 할당 받는다.
.. _admin-log-ftp:
FTP 전송
====================================
로그가 롤링될 때 지정된 FTP클라이언트를 통해 로그를 업로드 한다.
.. _admin-log-ftpclient:
FTP 클라이언트
---------------------
FTP 클라이언트를 설정한다.
롤링된 로그를 실시간으로 FTP서버로 업로드한다.
.. figure:: img/conf_ftpclient.png
:align: center
FTP클라이언트 구조와 동작
FTP 클라이언트는 위 그림과 같이 STON외부에 존재한다.
STON은 로컬에 존재하는 로그를 FTP클라이언트 큐에 입력할 뿐 FTP의 동작에는 관여하지 않는다.
FTP클라이언트는 자신의 설정에 따라 업로드를 진행한다.
FTP 클라이언트는 전역설정(server.xml)에 설정한다. ::
# server.xml -
Passive
ftp.winesoft.co.kr:21
test
12345abc
10
600
0
OFF
OFF
/log_backup/%v/%s-%e.%p.log
Active
192.168.0.14:21
test
qwerty
3
100
10240
ON
ON
04:00
- ```` FTP 클라이언트를 설정한다. ``Name`` 속성으로 고유의 이름을 설정한다.
- ``Mode (기본: Passive)`` 접속모드 ( ``Passive`` 또는 ``Active`` )
- ``Address`` FTP주소.
- ``Account`` FTP 계정. 만약 비밀번호(예를 들어 qwerty)를 암호화하고 싶다면 다음 API 사용한다. ::
/command/encryptpassword?plain=qwerty
암호화된 비밀번호는 다음과 같이 설정한다. ::
dXR9k0xNUZVVYQsK5Bi1cg==
- ``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 -
/log_backup/%v/%s-%e.%p.log
업로드 경로는 다음과 같다. ::
/log_backup/example.com/200140722_0000-200140722_2300.access.log
- ``TransferTime`` 로그 전송시간을 지정한다. ``Type`` 속성에 따라 값의 형식이 달라진다.
- ``Rotate (기본)`` 롤링되면 바로 전송한다. 값을 가지지 않는다.
- ``Static`` 하루에 한번 지정된 시간에 전송한다. 예를 들어 04:00으로 설정됐다면 새벽 4시에 전송을 시작한다.
- ``Interval`` 일정시간 간격으로 전송한다. 예를 들어 4로 설정했다면 4시간 간격으로 로그를 전송한다.
전송시간을 설정할 경우 해당 시점에 로그가 롤링되지 않도록 적절히 로그관리 정책을 구성해야 한다.
FTP클라이언트는 curl을 사용한다.
.. admin-log-ftplog:
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 에러 메세지
.. admin-log-ftptransfer:
로그 FTP전송
---------------------
로그가 롤링될 때 지정된 `FTP 클라이언트` 를 통해 업로드 한다.
콤마(,)로 구분하면 여러 `FTP 클라이언트` 를 동시에 사용할 수 있다. ::
# server.xml -
# vhosts.xml -
ON
ON
ON
ON
- ``Ftp`` 사용할 `FTP 클라이언트`
ftp://{FTP서버 주소}/{가상호스트이름}/{롤링된 로그 이름} 으로 로그를 업로드 한다.
예를 들어 ftp.dummy.com서버에 가상호스트 example.com의 롤링된 로그(access_20140424_0000.log)를
업로드하는 주소는 ftp://ftp.dummy.com/example.com/access_20140424_0000.log가 된다.