로컬 Mac에 td-agent ( Fluentd )를 넣고 Amazon Athena에서 SQL 라이크로 로그를 추출할 때까지.

11355 단어 AthenaFluentdtd-agent

지금, 어느 곳에서



Rails 프로젝트가있었습니다.

거기에서는, aconsegui 라고 하는 gem 을 넣어, /log/development.log 에 원하는 로그 정보를 JSON 형식으로 보내고 있었습니다.

/config/initializers/lograge.rb
Rails.application.configure do
  config.lograge.enabled = true
  config.lograge.formatter = Lograge::Formatters::Json.new
  config.lograge.custom_options = lambda do |event|
    {
      user_id: event.payload[:user_id],
      user_email: event.payload[:user_email],
    }
  end
end

/log/development.log
# ...イメージ
{"method":"GET","path":"/dashboard/events","format":"json","controller":"DashboardController","action":"events","status":200,"duration":68.21,"view":0.44,"db":0.0,"user_id":"9999","user_email":"[email protected]"}

여기에 td-agent를 넣고 로그를 S3로 보내고 Amazon Athena에서 SQL과 같은 로그를 추출하는 것을 원합니다.

최종 이미지







먼저 td-agent (Fluentd)를 넣는 곳에서



Installing Fluentd using .dmg Installer (MacOS X) 여기에 쓰여진 대로 다운로드하고 td-agent를 넣습니다. 이건 빨리 빠져 들어갈 것 같아요.

다음에, fluent-plugin-s3 라고 하는 것을 넣고 싶습니다만, 이것이 어려웠습니다.

설치
/opt/td-agent/usr/sbin/td-agent-gem install fluent-plugin-s3

결론, 위의 명령으로 갈 수 있습니다만,... 어쨌든 갈 수 있습니다.

ref. htp // // cs. f 엔 td. 오 rg / v0. s-ho w-do-i-do-t

(자신의 메모.아래의 파일로부터 /opt/td-agent/usr/sbin/td-agent 의 장소를 확인.)

/Library/LaunchDaemons/td-agent.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>KeepAlive</key>
  <true/>
  <key>Label</key>
  <string>td-agent</string>
  <key>ProgramArguments</key>
  <array>
    <string>/opt/td-agent/usr/sbin/td-agent</string>
    <string>--log</string>
    <string>/var/log/td-agent/td-agent.log</string>
    <string>--use-v1-config</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>WorkingDirectory</key>
  <string>/opt/td-agent</string>
</dict>
</plist>

계속해서 설정 파일을 씁니다.



여러가지 배우면서(빠르면서), 완성한 것이 아래입니다. (일단 이것으로, 하고 싶은 일은 할 수 있었습니다.)

/etc/td-agent/td-agent.conf
<source>
  type forward
</source>

<source>
  type     tail
  tag      lograge
  format   json
  path     {project-path}/log/development.log
  pos_file {project-path}/log/development.log.pos
  time_key time
</source>

<match lograge>
  @type copy
  <store>
    @type stdout
  </store>
  <store>
    @type s3
    format json
    aws_key_id {aws_access_key_id}
    aws_sec_key {aws_secret_access_key}
    s3_bucket {my_bucket_name}
    s3_region ap-northeast-1
    path lograge_logs/ # 任意に指定できます
    buffer_path /var/log/fluent/lograge_s3 # 任意に指定できます
    buffer_chunk_limit 100k
    time_slice_format year=%Y/month=%m/day=%d/%Y%m%d-%H
    utc
  </store>
</match>

포인트 설명


  • @type stdout 그리고, /var/log/td-agent/td-agent.log 에 로그가 흘러 오므로, 이것을 tail -f 하면서 작업을 진행했습니다.
  • format json 에서 JSON 형식으로 (여분의 날짜와 시간 데이터 등을 포함하지 않는 형태로) 내뿜어줍니다.
  • @type copy 에서 여러 출력을 제공합니다. ( stdout 및 s3 로의 토출 )
  • @type copy 의 존재를 만날 때까지, 나는 일방에 나타나지 않는 로그를 영원히 기다리고 있었습니다.

    (이런 식으로 쓰고 있었던 것입니다.)
    <match lograge>
      @type stdout
    </match lograge>
    <match lograge>
      @type s3
      省略
    </match>
    

    td-agent를 이동하십시오.



    움직이다
    sudo launchctl load /Library/LaunchDaemons/td-agent.plist
    

    멈추다
    sudo launchctl unload /Library/LaunchDaemons/td-agent.plist
    

    설정 파일 td-agent.conf 를 잡으면 위의 명령으로 "멈추고"・ "동작하여"반영시킵니다. reload 같은 커맨드 없는 것일까 하고, && 로 연결해 수제 리로드 커멘드를 몇번이나 두드렸습니다.

    이상으로, /log/development.log 의 JSON 형식의 로그가, S3://lograge 에 업 되게 되었습니다.

    awscli에서 확인
    $ aws s3 ls --recursive  s3://my-bucket-name
    2017-02-02 17:10:27        270 lograge_logs/year=2017/month=02/day=02/20170202-07_0.gz
    2017-02-02 18:10:58       2580 lograge_logs/year=2017/month=02/day=02/20170202-08_0.gz
    2017-02-02 19:10:31        757 lograge_logs/year=2017/month=02/day=02/20170202-09_0.gz
    

    Amazon Athena 설정하기





    쿼리가 걸리므로 create database hoge 등으로 데이터베이스를 만듭니다.

    그리고 테이블도 쿼리로 만들어집니다만, 그것은 힘들 것 같기 때문에, Catalog Manager 메뉴로부터 만듭니다.

    길을 따라 가면 목표에 붙습니다. 요점은 포머를 JSON으로 유지하는 것입니다. 이제 정규 표현식을 골고루 쓰지 않아도 됩니다. 옆자리의 CTO가 정규식에 굉장히 시간이 걸렸다고 말했기 때문에 이를 피할 수 있어서 좋았습니다. (아무래도 단순한 정규 표현이 아니고, 버릇이 있어, \\d 등이라고 써야 하는 것 같습니다.)



    년・월・일로 파티션을 끊고 있으므로, 이하의 커멘드로 반영시킵니다. (조금 여기 공부 부족으로 상세히 알 수 없습니다.)
    MSCK REPAIR TABLE database_name.table_name;
    
    # 確認
    show partitions database_name.table_name;
    

    나머지는 쿼리를 두드리는 것입니다.



    가장 첫 번째 캡처 거리입니다. select * from table_name; 이제 원하는 데이터를 얻을 수 있습니다.



    이상입니다.

    도중에, 여러가지 빠졌습니다만, 무사히 하고 싶은 곳까지 할 수 있어서 좋았습니다. 오늘은 이미 사우나에 들어가 몸을 정돈해 하지만 마시고 싶습니다.

    내일 이후에는, 이것들을 itamae라든지, 리모트 구축할 수 있도록(듯이) 해야 합니다.

    고마워요.

    좋은 웹페이지 즐겨찾기