قبلا درباره Log.io نوشته بودم. ابزار خوبیه ولی خوب سربار زیادی داره. دو تا پروسه، و یه بروزر که به تدریج مصرف رمش میره بالا :) خوب اینه که من مدتهاست استفاده از اونو کنار گذاشتم.
ولی حقیقتا خیلی لازمم میشه که یه سری فایل رو مانیتور کنم. multitail گزینه خوبیه و اکثرا کارمو راه میندازه. ولی مشکلی که داره اینه که کنترلی روی خروجی نداری. مثلا اگه در حال مانیتور کردن mysql هستی و فقط میخوای که کوئری های INSERT رو داشته باشی راه سادهای وجود نداره. میشه گیک بازی درآورد ولی خوب،تا زمانی که tail اصلی کارمو راه میندازه کی میره این همه راهو!!
خوب قضیه خیلی سادست. اینطوری :
tail -f /path/to/filename
لازمه بگم که من اصلا از سوییچ f خبر نداشتم و یه بار اتفاقی بهش برخوردم اونم یه بار که داشتم دنبال یه سوییچ دیگه میگشتم تو man ؟؟؟
خوب، با فعال کردن Log توی MySql حالا وقتشه که فایل رو با tail مانیتور کنیم (فرض کنین فایل مورد نظر من اینه : /var/lib/mysql/elbix-home.log
و من فقط کوئریهایی میخوام که Execute شدن و همه غیر از اونهایی که با SELECT شروع شدن. (خوب نمیخوام SELECT وسط کوئری نادیده گرفته بشه مثلا برای INSERT INTO SELECT ) کوئری هایی که Prepare هم شدن نمیخوام (توی C++ برخلاف PHP کار Prepare کردن و گذاشتن پارامترها رو خود mysql انجام میده )
قاعدتا باید چنین خطی جواب بده :
tail -f /var/lib/mysql/elbix-home.log | sed 's/^[ 0-9:]*//g' | grep "Execute\|Query" | cut -d" " -f2- | grep -iv "^select"
ولی نمیدونم چرا وقتی تعداد پایپها بیشتر از یکی میشه جواب نمیده. یعنی به پایپ دومی هیچی نمیرسه (sed اولی درست کار میکنه ولی grep اصلا ورودی نداره! نمیدونم باگه یا چی ولی زیاد مهم نیست. )خوب برای اون هم راه حل ساده ای هست. کافیه یه اسکریپت ساده بسازم که کار فیلتر رو برام انجام بده :
#!/bin/bash while read line; do echo $line | sed 's/^[ 0-9:]*//g' | grep "Execute\|Query" | cut -d" " -f2- | grep -iv "^select" done;</dev/stdin
باقیش هم سادست، اسم اسکریپت رو مثلا میزارم echoback.sh و توی پوشه خانگیم میذارمش، بعد این دستور رو اجرا میکنم :
tail -f ./elbix-home.log | ~/echoback.sh
باقیش هم که میتونید حدس بزنید :)))