ค้นหาในบันทึกจากชั่วโมงที่แล้ว


0

ฉันต้องการ bash script เพื่อค้นหาในคำบันทึกล้มเหลวและล้มเหลว แต่จากชั่วโมงที่แล้วเท่านั้น

cut -c 5- /var/log/mail.log | awk '($0 >= from)' from="$(LC_TIME=C date +'%_d %H:%M:%S' -d -1hour)" |grep -i 'Failed:\|failure'

ตัวอย่างไฟล์บันทึก

Nov  1 01:00:00 localhost pushmail[55555]: 666666666666: Failed 
Nov  2 15:00:00 localhost pushmail[55556]: 666666666666: Failed 
Nov  3 11:00:00 localhost pushmail[55557]: 666666666666: Failed 
Nov  3 12:00:00 localhost pushmail[55558]: 666666666666: Failed 
Nov  3 13:30:00 localhost pushmail[55559]: 666666666666: Failed 
Nov  3 13:40:00 localhost pushmail[55560]: 666666666666: Failed 
Nov  3 14:00:00 localhost pushmail[55561]: 666666666666: Failed 
Nov  3 15:00:00 localhost pushmail[55562]: 666666666666: Failed 
Nov 14 15:00:00 localhost pushmail[55563]: 666666666666: Failed 

ฉันใช้การตัดเพื่อลบชื่อเดือนท้องถิ่น แต่เมื่อฉันมีฟอร์มบันทึกสองวันที่ผ่านมาฉันมีมันในผลลัพธ์


ฉันไม่ได้ใช้เมล Linux ดังนั้นฉันจึงไม่ทราบรูปแบบของไฟล์บันทึกเมล หากคุณสามารถแก้ไขคำถามของคุณเพื่อแสดงในรูปแบบบันทึกดั้งเดิมไม่กี่รายการที่รวมอยู่และบันทึกก่อนหน้านี้ทั้งการยกเว้นและรวมเป็นเท็จดังนั้นฉันจะสามารถให้ความช่วยเหลือ
AFH

Hi! AFH ฉันเพิ่มบันทึกบันทึก exaple บางส่วน
MiKo

หวังว่ามันจะใช้ได้ :)grep -E "$(date +"($(date +%H)|%H)":%M:%S --date='last hour').*(Failed|failure)" /var/log/mail.log
เปาโล

คำตอบ:


1

ทางออกที่น่าเชื่อถือที่สุดที่ฉันสามารถหาได้คือ:

while read -r rec
do   age=$(($(date +%s)-$(date -d "${rec:0:16}" +%s)))
     [ $age -ge 0 -a $age -le 3600 ] && \
     grep -Eiq 'failed|failure' <<< "$rec" && echo "$rec"
done </var/log/mail.log

สิ่งนี้ใช้dateเพื่อแปลงเวลาที่บันทึกไว้เป็นวินาทีตั้งแต่เริ่มต้นของปี 1970 จากนั้นเปรียบเทียบกับค่าวินาทีสำหรับเวลาปัจจุบัน สิ่งนี้จะทำงานในทุกกรณีรวมถึงชั่วโมงหลังเที่ยงคืนยกเว้นชั่วโมงแรกของปีใหม่เนื่องจากdate -dค่าเริ่มต้นเป็นปีปัจจุบันเมื่อไม่มีการระบุ ฉันคิดว่าคุณจะมีสิ่งที่ดีกว่าที่จะทำมากกว่าเรียกใช้สคริปต์นี้ในตอนเช้าของปีใหม่

การตรวจสอบอายุบันทึกไม่ใช่ลบลบบันทึกในอนาคตตามที่ฉันพบในบันทึก 14 พ.ย. เมื่อทดสอบในวันที่ 3 พฤศจิกายน ฉันจำลองการโทรในเวลาที่ต่างกันโดยการเพิ่ม-dพารามิเตอร์ให้กับการdateโทรครั้งแรกซึ่งในคำตอบจะได้รับการอ้างอิงเวลาปัจจุบัน


(ขออภัยสำหรับความล่าช้าในการตอบรับ แต่ฉันไม่ได้รับการอัปเดตของคุณก่อนที่จะออกไปในช่วงบ่ายนี้)
AFH

0

ปัญหาคือ"14">" 3"เพราะ 1> "" คุณต้องใช้เลขศูนย์นำหน้าในวันที่ของคุณ ตัวอย่างเช่นคุณสามารถใส่คำสั่งทั้งหมดเป็นหนึ่ง awk:

awk '{ date = sprintf("%02d %s",$2,$3) }
     date>from && /Failed|failure/ { print }
' from="$(LC_TIME=C date +'%d %H:%M:%S' -d -1hour)"

ฉันเปลี่ยนเป็น%_dเป็น%dศูนย์นำหน้าตั้งแต่วันที่ ใน awk การsprintfใช้%02dเพื่อใส่ศูนย์นำไปสู่เขต 2 วันที่


0

awk '($ 0> = จาก)' จาก = "$ (LC_ALL = C วันที่ + '% b% _d% H:% M:% S' -d -1 ชั่วโมง)" ~ / mail.log | grep -i 'ล้มเหลว \ | ล้มเหลว'

Hi! ขอบคุณทุกคนสำหรับความช่วยเหลือ! ในกรณีของฉันสคริปต์นี้ใช้งานได้ หากคุณต้องการเปลี่ยนช่วงเวลาจาก 1 ชั่วโมงคุณสามารถทำค่า chcenaging นี้ได้เช่น -d -60minutes หรือ -d -2days

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.