/
데이터 수집 방법 (2) Socket/ODBC

데이터 수집 방법 (2) Socket/ODBC

Socket 방식


Collector가 소켓에서 데이터를 읽어서 이를 파싱하고 데이터베이스 서버에 입력하는 방법이다. 소켓 모드를 이용하려면 포트 번호를 설정해야 한다. 이 모드를 이용하면 rsyslog, logstash, nxlog등의 프로그램에서 처리한 로그 데이터를 수신하여 처리할 수 있다.

추가 값 설정

SOCKET 모드로 데이터를 수신하기 위해서 SOCKET_PORT변수의 설정이 필요하다.

옵션 이름설명비고
SOCKET_PORT데이터를 수신할 포트 번호다른 프로그램이 사용하지 않는 포트를 지정해야 한다.

목차



예제 (1) 정규 표현식/템플릿 파일 작성

이 예제는 SOCKET 모드로 데이터를 수집하는 것이다. SOCKET 모드는 소켓을 열고 외부 프로그램이 데이터를 입력하는 것을 기다린다.

Syslog를 수집하기 위해서는 rsyslog를 이용할 것을 추천한다. 이 예제는 rsyslog를 이용하여 데이터를 수집하여 분석한다.

데이터의 송신은 다른 프로그램에서 실행하는 것으로 아래의 설정 파일에서는 단순히 rgx 파일과 tpl파일의 설정만을 다룬다. 

FILE 모드 데이터 처리 예제에서 사용한 syslog.rgx는 그대로 사용 가능하다.


아래 예제에서 소켓 포트 번호는 33333 을 이용하였다. 이 포트는 방화벽에서 접속 허용을 해 주어야 한다.

###############################################################################
# Copyright of this product 2013-2023,
# Machbase Corporation (Incorporation) or its subsidiaries.
# All Rights reserved
###############################################################################

# This file is for Machbase collector template file.

###################################################################
# Collect setting
###################################################################

COLLECT_TYPE=SOCKET

SOCKET_PORT=33333

###################################################################
# Process setting
###################################################################

REGEX_PATH=syslog.rgx

###################################################################
# Output setting
###################################################################

DB_TABLE_NAME = "socket_syslogtable"
DB_ADDR = "127.0.0.1"
DB_PORT = 5656
DB_USER = "SYS"
DB_PASS = "MANAGER"

# 0: Direct insert
# 1: Prepared insert
# 2: Append
APPEND_MODE=2

# 0: None, just append.
# 1: Truncate.
# 2: Try to create table. If table already exists, warn it and proceed.
# 3: Drop and create.
CREATE_TABLE_MODE=2


예제 (2) Collector 실행

위 예제의 socket_syslog.tpl 파일을 이용하여 콜렉터를 생성하고 이를 실행한다. (생성 및 실행은 FILE모드와 동일하다.)

Mach> create collector localhost.file_syslog from "/home/machbase_home/collector/socket_syslog.tpl";
Created successfully.
 
Mach> ALTER COLLECTOR localhost.file_syslog START;
Altered successfully.

Collector가 정상적으로 실행되어 연결 중인지 확인하려면 다음의 명령을 실행한다.

[mach@localhost ~]$ netstat -anp | grep "LISTEN " | grep 33333
(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:33333 0.0.0.0:* LISTEN 20818/machcollecto
[mach@localhost ~]$

위 실행 결과를 보면 33333 포트에서 collector가 데이터의 입력을 대기하고 있는 것을 확인할 수 있다.


예제 (3) 데이터 입력

데이터를 rsyslog를 이용하여 입력해 보자.

rsyslog 프로그램의 설정을 root 권한이 있는 사용자로 로그인하여 rsyslog 설정 파일(/etc/rsyslog.d/.conf)를 다음과 같이 작성한다.

*.* @@127.0.0.1:33333

또는 아래와 같이 자세한 설정을 할 수 있다.

아래의 내용을 "/etc/rsyslog.d/127.0.0.1_syslog.conf" 파일로 작성한다. rsyslog를 재시작하면 syslog 데이터가 생성될 때 마다 socket으로 데이터를 출력해 준다.

$ModLoad imfile

$InputFileName /var/log/syslog
$InputFileTag syslog_file:
$InputFileStateFile stat-syslog
$InputFilePollInterval 1
$InputRunFileMonitor

if $programname == 'syslog_file' then @@127.0.0.1:33333

그 다음, rsyslog 데몬을 재시작한다.

# service rsyslog restart
rsyslog stop/waiting
rsyslog start/running, process 22936

rsyslog가 재시작되면 /var/log/syslog데이터를 127.0.0.1:33333포트에 기록한다.

collector는 소켓 연결을 통해 데이터를 수집하고 이를 분석하여 마크베이스 서버에 입력한다.
rsyslog 설정에서 $InputFilePollInterval 변수를 1로 설정하였으므로 초기에 데이터 입력 속도가 느릴 수 있다.

데이터가 정상적으로 입력되었다면 데이터베이스 서버에서 아래의 SELECT 쿼리를 이용하여 해당 테이블에서 데이터를 확인할 수 있다.

Mach> select * from socket_syslogtable order by _arrival_time asc limit 10;
COLLECTOR_TYPE COLLECTOR_ADDR
-----------------------------------------------------
COLLECTOR_ORIGIN COLLECTOR_OFFSET
----------------------------------------------------------------------------------------------------------
TM HOST
---------------------------------------------------------------------------------------------------------------------
MSG
------------------------------------------------------------------------------------
SOCKET 127.0.0.1
NULL 1
2016-06-28 23:50:17 000:000:000 localhost
syslog_file: Jun 20 04:31:43 localhost kernel: imklog 5.8.10, log source = /proc
/kmsg started.
SOCKET 127.0.0.1
NULL 2
2016-06-28 23:50:17 000:000:000 localhost
syslog_file: Jun 20 04:31:43 localhost rsyslogd: [origin software="rsyslogd" swV
ersion="5.8.10" x-pid="15062" x-info="http://www.rsyslog.com"] start
SOCKET 127.0.0.1
NULL 3
2016-06-28 23:50:17 000:000:000 localhost
syslog_file: Jun 20 04:31:46 localhost kernel: imklog 5.8.10, log source = /proc/kmsg started.
SOCKET 127.0.0.1
NULL 4
2016-06-28 23:50:17 000:000:000 localhost
syslog_file: Jun 20 04:35:01 localhost CROND[15111]: (root) CMD (LANG=C LC_ALL=C
/usr/bin/mrtg /etc/mrtg/mrtg.cfg --lock-file /var/lock/mrtg/mrtg_l --confcache-
file /var/lib/mrtg/mrtg.ok)
SOCKET 127.0.0.1
NULL 5
2016-06-28 23:50:17 000:000:000 localhost
syslog_file: Jun 20 04:40:01 localhost CROND[15188]: (root) CMD (LANG=C LC_ALL=C
/usr/bin/mrtg /etc/mrtg/mrtg.cfg --lock-file /var/lock/mrtg/mrtg_l --confcache-
file /var/lib/mrtg/mrtg.ok)
SOCKET 127.0.0.1
NULL 6
2016-06-28 23:50:17 000:000:000 localhost
syslog_file: Jun 20 04:40:01 localhost CROND[15187]: (root) CMD (/usr/lib64/sa/s
a1 1 1)
SOCKET 127.0.0.1
NULL 7
2016-06-28 23:50:17 000:000:000 localhost
syslog_file: Jun 20 04:45:01 localhost CROND[15265]: (root) CMD (LANG=C LC_ALL=C
/usr/bin/mrtg /etc/mrtg/mrtg.cfg --lock-file /var/lock/mrtg/mrtg_l --confcache-
file /var/lib/mrtg/mrtg.ok)
SOCKET 127.0.0.1
NULL 8
2016-06-28 23:50:17 000:000:000 localhost
syslog_file: Jun 20 04:50:01 localhost CROND[15341]: (root) CMD (LANG=C LC_ALL=C
/usr/bin/mrtg /etc/mrtg/mrtg.cfg --lock-file /var/lock/mrtg/mrtg_l --confcache-
file /var/lib/mrtg/mrtg.ok)
SOCKET 127.0.0.1
NULL 9
2016-06-28 23:50:17 000:000:000 localhost
syslog_file: Jun 20 04:50:01 localhost CROND[15342]: (root) CMD (/usr/lib64/sa/s
a1 1 1)
SOCKET 127.0.0.1
NULL 10
2016-06-28 23:50:17 000:000:000 localhost
syslog_file: Jun 20 04:55:01 localhost CROND[15419]: (root) CMD (LANG=C LC_ALL=C
/usr/bin/mrtg /etc/mrtg/mrtg.cfg --lock-file /var/lock/mrtg/mrtg_l --confcache-
file /var/lib/mrtg/mrtg.ok)
[10] row(s) selected.

Log Collector 설정


소켓 입력 모드 예제는 rsyslog, logstash, nxlog 를 이용하여 실행된다.

이들 프로그램으로 로그 데이터를 소켓을 통해 입력 받으면 collector는 이를 수집하여 데이터베이스 서버에 입력한다.

rsyslog

rsyslog는 최근의 리눅스 배포판에 기본으로 포함되는 경우가 많다.
그래서 추가로 설치할 필요 없이 설정파일을 /etc/rsyslog.d/ 디렉토리에 추가한 다음 rsyslog 데몬을 재시작 해 주면 된다.

rsyslog는 이미 기록되어 있는 로그 데이터만 전송하는 것이 아니라, 신규로 로그 데이터가 기록될 때마다 데이터를 전송해 준다.

아래에 설정관련 내용이 있다.


간단한 설정 : 로그 전달 주소 설정

로그가 생성될 때 전달할 주소만 지정하는 방법이다. 다른 방법에 비해서 간단하다.
아래의 내용을 /etc/rsyslog.d/.conf 파일에 작성후 rsyslog를 재시작한다.

*.* @@<Collector host>:<Collector port>

이후 syslog 데이터는 collector host:port 로 전송된다.


복잡한 설정 : 입력 로그 파일 / 전송 주기 설정

좀 더 복잡한 방법은 입력 로그 파일 및 전송 주기를 설정할 수 있는 방법이다.

$ModLoad imfile

$InputFileName /var/log/syslog
$InputFileTag syslog_file:
$InputFileStateFile stat-syslog
$InputFilePollInterval 1
$InputRunFileMonitor

if $programname == 'syslog_file' then @@<Collector host>:<Collector port>

/etc/rsyslog.d/ 폴더에 .conf로 끝나는 파일을 작성한 후, rsyslog를 재시작하면 적용된다.

자세한 내용은 rsyslog 설명을 참고하라.

logstash

logstash를 설치하기 위해서는 Getting Started with Logstash를 참고하라.

logstash의 conf 파일을 수정하여 원하는 데이터를 소켓으로 전송할 수 있다.

아래의 예제를 참고한다.

input {
   file {
      path => "<Absolute path of log file>"
      }
   }
output {
   tcp {
      host => "<Collector host>"
      port => "<Collector port>"
        }
      }
  • "input" 부분에 입력 데이터 파일의 위치를 설정한다. syslog를 입력하고 싶다면 /var/log/syslog를 설정한다.
  • "output"부분에는 collector의 tcp 소켓을 입력해야 하므로 tcp 를 설정하고 ip와 포트번호를 설정한다.


Nxlog

Nxlog는 Windows를 위한 로그 수집기이다.

소켓 입력 모드를 위한 collector를 위한 rgx, tpl파일의 설정은 동일하고, nxlog를 위한 설정 파일의 예제는 다음과 같다.

보통 nxlog는 "C:\Program Files\nxlog" 또는  "C:\Program Files (x86)\nxlog"에 설치된다.

위 경로에 위치한 설정 파일을 다음과 같이 작성한다.

## This is a sample configuration file. See the nxlog reference manual about the
## configuration options. It should be installed locally and is also available
## online at http://nxlog-ce.sourceforge.net/nxlog-docs/en/nxlog-reference-manual.html


## Set the ROOT to the folder your nxlog was installed,
## otherwise it will not start.


#define ROOT C:\Program Files\nxlog
define ROOT C:\Program Files\nxlog


Moduledir %ROOT%\modules
CacheDir %ROOT%\data
Pidfile %ROOT%\data\nxlog.pid
SpoolDir %ROOT%\data
LogFile %ROOT%\data\nxlog.log


<Input in>
Module im_msvistalog
# For windows 2003 and earlier use the following:
# Module im_mseventlog
</Input>


<Output out>
Module om_tcp
Host <Collector host>
Port <Collector port>
</Output>


<Route 1>
Path in => out
</Route>

위의 예제에서 im_msvistalog 파일에 데이터가 기록되면 <Collector ip>:<collector port>로 소켓을 통한 데이터 전송을 설정한다.

설정 파일을 변경하고 서비스를 재시작하면 데이터를 소켓을 통해 collector에 전송한다.

자세한 설정 방법은 nxlog 메뉴얼을 참고하라.


ODBC 방식


ODBC모드는 ODBC연결로 접속할 수 있는 데이터베이스의 데이터를 collector로 수집하는 방법이다.

Linux환경에서는 unixODBC패키지를 설치해야 사용할 수 있다.
아래의 예제는 MySQL데이터베이스의 데이터를 unixODBC를 통해서 수집하는 것이다.

unixODBCMyODBC 의 설치 방법은 각각의 웹사이트를 참조하라.

추가 값 설정

다음의 변수들을 설정해야 한다.

옵션 이름설명비고
ODBC_DSN데이터베이스에 접근하기 위한 DSNODBC 설정에 기술된 DSN을 이용해야 한다.
ODBC_QUERY데이터 검색을 위한 질의문
ODBC_SEQ_COLUMN순차 증가값의 컬럼 명질의 대상 컬럼중의 하나여야 함. 숫자형만 지원함.


예제 (1) 데이터 생성

먼저 MySQL 데이터를 입력해야 한다. 다음 내용으로 데이터를 입력한다.

0,2015-05-20 06:00:00,16.194.51.72,6790,183.103.50.46,5281,20,GET /twiki/bin/view/TWiki/KlausWriessnegger HTTP/1.1,200,3848
1,2015-05-20 06:00:02,96.40.75.42,11011,31.224.72.52,12069,55,GET /twiki/bin/search/Main/SearchResult?scope=text®ex=on&search=Office%20*Locations[notA-Za-z] HTTP/1.1,200,7771
2,2015-05-20 06:00:02,174.47.129.59,6032,96.40.75.42,6442,72,GET /twiki/bin/edit/Main/WebSearch?t=1078669682 HTTP/1.1,401,12846
3,2015-05-20 06:00:02,153.199.166.54,4220,86.45.186.17,2245,1,GET /twiki/bin/oops/TWiki/RichardDonkin?template=oopsmore¶m1=1.2¶m2=1.2 HTTP/1.1,200,11281
4,2015-05-20 06:00:02,226.7.237.25,10805,50.230.44.173,179,70,GET /twiki/bin/oops/TWiki/AppendixFileSystem?template=oopsmore¶m1=1.12¶m2=1.12 HTTP/1.1,200,11382
5,2015-05-20 06:00:02,183.103.50.46,7175,96.128.212.177,7175,73,GET /twiki/bin/view/TWiki/DontNotify HTTP/1.1,200,4140
6,2015-05-20 06:00:02,123.198.82.192,6784,63.214.191.124,10825,21,GET /twiki/bin/view/TWiki/DontNotify HTTP/1.1,200,4140
7,2015-05-20 06:00:02,214.153.107.182,5562,85.183.139.166,1367,8,GET /twiki/bin/oops/TWiki/RichardDonkin?template=oopsmore¶m1=1.2¶m2=1.2 HTTP/1.1,200,11281
8,2015-05-20 06:00:02,245.13.24.17,7451,69.99.246.62,4497,20,GET /twiki/bin/view/Main/SpamAssassin HTTP/1.1,200,4081
9,2015-05-20 06:00:02,239.81.105.222,2245,71.129.68.118,1641,59,GET /twiki/bin/view/Main/TokyoOffice HTTP/1.1,200,3853

 수집 대상 테이블 컬럼은 seq, at, srcip, srcport, dstip, dstport, protocol, eventlog, eventcode, eventsize 이다. seq를 순차증가 컬럼으로 설정한다. 이 구조로 테이블을 생성하려면 mysql에서 다음의 질의를 수행한다.

mysql> create table odbc_seq_int_10 (seq int(9), at timestamp, srcip varchar(20), srcport int(6), dstip varchar(20), dstport int(6), protocol int(3), eventlog varchar(1024), eventcode int(9), eventsize int(9));

테이블을 정상적으로 생성하고 나서 다음의 명령으로 MySQL 데이터베이스에 데이터를 입력한다.

mysql> load data infile '<File Path>' into table <Table Name> fields terminated by ',';
Query OK, 10 rows affected (0.00 sec)
Records: 10 Deleted: 0 Skipped: 0 Warnings: 0

MySQL 데이터베이스 실행 관련 내용은 MySQL 매뉴얼을 참고하라.


예제 (2) ODBC 설정

MySQL 데이터베이스 접속을 위해 ODBC 설정 파일을 작성한다.

[MYSQL]
Driver=MySQL
Server=<Database host address>
Port=<Database host port>
Database=<Name of default database to access>
UID=<User ID>
PWD=<User password>

unixODBC에서는 USER DATA SOURCES가 먼저 이용되므로 collector를 실행하는 사용자 홈 디렉토리에서 .odbc.ini파일에 위 내용을 작성한다.

예제 (3) ODBC 설정 검사

ODBC 설정을 정상적으로 진행 되었는지 확인하기 위해서 unixODBC의 isql프로그램을 이용한다. 설정한 DSN인 MYSQL 을 매개변수로 해서 다음과 같이 실행한다.

$ isql -v MYSQL

정상적으로 설치되고 설정이 되었다면 다음과 같은 결과를 얻을 수 있을 것이다.

+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>


isql을 통해서, 입력된 데이터를 조회해 볼 수 있다.

SQL> select * from odbc_seq_int_10;
+-----+---------------------+-----------------+---------+----------------+---------+----------+---------------------------------------------------------------------------------------------------------+-----------+-----------+
| seq | at                  | srcip           | srcport | dstip          | dstport | protocol | eventlog                                                                                                | eventcode | eventsize |
+-----+---------------------+-----------------+---------+----------------+---------+----------+---------------------------------------------------------------------------------------------------------+-----------+-----------+
| 0   | 2015-05-20 06:00:00 | 16.194.51.72    | 6790    | 183.103.50.46  | 5281    | 20       | GET /twiki/bin/view/TWiki/KlausWriessnegger HTTP/1.1                                                    | 200       | 3848      |
| 1   | 2015-05-20 06:00:02 | 96.40.75.42     | 11011   | 31.224.72.52   | 12069   | 55       | GET /twiki/bin/search/Main/SearchResult?scope=text®ex=on&search=Office%20*Locations[notA-Za-z] HTTP/1.1 | 200       | 7771      |
| 2   | 2015-05-20 06:00:02 | 174.47.129.59   | 6032    | 96.40.75.42    | 6442    | 72       | GET /twiki/bin/edit/Main/WebSearch?t=1078669682 HTTP/1.1                                                | 401       | 12846     |
| 3   | 2015-05-20 06:00:02 | 153.199.166.54  | 4220    | 86.45.186.17   | 2245    | 1        | GET /twiki/bin/oops/TWiki/RichardDonkin?template=oopsmore¶m1=1.2¶m2=1.2 HTTP/1.1                        | 200       | 11281     |
| 4   | 2015-05-20 06:00:02 | 226.7.237.25    | 10805   | 50.230.44.173  | 179     | 70       | GET /twiki/bin/oops/TWiki/AppendixFileSystem?template=oopsmore¶m1=1.12¶m2=1.12 HTTP/1.1                 | 200       | 11382     |
| 5   | 2015-05-20 06:00:02 | 183.103.50.46   | 7175    | 96.128.212.177 | 7175    | 73       | GET /twiki/bin/view/TWiki/DontNotify HTTP/1.1                                                           | 200       | 4140      |
| 6   | 2015-05-20 06:00:02 | 123.198.82.192  | 6784    | 63.214.191.124 | 10825   | 21       | GET /twiki/bin/view/TWiki/DontNotify HTTP/1.1                                                           | 200       | 4140      |
| 7   | 2015-05-20 06:00:02 | 214.153.107.182 | 5562    | 85.183.139.166 | 1367    | 8        | GET /twiki/bin/oops/TWiki/RichardDonkin?template=oopsmore¶m1=1.2¶m2=1.2 HTTP/1.1                        | 200       | 11281     |
| 8   | 2015-05-20 06:00:02 | 245.13.24.17    | 7451    | 69.99.246.62   | 4497    | 20       | GET /twiki/bin/view/Main/SpamAssassin HTTP/1.1                                                          | 200       | 4081      |
| 9   | 2015-05-20 06:00:02 | 239.81.105.222  | 2245    | 71.129.68.118  | 1641    | 59       | GET /twiki/bin/view/Main/TokyoOffice HTTP/1.1                                                           | 200       | 3853      |
+-----+---------------------+-----------------+---------+----------------+---------+----------+---------------------------------------------------------------------------------------------------------+-----------+-----------+
SQLRowCount returns 10
10 row(s) fetched.
SQL>

위와 같은 결과를 얻을 수 없었다면, unixODBC 와 DSN 명을 확인해 보라. 관련된 자세한 내용은 unixODBC 문서를 참고하라.


예제 (4) Collector 설정

위에서 사용한 쿼리, DSN, 사용자명과 패스워드를 이용하여 tpl 파일을 생성한다.
ODBC 모드 입력 방식에서는 데이터가 컬럼 별로 분리되어 제공되므로 REGEX_PATH가 필요하지 않다.

###############################################################################
# Copyright of this product 2013-2023,
# Machbase Corporation (Incorporation) or its subsidiaries.
# All Rights reserved
###############################################################################

#
# This file is for Machbase collector template file.
#

###################################################################
# Collect setting
###################################################################

COLLECT_TYPE=ODBC
ODBC_DSN=MYSQL <= Name of driver specified in "odbc.ini"
ODBC_QUERY="select * from sample_seq_int_10" <= Not required to input other queries except select <Columns> from <Table name>.
ODBC_SEQ_COLUMN=seq <= The base column name that determines the order in the query results

###################################################################
# Process setting
###################################################################

#PREPROCESS_PATH=Python script file path

###################################################################
# Output setting
###################################################################

DB_TABLE_NAME = "sample_seq_int"
DB_ADDR = <Machbase Server Host>
DB_PORT = <Machbase Server Port>
DB_USER = "SYS"
DB_PASS = "MANAGER"

# 0: Direct insert
# 1: Prepared insert
# 2: Append
APPEND_MODE=2

# 0: None, just append.
# 1: Truncate.
# 2: Try to create table. If table already exists, warn it and proceed.
# 3: Drop and create.
CREATE_TABLE_MODE=2

위의 tpl파일을 이용하여 collector를 생성하고 시작한 다음 결과를 machsql 을 이용하여 확인해 보자.

Mach> select * from sample_seq_int limit 50;
COLLECTOR_TYPE COLLECTOR_ADDR
-----------------------------------------------------
COLLECTOR_ORIGIN COLLECTOR_OFFSET SEQ
-----------------------------------------------------------------------------------------------------------------------
AT SRCIP SRCPORT DSTIP DSTPORT PROTOCOL
-----------------------------------------------------------------------------------------------------------------------
EVENTLOG EVENTCODE EVENTSIZE
--------------------------------------------------------------------------------------------------------------
ODBC 192.168.122.1
MYSQL 9 9
1900-01-03 19:54:55 000:000:000 239.81.105.222 2245 71.129.68.118 1641 59
GET /twiki/bin/view/Main/TokyoOffice HTTP/1.1 200 3853
ODBC 192.168.122.1
MYSQL 8 8
1900-01-03 19:54:55 000:000:000 245.13.24.17 7451 69.99.246.62 4497 20
GET /twiki/bin/view/Main/SpamAssassin HTTP/1.1 200 4081
ODBC 192.168.122.1
MYSQL 7 7
1900-01-03 19:54:55 000:000:000 214.153.107.182 5562 85.183.139.166 1367 8
GET /twiki/bin/oops/TWiki/RichardDonkin?template=oopsmore¶m1=1.2¶m2=1.2 HTTP/1
.1 200 11281
ODBC 192.168.122.1
MYSQL 6 6
1900-01-03 19:54:55 000:000:000 123.198.82.192 6784 63.214.191.124 10825 21
GET /twiki/bin/view/TWiki/DontNotify HTTP/1.1 200 4140
ODBC 192.168.122.1
MYSQL 5 5
1900-01-03 19:54:55 000:000:000 183.103.50.46 7175 96.128.212.177 7175 73
GET /twiki/bin/view/TWiki/DontNotify HTTP/1.1 200 4140
ODBC 192.168.122.1
MYSQL 4 4
1900-01-03 19:54:55 000:000:000 226.7.237.25 10805 50.230.44.173 179 70
GET /twiki/bin/oops/TWiki/AppendixFileSystem?template=oopsmore¶m1=1.12¶m2=1.12
HTTP/1.1 200 11382
ODBC 192.168.122.1
MYSQL 3 3
1900-01-03 19:54:55 000:000:000 153.199.166.54 4220 86.45.186.17 2245 1
GET /twiki/bin/oops/TWiki/RichardDonkin?template=oopsmore¶m1=1.2¶m2=1.2 HTTP/1
.1 200 11281
ODBC 192.168.122.1
MYSQL 2 2
1900-01-03 19:54:55 000:000:000 174.47.129.59 6032 96.40.75.42 6442 72
GET /twiki/bin/edit/Main/WebSearch?t=1078669682 HTTP/1.1 401 12846
ODBC 192.168.122.1
MYSQL 1 1
1900-01-03 19:54:55 000:000:000 96.40.75.42 11011 31.224.72.52 12069 55
GET /twiki/bin/search/Main/SearchResult?scope=text®ex=on&search=Office%20*Locat
ions[notA-Za-z] HTTP/1.1 200 7771
ODBC 192.168.122.1
MYSQL 0 0
1900-01-03 19:54:55 000:000:000 16.194.51.72 6790 183.103.50.46 5281 20
GET /twiki/bin/view/TWiki/KlausWriessnegger HTTP/1.1 200 3848
[10] row(s) selected.

MySQL의 결과 출력과 역순으로 데이터가 출력 되는 것을 볼 수 있다.