پارس لاگ های انجینکس در استک ELK

پارس لاگ های انجینکس در استک ELK

برای پارس لاگ های ارسالی از سمت انجینکس نوع فرمت ارسالی لاگ ها در صورت تغییر نیازمند ایجاد pattern خاص در سمت لاگ استش برای پارس کردن میباشد
در صورت استفاده از فرمت ارسالی پیشفرض میتوان از pattern پیشفرض استفاده کرد که در ادامه به بررسی آن میپردازیرم

لاگ استش دارای سه بخش اصلی زیر است

input : ورودی لاگ ها مشخص میشود میتواند syslog یا beat باشد

filter : برای اعمال فیلتر و تغییرات استفاده میشود – این بخش میبایست بزای پارس لاگ پیکربندی شود – دارای توابع متفاوتی برای تغییرات روی لاگ ها است که در این مثال ما از تابع grok  استفاده خواهیم کرد

output : خروجی لاگ ها بعد از تغییر که میتواند فایل یا جیز دیگری باشد . در این مثال  خروجی الستیکسرچ است

پیکربندی سمت فایل بیت بر روی کلاینت ها

در این بخش میبایست ابزار فایل بیت روی همه ی کلاینت هایی که دارای  انجینکس است نصب شود

نکته:

به علت استفاده از ابزار opendistro-for-elastic به جای استفاده از ابزار elasticsearch میبایست نسخه ای که از filebeat روی کلاینت ها نصب میشود با نسخه سرور هماهنگ و ورژن آن oss باشد

ورژن oss در این بخش به معنای ورژن کاملا متن باز می باشد

 

ورژنی که در حال حاضر ما در ساتک استفاده میکنیم ورژن آخر این ابزار 1.13.2  میباشد که از وزژن 7.10.2 الستیک استفاده میکند

پس برای انتخاب هرنوع بیت برای این استک میبایست از همین ورژن استفده کنیم

میتوانیم این بیت ها را از لینک زیر دریافت کنیم.

https://www.elastic.co/downloads/past-releases

در این سایت نوع بیت را به filebeat-oss و وزژن آن را روی 7.10.2 انتخاب و ابزار را دانلود میکنیم.

برای این مثال این فایل را از طریق لینک زیر دریافت و نصب میکنیم

wget -c https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-oss-7.10.2-amd64.deb
dpkg -i filebeat-oss-7.10.2-amd64.deb

بعد از نصب به دایرکتوری /etc/filebeat مراجعه و فایل پیکربندی را به صورت زیر کانفیگ میکینیم

محتویات فایل filebeat.yml

# ============================== Filebeat inputs ===============================

filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log*
exclude_files: ['.gz$']
fields:
type: access
fields_under_root: true

- type: log
enabled: true
paths:
- /var/log/nginx/error.log*
exclude_files: ['.gz$']
fields:
type: error
fields_under_root: true

# ============================== Filebeat modules ==============================

filebeat.config.modules:
# Glob pattern for configuration loading
path: ${path.config}/modules.d/*.yml

# Set to true to enable config reloading
reload.enabled: false

# Period on which files under path should be checked for changes
#reload.period: 10s

# ================================== Outputs ===================================

# ------------------------------ Logstash Output -------------------------------
output.logstash:
hosts: ["IPADDRESS:PORT"]

# ================================= Processors =================================
processors:
- add_host_metadata:
when.not.contains.tags: forwarded
- add_cloud_metadata: ~
- add_docker_metadata: ~
- add_kubernetes_metadata: ~

در بخش filebeat.inputs ورودی فایل مشخص میشود برای لاگ های سمت اکسس و ارور دو نوع ورودی جدا در نظر گرفته میشود
در ادامه برای متمایز کردن لاگ های اکسس و ارور انجینکیس از هم و از الباقی لاگ ها یک فیلد به نام type برای آن ها در نظر میگیریم که در بخش فیلتز در لاگ استش بتوانیم آن هارا بسته به نوعی که دارند پارس کنیم

در قسمت output.logstash نیز آدرس و پورت مربوط به لاگ استش در این بخش قرار داده میشود.

پارس لاک های انجینکس به صورت فرمت پیشفرض

اگر قالب ارسالی لاگ های انجینکس به صورت پیشفرض باشد آنگاه نیازی به ساخت pattern وجود ندارد و از pattern پیشفرض استفاده میشود

نمونه تنظیمات لاگ استش برای این مورد به صورت زیر است

 

filter {
grok {
match => [ "message" , "%{COMBINEDAPACHELOG}+%{GREEDYDATA:extra_fields}"]
overwrite => [ "message" ]
}
mutate {
convert => ["response", "integer"]
convert => ["bytes", "integer"]
convert => ["responsetime", "float"]
}
geoip {
source => "clientip"
target => "geoip"
add_tag => [ "nginx-geoip" ]
}
date {
match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
remove_field => [ "timestamp" ]
}
useragent {
source => "agent"
}
}

پارس لاک های انجینکس به صورت فرمت خاص و شخصی سازی شده

در این حالت ابتدا میبایست نوع فرمت لاگ در تنظیمات انجینکس و نمونه لاگ دریافتی مورد بررسی و مشاهده قرار گیرد

نمونه لاگ دریافتی و تنظیمات لاگ انجینکس به صورت زیر است

log_format custom '$host - $remote_addr - $remote_user [$time_local] - '
'"$request" $status $body_bytes_sent - '
'"$http_referer" "$http_user_agent" - '
'cache: $upstream_cache_status [$time_local]';

نمونه لاگ دریافتی
test.ir - 1.1.1.1 - - [01/Aug/2021:11:32:44 +0000] - "GET / HTTP/2.0" 200 11760 - "-" "Mozilla/5.0 (Linux; Android 11; SM-A505F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.115 Mobile Safari/537.36" - cache: MISS [01/Aug/2021:11:32:44 +0000]

گام بعدی برای این مورد ساخت قالب grok برای است

یکی از سایت هایی که میتوانید قالب جروک رو تست کنین سایت زیر است

https://grokdebug.herokuapp.com/

قالب منطبق بر این لاگ به صورت زیر است

## nginx Access log grok pattern

%{IPORHOST:host_name} - %{IPV4:remote_ip} - %{DATA:user_name} \[%{HTTPDATE:access_time}\] - "%{WORD:http_method} %{DATA:url} HTTP/%{NUMBER:http_version}" %{NUMBER:response_code} %{NUMBER:body_sent_bytes} - "%{DATA:referrer}" "%{DATA:user_agent}" - cache: %{DATA:cache_status} \[%{HTTPDATE:time_local}\]

## nginx Error log grok pattern

%{YEAR}/%{MONTHNUM}/%{MONTHDAY} %{TIME} \[%{LOGLEVEL:level}\] %{INT:process_id}#%{INT:thread_id}: \*(%{INT:connection_id})? %{GREEDYDATA:description}

حال میریم سراغ تنظیمات لاگ استش

input {
beats {
port => 5044
}

}

filter {
if "access" in [type] {
grok {
match => { "message" => '%{IPORHOST:host_name} - %{IPV4:remote_ip} - %{DATA:user_name} \[%{HTTPDATE:access_time}\] - "%{WORD:http_method} %{DATA:url} HTTP/%{NUMBER:http_version}" %{NUMBER:response_code} %{NUMBER:body_sent_bytes} - "%{DATA:referrer}" "%{DATA:user_agent}" - cache: %{DATA:cache_status} \[%{HTTPDATE:time_local}\]' }
remove_field => "message"
}
}

else if "error" in [type] {
grok {
match => { "message" => '%{YEAR}/%{MONTHNUM}/%{MONTHDAY} %{TIME} \[%{LOGLEVEL:level}\] %{INT:process_id}#%{INT:thread_id}: \*(%{INT:connection_id})? %{GREEDYDATA:description}' }
remove_field => "message"
}
}
else {
drop { }
}
}


output {
elasticsearch {
hosts => ["https://elastic:9200"]
ssl => true
ssl_certificate_verification => false
user =>
password =>
index => "%{[@metadata][beat]}-%{[host][hostname]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
}
}

 

امیدوارم مفید بوده باشه

 

با حق

دیدگاه‌ها ۰
ارسال دیدگاه جدید