メインコンテンツまでスキップ

DockerコンテナのログをS3に蓄積しAthenaでクエリーする手順

· 約18分
moritalous

DockerコンテナのログをS3に蓄積して、Athenaでクエリーする手順を確認しました。 実現できることはわかっていましたが、 実際に手を動かすと色々躓いた ので結果を残します。

Dockerのログ

Dockerコンテナのログはdocker logsコマンドで確認できます。

docker run -it --rm -p 80:80 -d nginx
docker logs `docker ps -l -q`
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2023/02/12 01:19:17 [notice] 1#1: using the "epoll" event method
2023/02/12 01:19:17 [notice] 1#1: nginx/1.23.3
2023/02/12 01:19:17 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
2023/02/12 01:19:17 [notice] 1#1: OS: Linux 5.15.79.1-microsoft-standard-WSL2
2023/02/12 01:19:17 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2023/02/12 01:19:17 [notice] 1#1: start worker processes
2023/02/12 01:19:17 [notice] 1#1: start worker process 29
2023/02/12 01:19:17 [notice] 1#1: start worker process 30
2023/02/12 01:19:17 [notice] 1#1: start worker process 31
2023/02/12 01:19:17 [notice] 1#1: start worker process 32
2023/02/12 01:19:17 [notice] 1#1: start worker process 33
2023/02/12 01:19:17 [notice] 1#1: start worker process 34
172.17.0.1 - - [12/Feb/2023:01:19:23 +0000] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"
注記

docker ps -l -qは最後に作成したコンテナのコンテナIDを取得しています。

-l, --latest          Show the latest created container (includes all states)
-q, --quiet Only display container IDs

ログ出力のしくみはログドライバーで実装されていて、ログドライバーを変更することでログの出力先を変更できます。デフォルトではjson-fileというログドライバーが設定されています。

  • ログドライバー一覧

公式ドキュメントより

DriverDescription
noneコンテナのログは利用できず、docker logs は何も出力を返しません。
localログは最小限のオーバーヘッドのために設計されたカスタムフォーマットで保存されます。
json-fileログはJSONとしてフォーマットされます。Dockerのデフォルトのロギングドライバです。
syslogロギングメッセージを syslog 機能に書き込みます。ホストマシン上で syslog デーモンが動作している必要があります。
journaldログメッセージを journald に書き込みます。ホストマシン上で journald デーモンが動作している必要があります。
gelfGraylog や Logstash のような Graylog Extended Log Format (GELF) エンドポイントにログメッセージを書き込みます。
fluentdログメッセージを fluentd (フォワードインプット) に書き込みます。fluentd デーモンはホストマシン上で動作している必要があります。
awslogsAmazon CloudWatch Logsにログメッセージを書き込む。
splunkHTTP Event Collector を使用して、ログメッセージを splunk に書き込む。
etwlogsEvent Tracing for Windows (ETW) イベントとしてログメッセージを書き込む。Windowsプラットフォームでのみ利用可能です。
gcplogsGoogle Cloud Platform (GCP) Logging にログメッセージを書き込む。
logentriesRapid7 Logentries にログメッセージを書き込む。

今回はKinesis Data Firehose経由でS3に出力したいので、fluentdログドライバーを使用します。

Kinesis Data Firehose、S3の準備

マネジメントコンソールから作成しました。 特に難しくはないと思いますので説明は省略します。

AWS for Fluent Bitコンテナの起動

Dockerコンテナからのログを受けとるfluentdとしてAWS for Fluent Bitを使用します。

ややこしいですが、

と理解しています。

Docker Composeで起動します。

version: '3'

services:
aws-for-fluent-bit:
image: public.ecr.aws/aws-observability/aws-for-fluent-bit:latest
volumes:
- ./fluent-bit.conf:/fluent-bit/etc/fluent-bit.conf
- ./.aws:/root/.aws
ports:
- 24224:24224

「fluentd デーモンはホストマシン上で動作している必要があります。」という条件のためポートを公開して起動します。 Volumeでマウントしているのは設定ファイルとAWSの認証情報です。S3へのログ出力にKinesis Data Firehoseを使用するため、以下のような設定ファイルを用意します。

fluent-bit.conf
[INPUT]
Name forward
Listen 0.0.0.0
Port 24224

[OUTPUT]
Name firehose
Match **
region ap-northeast-1
delivery_stream [Kinesis Data Firehoseのストリーム名]

fluentdログドライバーの使用

Nginxコンテナのログをfluentdに送信するように設定します。

docker-compose.yaml
version: '3'

services:
web:
image: public.ecr.aws/nginx/nginx:latest
ports:
- 8080:80
logging:
driver: fluentd
options:
fluentd-address: "localhost:24224"
fluentd-async-connect: "false"
tag: "nginx"
depends_on:
- aws-for-fluent-bit

aws-for-fluent-bit:
image: public.ecr.aws/aws-observability/aws-for-fluent-bit:latest
volumes:
- ./fluent-bit.conf:/fluent-bit/etc/fluent-bit.conf
- ./.aws:/root/.aws
ports:
- 24224:24224

loggingの部分でログドライバーを指定しています。 Dokcerデーモンからみたログドライバーのアドレスなのでfluentdのアドレスはlocalhostとなります。

これでログがS3に蓄積されると思います。

ログの確認

S3に蓄積されたログはfluentdログドライバーのフォーマットとなっています。

{
"container_id": "4863f2d60f6722704cae573d7a14a13cdedfa2283b08b9adfa3ca87b739f96e2",
"container_name": "/nginx-fluentbit-s3-web-1",
"log": "172.24.0.1 - - [11/Feb/2023:09:45:55 +0000] \"GET /aaaa HTTP/1.1\" 404 555 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36\" \"-\"",
"source": "stdout"
}

ログのAthenaによる検索

ログをAthenaでクエリーします。

fluentd_jsonテーブルの作成

まずはテーブルを作成します。

CREATE EXTERNAL TABLE `fluentd_json`(
`container_id` string,
`container_name` string,
`log` string,
`source` string)
PARTITIONED BY (
`datehour` string)
ROW FORMAT SERDE
'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
'case.insensitive'='TRUE',
'dots.in.keys'='FALSE',
'ignore.malformed.json'='FALSE',
'mapping'='TRUE')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://[バケット名]/'
TBLPROPERTIES (
'classification'='json',
'projection.datehour.format'='yyyy/MM/dd/HH',
'projection.datehour.interval'='1',
'projection.datehour.interval.unit'='HOURS',
'projection.datehour.range'='2023/01/01/00,NOW',
'projection.datehour.type'='date',
'projection.enabled'='true',
'storage.location.template'='s3://[バケット名]/${datehour}/',
'transient_lastDdlTime'='1676114385')

ログファイルがJSONフォーマットのため、ROW FORMAT SERDEとして'org.openx.data.jsonserde.JsonSerDe'`を指定しています。(参考ドキュメント

また、Firehoseで出力した場合はパーティション分割されているので、PARTITIONED BYTBLPROPERTIESで指定しています。(参考ドキュメント

fluentd_jsonテーブルの検索

SELECT * FROM fluentd_json limit 10;
  • 検索結果
#container_idcontainer_namelogsourcedatehour
14863f2d60f6722704cae573d7a14a13cdedfa2283b08b9adfa3ca87b739f96e2/nginx-fluentbit-s3-web-1172.24.0.1 - - [11/Feb/2023:09:45:49 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"stdout2023/02/11/09
24863f2d60f6722704cae573d7a14a13cdedfa2283b08b9adfa3ca87b739f96e2/nginx-fluentbit-s3-web-1172.24.0.1 - - [11/Feb/2023:09:45:50 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"stdout2023/02/11/09
34863f2d60f6722704cae573d7a14a13cdedfa2283b08b9adfa3ca87b739f96e2/nginx-fluentbit-s3-web-1172.24.0.1 - - [11/Feb/2023:09:45:50 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"stdout2023/02/11/09
44863f2d60f6722704cae573d7a14a13cdedfa2283b08b9adfa3ca87b739f96e2/nginx-fluentbit-s3-web-1172.24.0.1 - - [11/Feb/2023:09:45:50 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"stdout2023/02/11/09
54863f2d60f6722704cae573d7a14a13cdedfa2283b08b9adfa3ca87b739f96e2/nginx-fluentbit-s3-web-1172.24.0.1 - - [11/Feb/2023:09:45:50 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"stdout2023/02/11/09
64863f2d60f6722704cae573d7a14a13cdedfa2283b08b9adfa3ca87b739f96e2/nginx-fluentbit-s3-web-1172.24.0.1 - - [11/Feb/2023:09:45:51 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"stdout2023/02/11/09
74863f2d60f6722704cae573d7a14a13cdedfa2283b08b9adfa3ca87b739f96e2/nginx-fluentbit-s3-web-1172.24.0.1 - - [11/Feb/2023:09:45:51 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"stdout2023/02/11/09
84863f2d60f6722704cae573d7a14a13cdedfa2283b08b9adfa3ca87b739f96e2/nginx-fluentbit-s3-web-1172.24.0.1 - - [11/Feb/2023:09:45:51 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"stdout2023/02/11/09
94863f2d60f6722704cae573d7a14a13cdedfa2283b08b9adfa3ca87b739f96e2/nginx-fluentbit-s3-web-12023/02/11 09:45:55 [error] 31#31: *3 open() "/usr/share/nginx/html/aaaa" failed (2: No such file or directory), client: 172.24.0.1, server: localhost, request: "GET /aaaa HTTP/1.1", host: "localhost:8080"stderr2023/02/11/09
104863f2d60f6722704cae573d7a14a13cdedfa2283b08b9adfa3ca87b739f96e2/nginx-fluentbit-s3-web-1172.24.0.1 - - [11/Feb/2023:09:45:55 +0000] "GET /aaaa HTTP/1.1" 404 555 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"stdout2023/02/11/09

sourcestdoutのものとstderrのものがあります。

Nginxコンテナの場合は、/var/log/nginx/access.logstdoutとして、/var/log/nginx/error.logstderrで出力されるように構成されています。(参考ドキュメント

注記

stdoutとstderrの使い分けについて、Nginxコンテナでは以下のような実装になっています。コンテナイメージの設計の際に参考にしましょう。

# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log

logカラムを分割した新しいテーブルを作成

Nginxの生ログがlogカラムにまとまっているため、レスポンスコードでフィルターをかけるなどが難しいです。

  1. fluentd_jsonテーブルからlogカラムのみのテーブルを新規作成
  2. logをNginxのログフォーマットに従って分割したテーブルを作成

という手順を行います。

1. fluentd_jsonテーブルからlogカラムのみのテーブルを新規作成

CREATE TABLE AS SELECT (CTAS) クエリを使って新しいテーブルを作成します。(参考ドキュメント) CTASクエリではテーブル構造だけでなくデータをコピーします。(データをコピーしないオプションもあり)そのため出力先としてS3バケットを指定します。

CREATE TABLE log_ctas
WITH (
format = 'TEXTFILE',
external_location = 's3://[新しい出力先バケット]/'
)
AS
SELECT log FROM fluentd_json WHERE source = 'stdout' AND datehour > '2023/02/01/00'

WITH句の指定はこちらを参考にしました。目視で確認したかったのでTEXTFILE形式にしました。

SELECT * FROM log_ctas limit 10;
#log
1172.24.0.1 - - [11/Feb/2023:09:45:49 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"
2172.24.0.1 - - [11/Feb/2023:09:45:50 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"
3172.24.0.1 - - [11/Feb/2023:09:45:50 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"
4172.24.0.1 - - [11/Feb/2023:09:45:50 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"
5172.24.0.1 - - [11/Feb/2023:09:45:50 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"
6172.24.0.1 - - [11/Feb/2023:09:45:51 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"
7172.24.0.1 - - [11/Feb/2023:09:45:51 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"
8172.24.0.1 - - [11/Feb/2023:09:45:51 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"
9172.24.0.1 - - [11/Feb/2023:09:45:55 +0000] "GET /aaaa HTTP/1.1" 404 555 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"
10172.24.0.1 - - [11/Feb/2023:09:47:14 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"

これでまずlogカラムのみのテーブルが作成できました。

2. logをNginxのログフォーマットに従って分割したテーブルを作成

log_ctasテーブル作成の際にデータもコピーされています。コピーされたデータを対象に、Nginxのログフォーマットで分割したテーブルを作成します。

NginxのログフォーマットはNginxコンテナ内のnginx.confで定義されています。

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

このフォーマットに従って分割したテーブルを作成します。Apacheのログを分割する方法を参考にします。

CREATE EXTERNAL TABLE nginx_logs(
remote_addr string,
remote_user string,
time_local string,
request string,
server_status string,
body_bytes_sent string,
http_referer string,
http_user_agent string,
http_x_forwarded_for string
)
ROW FORMAT SERDE
'com.amazonaws.glue.serde.GrokSerDe'
WITH SERDEPROPERTIES (
'input.format'='^%{IPV4:remote_addr} - %{USERNAME:remote_user} .%{GREEDYDATA:time_local}. %{QUOTEDSTRING:request} %{DATA:server_status} %{DATA: body_bytes_sent} %{QUOTEDSTRING: http_referer} %{QUOTEDSTRING: http_user_agent} %{QUOTEDSTRING: http_x_forwarded_for}$'
)
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://[新しい出力先バケット]/';

input.formatで分割方法を定義しています。Grok SerDe定義済みパターンを巧みに使いこなす必要があります。

例えば、%{IPV4:remote_addr}の部分はIPV4の定義(?<![0-9])(?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))(?![0-9])にマッチする部分をremote_addrという名前で抽出しています。抽出したremote_addrをSELECT句で更に指定します。

SELECT * FROM nginx_logs where remote_addr is not null limit 10 ;
#remote_addrremote_usertime_localrequestserver_statusbody_bytes_senthttp_refererhttp_user_agenthttp_x_forwarded_for
1172.24.0.1-11/Feb/2023:09:50:58 +0000GET / HTTP/1.13040-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36-
2172.24.0.1-11/Feb/2023:09:51:08 +0000GET /a HTTP/1.1404555-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36-
3172.24.0.1-11/Feb/2023:09:45:49 +0000GET / HTTP/1.13040-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36-
4172.24.0.1-11/Feb/2023:09:45:50 +0000GET / HTTP/1.13040-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36-
5172.24.0.1-11/Feb/2023:09:45:50 +0000GET / HTTP/1.13040-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36-
6172.24.0.1-11/Feb/2023:09:45:50 +0000GET / HTTP/1.13040-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36-
7172.24.0.1-11/Feb/2023:09:45:50 +0000GET / HTTP/1.13040-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36-
8172.24.0.1-11/Feb/2023:09:45:51 +0000GET / HTTP/1.13040-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36-
9172.24.0.1-11/Feb/2023:09:45:51 +0000GET / HTTP/1.13040-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36-
10172.24.0.1-11/Feb/2023:09:45:51 +0000GET / HTTP/1.13040-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36-

これでログの分割ができました。検索しやすくなりましたね。

requestカラムがGET / HTTP/1.1となっているのでここも分割したい場合は、関数を使って分割できます。(Athenaクエリエンジン3で検証。文字列関数配列関数

SELECT
split(request, ' ')[1] as method,
split(request, ' ')[2] as path,
split(request, ' ')[3] as http_version,
*
FROM nginx_logs where remote_addr is not null limit 10;
#methodpathhttp_versionremote_addrremote_usertime_localrequestserver_statusbody_bytes_senthttp_refererhttp_user_agenthttp_x_forwarded_for
1GET/HTTP/1.1172.24.0.1-11/Feb/2023:09:50:58 +0000GET / HTTP/1.13040-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36-
2GET/aHTTP/1.1172.24.0.1-11/Feb/2023:09:51:08 +0000GET /a HTTP/1.1404555-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36-
3GET/HTTP/1.1172.24.0.1-11/Feb/2023:09:45:49 +0000GET / HTTP/1.13040-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36-
4GET/HTTP/1.1172.24.0.1-11/Feb/2023:09:45:50 +0000GET / HTTP/1.13040-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36-
5GET/HTTP/1.1172.24.0.1-11/Feb/2023:09:45:50 +0000GET / HTTP/1.13040-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36-
6GET/HTTP/1.1172.24.0.1-11/Feb/2023:09:45:50 +0000GET / HTTP/1.13040-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36-
7GET/HTTP/1.1172.24.0.1-11/Feb/2023:09:45:50 +0000GET / HTTP/1.13040-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36-
8GET/HTTP/1.1172.24.0.1-11/Feb/2023:09:45:51 +0000GET / HTTP/1.13040-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36-
9GET/HTTP/1.1172.24.0.1-11/Feb/2023:09:45:51 +0000GET / HTTP/1.13040-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36-
10GET/HTTP/1.1172.24.0.1-11/Feb/2023:09:45:51 +0000GET / HTTP/1.13040-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36-

まとめ

長くなりましたが、手順はそれほど難しくありません。ログの検索もいつ行う必要があるかわかりませんので、手順の確認を行っておくと良いですね。