728x90
반응형

Index Template에 ILM 정책에 대한 rollover alias 지정 (legacy index template 용이 아님)

PUT _index_template/app_log
{
  "template": {
    "settings": {
      "index": {
        "lifecycle": {
          "name": "testILM",
          "rollover_alias": "test-alias"
        }
      }
    }
  },
  "index_patterns": [
    "app_log*"
  ],
  "composed_of": []
}

geo_point 추가

POST /_template/access
{
  "mappings": {
    "properties": {
      "geoip": {
        "dynamic": true,
        "type": "object",
        "properties": {
          "location": {
            "type": "geo_point"
          },
          "latitude":{
            "type": "float"
          },
          "longitude":{
            "type": "float"
          }
        }
      }
    }
 },
  "aliases": {}

}


PUT access
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_point"
      }
    }
  }
}

인덱스의 쌓인 Document 수 확인

GET /app_log/_count
{
  "query" : {
    "term": { "@timestamp" : "2021-03-09" } /* 하루 쌓이는 document 양 */
  }
}

기존 인덱스에 매핑 등록

PUT sre-www-2023.05
{
  "mappings": {
    "s.type": {
      "full_name": "s.type",
      "mapping": {
        "type": {
          "type": "keyword"
        }
      }
    }
  }
}

새로운 인덱스 생성 및 매핑 등록

PUT sre-www-2023.05-backup
{
  "mappings": {
    "properties": {
      "s.type": {
        "type": "keyword"
      }
    }
  }
}

인덱스의 매핑 필드 정보 보기

GET sre-*/_mapping/field/s.type

인덱스 삭제

DELETE sre-www-2023.05-backup

Reindex 하기

POST /_reindex?wait_for_completion=false
{
  "source": {
    "index": "sre-www-2023.05"
  },
  "dest": {
    "index": "sre-www-2023.05-backup"
  }
}

진행 Task 결과 보기

GET /_tasks

GET /_tasks/H-hNeNJFSCq0J1WPJocVeg:2335496579

POST /_tasks/H-hNeNJFSCq0J1WPJocVeg:2335882225/_cancel

매핑 정보 안들가 있는 인덱스에 넣기

PUT sre-www-2023.02/_mapping
{
  "properties": {
    "s.type": {
      "type": "keyword"
    }
  }
}

기존에 없는 Field 삽입

POST sre-www-2023.02/_update_by_query?conflicts=proceed
{
  "script": {
    "lang": "painless",
    "source": """
      if (ctx._source.s.domain == 'abc.co.kr' || ctx._source.s.domain == 'www.abc.co.kr') {
        ctx._source['s.type'] = 'abc PC';
      } else if(ctx._source.s.domain == 'm.abc.co.kr' || ctx._source.s.domain == 'brandapp-m.abc.co.kr') {
        ctx._source['s.type'] = 'abc 모바일';
      }
    """
  },
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "s.domain": "abc.co.kr"
          }
        },
        {
          "term": {
            "s.domain": "www.abc.co.kr"
          }
        },
        {
          "term": {
            "s.domain": "m.abc.co.kr"
          }
        },
        {
          "term": {
            "s.domain": "brandapp-m.abc.co.kr"
          }
        }
      ]
    }
  }
}

기존에 field의 type이 맞지 않게 들어갔거나 field 나중에 추가된 경우 이전에 것도 Aggreation 하려면 필요한 절차들 이다

728x90
300x250
728x90
반응형
  • Kibana Dashboard 사용시 Index Pattern Id를 변경 해야 할 때,

 

Index Pattern ID 검색

GET .kibana/_search
{
  "_source": ["index-pattern.title"],
  "query": {
    "term": {
      "type": "index-pattern"
    }
  }
}

 

원하는 Visualize 에서 Inspect 한다. 그런 후

# 레퍼런스에 아래 내용 기입
# id: 는 변경 할 Index Pattern ID
[
  { "name": "kibanaSavedObjectMeta.searchSourceJSON.index",
    "type": "index-pattern", "id": "8e2f3600-87d3-11eb-86dd-f13a798c7e8e"
    },
  { "name": "kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index",
    "type": "index-pattern", "id": "8e2f3600-87d3-11eb-86dd-f13a798c7e8e"
  }
]
728x90
300x250
728x90
반응형

workflow

 : input(로그 입력) → filter(로그 가공) → output (로그 출력)

 : Filebeat를 통해 input을 하며, Logstash에서 가공하고, Elasticsearch에서 받고 Kibana로 출력하는 흐름

 

수집로그

  : 수집하는 로그는 다음과 같다

  : Nginx(Access, Error), OS(auth, message), MongoDB (Slowquery)

 

logstash 폴더 구조

➜  logstash ls -ltr
total 526032
-rw-r--r--  1 park_hyungkyu  admin       2019  1 29 12:26 jvm.options
-rw-r--r--  1 park_hyungkyu  admin       9097  1 29 12:26 log4j2.properties
-rw-r--r--  1 park_hyungkyu  admin        342  1 29 12:26 logstash-sample.conf
-rw-r--r--  1 park_hyungkyu  admin       1696  1 29 12:26 startup.options
-rw-r--r--  1 park_hyungkyu  admin  267069440  2  1 10:25 core.alpha.tar
-rw-r--r--  1 park_hyungkyu  admin       1763  2  1 18:06 logstash.conf_fail
-rw-r--r--  1 park_hyungkyu  admin       2494  2  2 11:14 logstash.conf.org
-rw-r--r--  1 park_hyungkyu  admin       3697  2  2 11:34 pipelines.yml.org
-rw-r--r--  1 park_hyungkyu  admin      11250  2  2 12:49 logstash.yml
-rw-r--r--  1 park_hyungkyu  admin        259  2  2 12:54 pipelines.yml
-rw-------  1 root           admin      86198  2  2 12:55 nohup.out
drwxr-xr-x  5 park_hyungkyu  admin        160  2  2 15:08 conf.d

- 기본적으로 logstash 명령어 실행 시 아무 옵션 주지 않았을 때, pipelines.yml을 읽는다.

- logstash.yml 파일은 pipeline에 대한 공통된 튜닝 옵션을 제공한다. pipelines.yml에서 별도 옵션을 주지 않으면 기본적으로 logstash.yml에 등록된 옵션을 사용한다.

- conf.d 폴더는 임의로 생성하였으며, 각 로그수집의 설정값을 저장한다.

 

pipelins.yml

➜  logstash cat pipelines.yml
- pipeline.id: aplogs
  path.config: "/etc/logstash/conf.d/aplogs.conf"

 

logstash.yml

➜  logstash cat logstash.yml
path.data: /var/lib/logstash
pipeline.workers: 2
pipeline.batch.size: 125
pipeline.batch.delay: 50
pipeline.unsafe_shutdown: false
pipeline.ordered: auto
config.reload.automatic: true
config.reload.interval: 60s
http.enabled: true
http.port: 9600
dead_letter_queue.enable: false
 
dead_letter_queue.max_bytes: 1024mb
 
 
path.logs: /var/log/logstash

 

Logstash 의 config 파일

 

conf.d/nginx.conf

input {
  beats {
    port => 5044
    host => "0.0.0.0"
    include_codec_tag => false
  }
}
filter {
    if "access" in [tags] {
      grok {
        match => { "message" => ["%{IPORHOST:[nginx][access][remote_addr]}, %{IPORHOST:[nginx][access][lb_addr]} - %{USERNAME:[nginx][access][remote_user]} \[%{HTTPDATE:[nginx][access][time_local]} T:%{DATA:[nginx][access][request_time]}\] \"%{WORD:[nginx][access][request]} %{DATA:[nginx][access][url]} HTTP/%{NUMBER:[nginx][access][http_version]}\" %{INT:[nginx][access][status]} %{NUMBER:[nginx][access][body_bytes_sent]} \"%{DATA:[nginx][access][http_referer]}\" \"%{DATA:[nginx][access][http_accept_encoding]}\" \"%{DATA:[nginx][access][sent_http_content_encoding]}\" \"%{DATA:[nginx][access][http_user_agent]}\" \"%{DATA:[nginx][access][sent_http_content_type]}\" \"%{DATA:[nginx][access][http_ca_http_header]}\""] }
        remove_field => "message"
      }
      mutate {
        add_field => { "read_timestamp" => "%{@timestamp}" }
        convert => {
         "[nginx][access][http][version]" => "float"
         "[nginx][access][user_agent][magor]" => "integer"
         "[nginx][access][body_bytes_sent]" => "integer"
         "[nginx][access][user_agent][minor]" => "integer"
         "[nginx][access][request_time]" => "float"
        }
      }
      date {
        match => [ "[nginx][access][time]", "dd/MMM/YYYY:H:m:s Z" ]
        remove_field => "[nginx][access][time]"
      }
      useragent {
        source => "[nginx][access][http_user_agent]"
        target => "[nginx][access][user_agent]"
        remove_field => "[nginx][access][http_user_agent]"
      }
      geoip {
        source => "[nginx][access][remote_addr]"
        #target => "[nginx][access][geoip]"
      }
      mutate {
        remove_field => "[geoip][timezone]"
        remove_field => "[geoip][contry_code2]"
        remove_field => "[geoip][contry_code3]"
        remove_field => "[geoip][contry_name]"
        remove_field => "[geoip][continent_code]"
      }
      if "_grokparsefailure" in [tags] {
           drop { }
       }
    }
    else if "error" in [tags] {
      grok {
        #match => { "message" => ["%{DATA:[nginx][error][time]} \[%{DATA:[nginx][error][level]}\] %{NUMBER:[nginx][error][pid]}#%{NUMBER:[nginx][error][tid]}: (\*%{NUMBER:[nginx][error][connection_id]} )?%{GREEDYDATA:[nginx][error][message]}"] }
        match => { "message" => ["(?<[nginx][error][time_local]>%{YEAR}[./-]%{MONTHNUM}[./-]%{MONTHDAY}[- ]%{TIME}) \[%{LOGLEVEL:[nginx][error][severity]}\] %{POSINT:[nginx][error][pid]}#%{NUMBER:[nginx][error][tid]}: (\*%{NUMBER:[nginx][error][connection_id]} )%{GREEDYDATA:[nginx][error][message]}(?:, client: (?<[nginx][error][clientip]>%{IP}|%{HOSTNAME}))(?:, server: %{IPORHOST:[nginx][error][server]}?)(?:, request: %{QS:[nginx][error][request]})?(?:, upstream: (?<[nginx][error][upstream]>\"%{URI}\"|%{QS}))?(?:, host: %{QS:[nginx][error][request_host]})?(?:, referrer: \"%{URI:[nginx][error][referrer]}\")?"] }
        remove_field => "message"
      }
      mutate {
        rename => { "@timestamp" => "read_timestamp" }
        convert => {
          "[nginx][error][pid]" => "integer"
          "[nginx][error][tid]" => "integer"
          "[nginx][error][connection_id]" => "integer"
 
        }
      }
      #date {
      #  match => [ "[nginx][error][time]", "YYYY/MM/dd H:m:s" ]
      #  remove_field => "[nginx][error][time]"
      #}
    }
    else if "app_log" in [tags] {
        mutate {
          gsub => [ "message", "\\n\\s\\s\\s\\s\\s\\s\\s\\s|\\n\\s\\s", "\\s" ]
       }
        grok {
          match => { "message" => ["(?<timestamp>^.{23})\s(?<class>[^ ]*)\s(?<loglevel>.[^.]*)\s(?<location>.[^ ]*)\s-\s(?<description>(.|\n^.{23})+)"] }
          remove_field => "message"
       }
        if "_grokparsefailure" in [tags] {
          drop { }
       }
    }
    else if "auth" in [tags] {
      grok {
        match => { "message" => ["%{SYSLOGTIMESTAMP:system.auth.timestamp.} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: %{DATA:[system][auth][ssh][event]} %{DATA:[system][auth][ssh][method]} for (invalid user )?%{DATA:[system][auth][user]} from %{IPORHOST:[system][auth][ssh][ip]} port %{NUMBER:[system][auth][ssh][port]} ssh2(: %{GREEDYDATA:[system][auth][ssh][signature]})?"] }
        pattern_definitions => {
          "GREEDYMULTILINE"=> "(.|\n)*"
        }
      }
      date {
        match => [ "time_local", "UNIX" ]
      }
      geoip {
        source => "[system][auth][ssh][ip]"
        #target => "[system][auth][ssh][geoip]"
      }
    }
    else if "syslog" in [tags] {
      grok {
        match => { "message" => ["%{SYSLOGTIMESTAMP:[system][syslog][timestamp]} %{SYSLOGHOST:[system][syslog][hostname]} %{DATA:[system][syslog][program]}(?:\[%{POSINT:[system][syslog][pid]}\])?: %{GREEDYMULTILINE:[system][syslog][message]}"] }
        pattern_definitions => { "GREEDYMULTILINE" => "(.|\n)*" }
        remove_field => "message"
      }
      date {
        match => [ "time_local", "UNIX" ]
      }
    }
    else if "mongo" in [tags] {
      grok {
        match => { "message" => ["(?<timestamp>^.{23})Z\s(?<serverity>[^ ]*)\s(?<component>[^ ]+)\s\s(?<context>[^ ]+)\s(?<process>[^ ]+)\s(?<DB>[^ ]+)\scommand:\s(?<query>[^ ]+)\s(?<total>[^ ].+)\s(?<planSummary>planSummary.+)protocol:op_msg\s(?<op_msg>.+)ms"] }
        remove_field => "message"
        }
      if "_grokparsefailure" in [tags] {
           drop { }
       }
      mutate {
        #remove_field => "total"
        convert => {
         "op_msg" => "integer"
        }
      }
    }
    else if "digdag_log" in [tags] {
      grok {
        match => { "message" => ["(?<path>[^ ]+):(?<errMsg>[^*]+)"] }
        remove_field => "message"
        }
      if "_grokparsefailure" in [tags] {
           drop { }
       }
    }
}
 
output {
  if "access" in [tags] {
    elasticsearch {
        hosts => ["test:9200"]
        manage_template => false
        index => "access-%{+yyyy.MM.dd}"
        ecs_compatibility => disabled
        }
    }
   else if "error" in [tags] {
    elasticsearch {
        hosts => ["test:9200"]
        manage_template => false
        index => "error-%{+yyyy.MM.dd}"
        ecs_compatibility => disabled
        }
    }
    else if "app_log" in [tags] {
    elasticsearch {
        hosts => ["test:9200"]
        manage_template => false
        index => "app_log-%{+yyyy.MM.dd}"
        ecs_compatibility => disabled
        }
    }
   else if "auth" in [tags] {
    elasticsearch {
        hosts => ["test:9200"]
        manage_template => false
        ecs_compatibility => disabled
        index => "auth-%{+yyyy.MM.dd}"
        }
    }
   else if "syslog" in [tags] {
    elasticsearch {
        hosts => ["test:9200"]
        manage_template => false
        index => "syslog-%{+yyyy.MM.dd}"
        ecs_compatibility => disabled
        }
    }
   else if "mongo" in [tags] {
    elasticsearch {
        hosts => ["test:9200"]
        manage_template => false
        index => "mongo-%{+yyyy.MM.dd}"
        ecs_compatibility => disabled
        }
    }
   else if "digdag_log" in [tags] {
    elasticsearch {
        hosts => ["test:9200"]
        manage_template => false
        index => "digdag-%{+yyyy.MM.dd}"
        ecs_compatibility => disabled
        }
    }
}

Nginx Access Log와 Error Log, System log, MongoDb SlowQuery, DigDag Log 에 대해 filter grok pattern/regex 사용하여 파싱

 

filebeat 설치

  • filebeat.yml 파일로 filebeat를 설정하고, modules.d에서 모듈 관리 각 로그에 대한 모듈를 저장/관리
-- 다운로드 및 설치
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.9.2-x86_64.rpm
rpm -ivh filebeat-7.9.2-x86_64.rpm
 
-- 설치 확인
rpm -qa | grep filebeat
filebeat-7.9.2-1.x86_64

 

filebeat 설정

# cd /etc/filebeat
 
[root@abcd filebeat]# ls
fields.yml  filebeat.reference.yml  filebeat.yml  modules.d
 
 
# cat filebeat.yml
 
filebeat.inputs:
 - type: log
   enabled: true
   paths:
     - /tmp/test.log
   tags: ["app_log"]
   symlinks: true
   exclude_lines: ["DEBUG|INFO|TRACE|WARN"]
 
 - type: log
   enabled: true
   paths:
     - /var/log/nginx/access.log
   tags: ["access"]
   exclude_lines: [".*l7check.*"]
 
 - type: log
   enabled: true
   paths:
     - /var/log/nginx/error.log
   tags: ["error"]
 
 - type: log
   enabled: true
   paths:
     - /var/log/message*
   tags: ["syslog"]
 
 - type: log
   enabled: true
   paths:
     - /var/log/secure*
   tags: ["auth"]
 
 - type: log
   enabled: true
   paths:
     - /data/mongodb/router/log/mongos.log
   tags: ["mongo"]
 
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enable: true
 
setup.template.settings:
  index.number_of_shards: 1
 
setup.kibana:
  host: "test:5601"
 
output.logstash:
  hosts: ["test:5044"]
 
#output.elasticsearch:
#  hosts: ["test-es:9200"]
 
processors:
#  - add_host_metadata: ~
#  - add_cloud_metadata: ~
#  - add_docker_metadata: ~
#  - add_kubernetes_metadata: ~
   - drop_fields:
       fields: ["agent.ephemeral_id", "agent.hostname", "agent.id", "agent.type", "agent.version", "ecs.version", "input.type", "log.offset", "version"]
 
logging.level: info
#logging.level: debug
 
 
 
# filebeat 모듈은 선택에 따라 사용하는 것으로 함
 
# filebeat 실행
nohup filebeat -e -c /etc/filebeat/filebeat.yml &

 

728x90
300x250
728x90
반응형

개요

  • AWS Organization 많아지면서 역할 전환할 때 새로 추가를 해 줘야 하는 번거로움이 생겼습니다. (기본적으로 AWS Console에서 역할 기록남는건 3~4개 밖에 안되서 새로 기록을 해줘야 합니다)
    이런 번거로움을 위해 AWS에서 브라우저 확장 앱으로 'AWS Extend Switch Roles' 라는 앱을 제공합니다.
    해당 기능으로 역할 전환을 편리하게 전환 할 수 있으며, 해당 기능은 AWS Console 접속 시에만 사용 가능합니다.

설정

  1. 브라우저의 확장앱을 통하여 AWS Extend Switch Roles를 설치 합니다.

  • 브라우저의 우측 상단 Key 모양 아이콘을 클릭합니다.

  • Configuration 을 클릭합니다.

  • 안에 내용을 기입하고 Save를 선택합니다.

  • 설정이 완료 되면 위와 같이 설정한 Organization 리스트를 확인 및 전환 할 수 있습니다.

 

 

[profile test]
region = us-west-1
role_arn = arn:aws:iam::1234:role/testadmin
color = 0040ff
 
[profile test2]
region = ap-northeast-2
role_arn = arn:aws:iam::4567:role/test2admin
color = 00fffb
  • Configuration 내용
728x90
300x250

'IT > AWS' 카테고리의 다른 글

AWS CLI 로컬에서 S3로 복사  (0) 2021.08.09
AWS CLI 보안그룹 추가하기  (0) 2021.08.09
AutoRecovery  (0) 2021.08.09
AWS CloudWatch 모니터링 값  (0) 2021.07.30
AWS S3 OAI 설정 및 ClientLog 쪽 Deny 처리  (0) 2021.07.22
728x90
반응형
# 쉘 경로 지정
vi /etc/makeloglink.sh
 
# 쉘 내용
#!/bin/sh
LOGFILE=`ls -t /home/test/logs/log.* | head -n 1`
if [ -f "${LOGFILE}" ];then
        rm -f /tmp/test.log
        ln -s ${LOGFILE} /tmp/test.log
fi
 
# 쉘 권한
chmod 755 /etc/makeloglink.sh
 
# 쉘 크론탭 등록
1 0 * * * /etc/makeloglink.sh

 

728x90
300x250

'IT > Infra Code' 카테고리의 다른 글

Local Log를 압축하여 S3로 Upload 작업  (0) 2022.02.15
Python Select문 Json 처리  (0) 2022.02.15
Check AP Healthcheck  (0) 2021.08.09
curl을 사용하여 Slack으로 메시지 보내기  (0) 2021.07.27
728x90
반응형

헬로네이쳐 지난주 가입 이후
첫구매 삼겹살 1000원을 사려 주문

첫구매 5000원 , 적립금 1000원 할인받아서
10,260 결제✌
그리고 아우어베이커리 빨미까레가 재 입고 되었다해서 2개 바로 추가 구맼ㅋㅋㅋㅋㅋ+7,800원

오늘의 소비는 18,060원
내일 새벽배송 받아야지!

728x90
300x250

'망고로그 > 장바구니일기' 카테고리의 다른 글

2020.07.22 푸라닭치킨냠냠  (0) 2020.07.23
2020.07.18 장바구니 기록  (0) 2020.07.21
728x90
반응형

2020.07.25~2020.07.26
비가 오고 하늘이 정말 청명했다.
우리집의 씨티븈ㅋㅋㅋㅋ도 멋있고 낮에도 밤에도 정말 예뻤던 야경.

엄마빠의 딸
우리 신랑의 아내
회사에서의 나
걸어다니는 행인 등등등

모든 모습이 나-인데 약간 그때그때 모드가 있었으면 좋겠다.
회사 출근하면 회사 모드 온,퇴근하면 오프.

후 너뮤 스트레스받지말자 그게 내 전부가 아니니!!!


728x90
300x250

'망고로그 > 별거없는일상' 카테고리의 다른 글

북창동 맛집-묵호횟집 냠냠  (0) 2020.07.23
2020.07.23 신혼 1000일  (0) 2020.07.23
★콩비지로그오픈★  (0) 2020.07.21
728x90
반응형


오늘은 결혼 1000일
1000일을 빙자로 묵호횟집에 가기로해땅❣

오빠가 예전에 회사 사람이랑 갔다가 포장해온것만 먹어봤는데 넘 맛있었던 곳!
포장하고 다음날 먹었는데도 JMTGR
바로 먹으면 더 맛있겠지!!하고 연차쓰고 다녀와ㄸ ㅏ.

Break time : 2시30~4:30...이었나
근데 그런 정보 모르고 3시 30 도착ㅋㅋㅋㅋ다행히 받아주었고 6시부터 풀예약이라고 하셨다.
다음엔 꼭 예약하고 올 것!!!

우리는 묵호회 2인 (1인 7만원)을 시켰고
이걸 시키면 처음 빈접시를 주시고, 주방장..?실장님..?이 회를 가지고 오신다

요렇게 된장에 숙성시킨 회를 가지고 오셔서
바로 짤라쥬심🥰🥰🥰

진짜 활어회랑은 맛이 다르당
쫜득쫜득 넘맛 ❣🥰🥰❤


1차 썰어주신걸 거의 다 먹어갈 때 쯤
주방장...?실장님...?이 또 들어오셔서
롤도 주시고 회도 또 주신다

진~~~~짜 맛있고 너무 배부르곸ㅋㅋㅋㅋ
원래 회 먹고, 누룽지탕..?나오고 구이 나오고 지리/매운탕 나오는데 우린 너무 배불러서 누룽지탕까지만 먹었다
이것도 넘나 시원하고 맛있음


그리고 마늘,은행구이랑
꿀호두랑 정어리..?열빙어..?생선구이가 스끼다시로 나온다 . 이것도 모두모두 맛이뜸

진짜 ..ㄷㅏ다다다 맛있고, 배부르게 잘 먹었다❣

묵호정식 1인 7만원
소주는 1병에 7천원
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ소주가 짱 비쌈....
그래도 맛있어뜨!!담에 또 가고싶다🥰

728x90
300x250

'망고로그 > 별거없는일상' 카테고리의 다른 글

회사 모드 off, 힐링모드on  (0) 2020.07.28
2020.07.23 신혼 1000일  (0) 2020.07.23
★콩비지로그오픈★  (0) 2020.07.21

+ Recent posts