devops, کلاسترینگ, مقالات

راهنمای کامل برای ELK – قسمت سوم

Logstash

 

تجزیه و تحلیل لاگ کارآمد بر اساس لاگ های خوش ساختار است. ساختار آن چیزی است که شما را قادر می‌سازد تا داده‌ها را در هر ابزار گزارشی که استفاده می‌کنید راحت‌تر جستجو، تجزیه و تحلیل و تجسم کنید. ساختار همچنین چیزی است که زمینه داده های شما را می دهد. در صورت امکان، این ساختار باید متناسب با گزارش‌های موجود در سطح برنامه باشد. در موارد دیگر، به عنوان مثال، لاگ های زیرساخت و سیستم، این شما هستید که باید ساختار لاگ ها را با تجزیه آنها ارائه دهید.

 

Logstash چیست؟

در پشته ELK (Elasticsearch، Logstash و Kibana)، وظیفه مهم تجزیه داده ها به “L” در پشته داده می شود – Logstash.

Logstash به عنوان یک ابزار منبع باز شروع به کار کرد که برای مدیریت جریان حجم زیادی از داده های گزارش از چندین منبع توسعه یافته است. پس از ادغام در پشته ELK، به کارگاه پشته تبدیل شد و وظیفه پردازش پیام‌های گزارش، تقویت آنها و سپس ارسال آنها به یک مقصد مشخص برای ذخیره سازی (ذخیره کردن) را بر عهده داشت.

به لطف اکوسیستم بزرگ افزونه‌ها، Logstash می‌تواند برای جمع‌آوری، غنی‌سازی و تبدیل طیف وسیعی از انواع مختلف داده استفاده شود. بیش از 200 پلاگین مختلف برای Logstash وجود دارد که جامعه وسیعی از ویژگی های توسعه پذیر آن استفاده می کند.

همیشه برای Logstash حرکت آرامی نداشته است. با توجه به برخی مشکلات عملکرد ذاتی و ایرادات طراحی، Logstash در طول سال ها شکایات قابل توجهی از کاربران دریافت کرده است. پروژه‌های جانبی برای کاهش برخی از این مشکلات (مانند Lumberjack، Logstash-Forwarder، Beats) توسعه یافتند و جمع‌آوری‌کننده‌های لاگ جایگزین شروع به رقابت با Logstash کردند.

با وجود این نقص ها، Logstash هنوز یک جزء حیاتی از پشته باقی مانده است. گام‌های بزرگی برای کاهش این دردها با ارائه بهبودهایی در خود Logstash برداشته شده است، مانند یک موتور اجرایی کاملاً جدید که در نسخه 7.0 در دسترس قرار گرفته است، که در نهایت همه به مطمئن‌تر کردن گزارش با ELK نسبت به آنچه قبلا بود کمک می‌کند.

درباره نصب و استفاده از Logstash در آموزش Logstash ما بیشتر بخوانید.

پیکربندی Logstash

رویدادهایی که توسط Logstash جمع‌آوری و پردازش می‌شوند سه مرحله را طی می‌کنند: جمع‌آوری، پردازش و ارسال.

اینکه کدام داده جمع آوری می شود، چگونه پردازش می شود و به کجا ارسال می شود، در یک فایل پیکربندی Logstash کهpipeline  را تعریف می کند، تعریف می شود.

هر یک از این مراحل در فایل پیکربندی Logstash با آنچه پلاگین نامیده می‌شوند تعریف می‌شوند

– پلاگین‌های “ورودی” برای مرحله جمع‌آوری داده،

پلاگین‌های “فیلتر” برای مرحله پردازش

و پلاگین‌های “خروجی” برای مرحله ارسال.

هر دو پلاگین ورودی و خروجی از کدک هایی پشتیبانی می کنند که به شما امکان می دهند داده های خود را رمزگذاری یا رمزگشایی کنید (به عنوان مثال json, multiline, plain ).

Input plugins

یکی از چیزهایی که Logstash را بسیار قدرتمند می کند، توانایی آن در جمع آوری گزارش ها و رویدادها از منابع مختلف است. با استفاده از بیش از 50 افزونه ورودی برای پلتفرم‌ها، پایگاه‌های داده و برنامه‌های مختلف، می‌توان Logstash را برای جمع‌آوری و پردازش داده‌ها از این منابع و ارسال آن‌ها به سیستم‌های دیگر برای ذخیره‌سازی و تجزیه و تحلیل تعریف کرد.

رایج‌ترین ورودی‌های مورد استفاده عبارتند از: file، beats، syslog، http، tcp، udp، stdin، اما می‌توانید داده‌ها را از بسیاری از منابع دیگر دریافت کنید.

Filter plugins

Logstash از تعدادی افزونه فیلتر بسیار قدرتمند پشتیبانی می کند که شما را قادر می سازد لاگ ها را غنی سازی، دستکاری و پردازش کنید. قدرت این فیلترها است که Logstash را به ابزاری بسیار همه کاره و ارزشمند برای تجزیه داده های گزارش تبدیل می کند. فیلترها را می توان با دستورات شرطی ترکیب کرد تا در صورت رعایت یک معیار خاص، یک عمل انجام شود.

رایج ترین ورودی های مورد استفاده عبارتند از: grok، date، mutate، drop. در 5 افزونه فیلتر Logstash می توانید در مورد این موارد و موارد دیگر اطلاعات بیشتری کسب کنید.

Output plugins

 

مانند ورودی‌ها، Logstash از تعدادی افزونه خروجی پشتیبانی می‌کند که به شما امکان می‌دهد داده‌های خود را به مکان‌ها، خدمات و فناوری‌های مختلف منتقل کنید. می‌توانید رویدادها را با استفاده از خروجی‌هایی مانند File، CSV و S3 ذخیره کنید، آنها را با RabbitMQ و SQS به پیام تبدیل کنید یا به سرویس‌های مختلفی مانند HipChat، PagerDuty یا IRC ارسال کنید. تعداد ترکیب ورودی ها و خروجی ها در Logstash آن را تبدیل به یک ترانسفورماتور رویداد واقعا همه کاره می کند.

رویدادهای Logstash می‌توانند از چندین منبع بیایند، بنابراین مهم است که بررسی کنید آیا یک رویداد باید توسط یک خروجی خاص پردازش شود یا خیر. اگر خروجی تعریف نکنید، Logstash به طور خودکار یک خروجی stdout ایجاد می کند. یک رویداد می تواند از چندین پلاگین خروجی عبور کند.

Logstash Codecs

کدک ها هم در ورودی و هم در خروجی قابل استفاده هستند. کدک های ورودی روشی مناسب برای رمزگشایی داده های شما قبل از ورود به ورودی ارائه می دهند. کدک های خروجی روشی مناسب برای رمزگذاری داده های شما قبل از خروج از خروجی فراهم می کنند.

برخی از کدک های رایج:

  • کدک پیش‌فرض «plain» برای متن ساده و بدون محدودیت بین رویدادها است
  • کدک “json” برای رمزگذاری رویدادهای JSON در ورودی ها و رمزگشایی پیام های json در خروجی ها است — توجه داشته باشید که اگر بارهای دریافتی در قالب JSON معتبر نباشند، به متن plain برمی گردد.
  • کدک «json_lines» به شما امکان می‌دهد رویدادهای json را که با \n محدود شده‌اند دریافت و رمزگذاری کنید یا پیام‌های JSON که با \n محدود شده‌اند را در خروجی‌ها رمزگشایی کنید.
  • “rubydebug” که در اشکال زدایی بسیار مفید است، به شما امکان می دهد رویدادهای Logstash را به عنوان اشیاء Ruby داده خروجی بگیرید.

 

نمونه پیکربندی

 

Logstash دارای یک پیکربندی DSL ساده است که به شما امکان می دهد ورودی ها، خروجی ها و فیلترهای توضیح داده شده در بالا را به همراه گزینه های خاص آنها مشخص کنید. نظم، به ویژه در اطراف فیلترها و خروجی ها مهم است، زیرا پیکربندی اساساً به کد تبدیل می شود و سپس اجرا می شود. این را در هنگام نوشتن تنظیمات خود در نظر داشته باشید و سعی کنید آنها را اشکال زدایی کنید.

Input

بخش ورودی در فایل پیکربندی، افزونه ورودی را برای استفاده تعریف می‌کند. هر افزونه گزینه های پیکربندی خاص خود را دارد که قبل از استفاده باید در مورد آنها تحقیق کنید.

مثال:

input { file { path => "/var/log/apache/access.log" start_position => "beginning" }

 

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

 

Filter

قسمت فیلتر در فایل پیکربندی مشخص می کند که می خواهیم از چه پلاگین فیلتری استفاده کنیم یا به عبارت دیگر چه پردازشی را می خواهیم روی گزارش ها اعمال کنیم. هر افزونه گزینه های پیکربندی خاص خود را دارد که قبل از استفاده باید در مورد آنها تحقیق کنید.

مثال:

 

filter { grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } date { match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ] } geoip { source => "clientip" } }


در این مثال ما در حال پردازش لاگ های دسترسی آپاچی در حال اعمال هستیم:

  • یک فیلتر grok که رشته گزارش را تجزیه می کند و رویداد را با اطلاعات مربوطه پر می کند.
  • یک فیلتر تاریخ برای تجزیه فیلد تاریخ که رشته ای به عنوان فیلد timestamp  است (هر خط لوله Logstash به یک timestamp نیاز دارد بنابراین این یک فیلتر ضروری است).
  • یک فیلتر geoip برای غنی سازی فیلد مشتری با داده های جغرافیایی. با استفاده از این فیلتر، فیلدهای جدیدی بر اساس فیلد مشتری به رویداد (به عنوان مثال نام کشور) اضافه می شود.

 

Output

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

مثال:

output { elasticsearch { hosts => ["localhost:9200"] } }

در این مثال، ما یک نمونه نصب شده محلی از Elasticsearch را تعریف می کنیم.

مثال کامل :

با کنار هم قرار دادن همه اینها، فایل پیکربندی Logstash باید به صورت زیر باشد:

input { file { path => "/var/log/apache/access.log" start_position => "beginning" } } filter { grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } date { match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ] } geoip { source => "clientip" } } output { elasticsearch { hosts => ["localhost:9200"] } }

 

 

دام های Logstash

 

همانطور که در بالا اشاره شد، Logstash از مشکلات ذاتی مرتبط با طراحی آن رنج می برد. Logstash برای اجرا به JVM نیاز دارد و این وابستگی می تواند دلیل اصلی مصرف قابل توجه حافظه باشد، به خصوص زمانی که چندین خط لوله و فیلتر پیشرفته درگیر باشد.

 

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

راه‌های مختلفی برای استفاده از این شبکه ایمنی وجود دارد، هم در Logstash تعبیه شده است و هم برخی از آنها که شامل افزودن اجزای میان‌افزار به پشته شما هستند. در اینجا فهرستی از بهترین روش‌ها وجود دارد که به شما کمک می‌کند از برخی از دام‌های رایج Logstash اجتناب کنید:

  • یک بافر اضافه کنید – یک روش پیشنهادی شامل اضافه کردن یک لایه صف بین Logstash و مقصد است. محبوب ترین روش ها از Kafka، Redis و RabbitMQ استفاده می کنند.
  • صف های ماندگار Persistent Queues  – یک ویژگی داخلی انعطاف پذیری داده در Logstash که به شما امکان می دهد داده ها را در یک صف داخلی روی دیسک ذخیره کنید. به طور پیش فرض غیرفعال است – باید این ویژگی را در فایل تنظیمات Logstash فعال کنید.
  • صف های حروف مرده  Dead Letter Queues  – مکانیزمی برای ذخیره رویدادهایی که نمی توانند روی دیسک پردازش شوند. به طور پیش فرض غیرفعال است – باید این ویژگی را در فایل تنظیمات Logstash فعال کنید.
  • آن را ساده نگه دارید – سعی کنید پیکربندی Logstash خود را تا حد امکان ساده نگه دارید. اگر نیازی به این کار نیست از افزونه ها استفاده نکنید.
  • تنظیمات خود را آزمایش کنید – پیکربندی Logstash خود را در مرحله تولید اجرا نکنید تا زمانی که آن را در محیط sandbox آزمایش نکنید. از ابزارهای آنلاین استفاده کنید تا مطمئن شوید که خط لوله شما را خراب نمی کند.

برای بررسی تله‌های اضافی، به مقاله 5 Logstash Pitfalls مراجعه کنید.

نظارت بر Logstash

 

Logstash به طور خودکار برخی از اطلاعات و معیارها را بر روی گره در حال اجرا  JVM و خطوط لوله در حال اجرا ثبت می کند که می تواند برای نظارت بر عملکرد استفاده شود. برای استفاده از این اطلاعات، می‌توانید از API نظارتی استفاده کنید. به عنوان مثال، می توانید از Hot Threads API برای مشاهده رشته های جاوا با CPU بالا و زمان اجرای طولانی استفاده کنید:

curl -XGET 'localhost:9600/_node/hot_threads?human=true' Hot threads at 2019-05-27T08:43:05+00:00, busiestThreads=10: ================================================================================ 3.16 % of cpu usage, state: timed_waiting, thread name: 'LogStash::Runner', thread id: 1 [email protected]/java.lang.Object.wait(Native Method) [email protected]/java.lang.Thread.join(Thread.java:1313) app//org.jruby.internal.runtime.NativeThread.join(NativeThread.java:75) -------------------------------------------------------------------------------- 0.61 % of cpu usage, state: timed_waiting, thread name: '[main]>worker5', thread id: 29 [email protected]/jdk.internal.misc.Unsafe.park(Native Method) [email protected]/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:234) [email protected]/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2123) -------------------------------------------------------------------------------- 0.47 % of cpu usage, state: timed_waiting, thread name: '[main]<file', thread id: 32 [email protected]/jdk.internal.misc.Unsafe.park(Native Method) [email protected]/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:234) [email protected]/java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedNanos(AbstractQueuedSynchronizer.java:1079)

از طرف دیگر، می‌توانید از رابط کاربری نظارتی در Kibana استفاده کنید که تحت مجوز Elastic Basic موجود است.

___________________________________________________

در مقاله بعدی به شرح کیبانا Kibana خواهیم پرداخت.

https://enginedevops.com/2022/10/22/what-is-elk-4/

ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

منبع: https://logz.io/learn/complete-guide-elk-stack/#logstash

دیدگاهتان را بنویسید