تحلیل فایلهای لاگ در لینوکس با sort و uniq
فایلهای لاگ یکی از مهمترین منابع برای بررسی وضعیت سرور، پیدا کردن خطاها و شناسایی رفتارهای غیرعادی هستند. اما وقتی یک سرور فعال روزانه هزاران یا حتی میلیونها خط لاگ تولید میکند، بررسی تکتک خطوط واقعا زمانبر است. در چنین شرایطی میتوان با استفاده از ابزارهای ساده خط فرمان لینوکس، اطلاعات مهم را از میان حجم زیادی از لاگها استخراج کرد.
دو دستور sort و uniq از ابزارهای کاربردی برای مرتبسازی، حذف موارد تکراری و شمارش رخدادها هستند.
دستور sort در لینوکس چیست؟
دستور sort خطوط ورودی را مرتب میکند. به صورت پیشفرض، مرتبسازی بر اساس ترتیب حروف و اعداد انجام میشود.
این دستور محتوای فایل را مرتب کرده و نتیجه را در ترمینال نمایش میدهد. فایل اصلی تغییر نمیکند، مگر اینکه خروجی را به فایل دیگری منتقل کنیم.
یکی از کاربردهای مهم sort در تحلیل لاگ این است که خطوط مشابه را کنار یکدیگر قرار میدهد.
دستور uniq چه کاری انجام میدهد؟
دستور uniq برای شناسایی و حذف خطوط تکراری استفاده میشود.
نکته مهم این است که uniq فقط خطوط تکراری پشت سر هم را شناسایی میکند. اگر یک خط چند بار در فایل وجود داشته باشد اما بین آنها خطوط دیگری قرار گرفته باشد، uniq آنها را تکراری تشخیص نمیدهد.
به همین دلیل معمولا sort و uniq در کنار یکدیگر استفاده میشوند:
در اینجا ابتدا خطوط مرتب میشوند و سپس موارد تکراری حذف میشوند.
شمارش تعداد تکرار هر خط
یکی از کاربردهای مهم uniq در بررسی لاگها، شمارش تعداد رخدادها است.
برای این کار از گزینه -c استفاده میکنیم:
خروجی مشابه زیر خواهد بود:
عدد ابتدای هر خط نشان میدهد آن خط چند بار در فایل اصلی تکرار شده است.
برای اینکه پرتکرارترین موارد را در ابتدای خروجی ببینیم، میتوانیم خروجی را دوباره با sort مرتب کنیم:
در این دستور:
- sort خطوط را مرتب میکند
- uniq -c تعداد تکرار هر خط را میشمارد
- sort -rn نتایج را به صورت عددی و از بیشترین مقدار به کمترین مقدار مرتب میکند
این الگو یکی از کاربردیترین ترکیبها برای تحلیل سریع لاگها است.
پیدا کردن IPهایی که بیشترین تلاش ناموفق SSH را داشتهاند
یکی از مثالهای کاربردی برای مدیر سرور، بررسی تلاشهای ناموفق ورود به SSH است.
در سیستمهای Debian و Ubuntu معمولا اطلاعات مربوط به ورودهای ناموفق در var/log/auth.log/ ثبت میشود.
برای استخراج IPها میتوان از دستور زیر استفاده کرد:
خروجی میتواند چیزی شبیه این باشد:
عدد سمت چپ تعداد تلاشهای ناموفق و مقدار سمت راست آدرس IP است.
این دستور برای شناسایی IPهایی که تعداد زیادی تلاش ناموفق برای ورود به SSH داشتهاند بسیار کاربردی است.
توجه کنید شماره فیلد IP در awk به فرمت لاگ بستگی دارد. بنابراین در لاگهای مختلف ممکن است لازم باشد شماره فیلد را تغییر دهید.
برای دسترسی به منابع پردازشی و امکان مدیریت مستقل سرور، خرید سرور مجازی ابری را از میان پلنهای موجود انتخاب کنید.
بررسی کدهای HTTP در لاگ Nginx
با همین روش میتوان وضعیت پاسخهای وبسرور را بررسی کرد.
در لاگ دسترسی استاندارد Nginx، کد وضعیت HTTP معمولا در فیلد نهم قرار دارد:
ممکن است خروجی به شکل زیر باشد:
این خروجی یک دید سریع از وضعیت درخواستهای وبسرور به ما میدهد.
برای مثال تعداد زیاد 404 میتواند نشاندهنده درخواست برای صفحات یا فایلهای ناموجود باشد. افزایش 500 هم میتواند نیاز به بررسی خطاهای سمت برنامه یا وبسرور را نشان دهد.
پیدا کردن درخواستهای تکراری
گاهی لازم است ببینیم چه درخواستهایی در یک لاگ بیشتر از بقیه تکرار شدهاند.
با اضافه کردن head فقط چند مورد پرتکرار اول نمایش داده میشود.
این روش میتواند برای بررسی درخواستهای تکراری، رفتار رباتها یا الگوهای غیرعادی در لاگ وبسرور مفید باشد.
نمایش فقط خطوط تکراری
اگر هدف ما پیدا کردن مواردی باشد که بیشتر از یک بار تکرار شدهاند، میتوانیم از گزینه -d استفاده کنیم:
گزینه d- فقط خطوطی را نمایش میدهد که تکرار شدهاند.
این روش برای پیدا کردن درخواستهای تکراری یا رخدادهایی که به صورت غیرعادی چند بار ثبت شدهاند کاربرد دارد.
نمایش خطوطی که فقط یکبار رخ دادهاند
در مقابل، گزینه -u در uniq فقط خطوطی را نمایش میدهد که دقیقا یک بار ظاهر شدهاند:
این گزینه زمانی مفید است که بخواهیم رخدادهای منحصربهفرد را از میان لاگ جدا کنیم.
حذف موارد تکراری با sort -u
اگر فقط میخواهیم خطوط تکراری حذف شوند، میتوانیم مستقیما از sort -u استفاده کنیم:
این دستور خروجی مرتبشدهای ایجاد میکند که هر خط فقط یک بار در آن وجود دارد.
برای ذخیره نتیجه در فایل جدید:
فایل اصلی دستنخورده باقی میماند و نتیجه در cleaned.log ذخیره میشود.
مهمترین گزینههای sort
چند گزینه sort در تحلیل لاگها کاربرد بیشتری دارند:
- r- مرتبسازی معکوس
- n- مرتبسازی عددی
- u- حذف موارد تکراری
- k- مرتبسازی بر اساس یک فیلد مشخص
برای مثال:
مقادیر عددی را از بزرگترین به کوچکترین مرتب میکند.
مهمترین گزینههای uniq
گزینههای پرکاربرد uniq عبارتند از:
- c- شمارش تعداد تکرار
- d- نمایش موارد تکراری
- u- نمایش مواردی که فقط یک بار آمدهاند
- i- نادیده گرفتن تفاوت حروف بزرگ و کوچک
ترکیب این گزینهها با ابزارهایی مانند grep و awk امکان تحلیل سریع لاگها را بدون نیاز به اسکریپتنویسی فراهم میکند.
یک الگوی کاربردی برای تحلیل لاگ
یکی از الگوهای مهمی که بهتر است در کار با لینوکس به خاطر بسپارید، این است:
برای مثال اگر بخواهیم خطاهای یک برنامه را بررسی کنیم:
در اینجا ابتدا فقط خطوط دارای ERROR انتخاب میشوند، سپس موارد مشابه کنار هم قرار میگیرند، تعداد آنها شمرده میشود و در نهایت پرتکرارترین خطاها در ابتدای خروجی قرار میگیرند.
این روش به خصوص زمانی مفید است که لاگ شامل هزاران خط باشد و بخواهیم در چند ثانیه الگوهای پرتکرار را پیدا کنیم.
اشتباه رایج هنگام استفاده از uniq
یکی از اشتباهات رایج این است که مستقیم از uniq استفاده کنیم:
اگر خطوط مشابه در بخشهای مختلف فایل پراکنده باشند، این دستور آنها را به عنوان موارد تکراری شناسایی نمیکند.
برای همین در بیشتر موارد بهتر است از این الگو استفاده کنیم:
یا برای شمارش:
البته اگر داده از قبل مرتب شده باشد، اجرای sort دوباره ضروری نیست.
جمعبندی
sort و uniq از سادهترین ابزارهای لینوکس هستند، اما در تحلیل لاگها کاربرد زیادی دارند.
با ترکیب این دو دستور میتوانیم:
- خطوط تکراری را پیدا یا حذف کنیم
- تعداد رخداد هر خط را بشماریم
- پرتکرارترین خطاها را پیدا کنیم
- IPهای دارای بیشترین تلاش ناموفق SSH را شناسایی کنیم
- کدهای HTTP را در لاگ Nginx بررسی کنیم
- درخواستهای پرتکرار را پیدا کنیم
- حجم زیادی از لاگ را بدون نوشتن اسکریپت تحلیل کنیم
الگوی زیر را میتوان به عنوان یکی از دستورات پایه برای تحلیل لاگ در ذهن داشت:
با اضافه کردن grep و awk میتوان این الگو را برای تقریبا هر نوع لاگ سفارشی کرد. در عمل، ترکیب ابزارهای کوچک خط فرمان مانند grep، awk، sort و uniq یکی از روشهای سریع و موثر برای عیبیابی و بررسی وضعیت سرورهای لینوکس است.