tail -f เทียบเท่ากับ URL


10

ฉันต้องการตรวจสอบล็อกไฟล์ของแอปพลิเคชันของฉันซึ่งไม่สามารถใช้งานได้ในพื้นที่ แต่บนแพลตฟอร์ม SaaS และเปิดเผยผ่าน HTTP และ WebDAV ดังนั้นค่าเทียบเท่า -f ที่ใช้ได้กับ URL จะทำงานได้ดีสำหรับฉัน

ป.ล. หากคุณรู้จักเครื่องมืออื่น ๆ ที่สามารถตรวจสอบไฟล์ระยะไกลผ่าน HTTP อาจช่วยได้เช่นกัน ขอบคุณ


1
มันแสดงเป็นข้อความธรรมดาบนเซิร์ฟเวอร์ระยะไกลหรือเป็น html หรือไม่
terdon

ข้อความธรรมดาที่มีรูปแบบเฉพาะ: [การประทับเวลา] Error_name ..... ซึ่งฉันตั้งใจจะกรองข้อมูลผ่าน grep
munch

คุณสามารถใช้wget -N http://somewhere/somethingไฟล์ที่จะดาวน์โหลดได้หากไฟล์นั้นใหม่กว่าไฟล์ที่คุณดาวน์โหลดก่อนหน้าหรือใช้wget -O - http://somewhere/somethingเพื่อเปลี่ยนเส้นทางไฟล์ไปยัง stdout
สัปดาห์ที่

คำตอบ:


11

อาจมีเครื่องมือเฉพาะสำหรับสิ่งนี้ แต่คุณสามารถทำได้โดยใช้ wget เปิดเทอร์มินัลและเรียกใช้คำสั่งนี้:

while(1); do \
    sleep 2; \
    wget -ca -O log.txt -o /dev/null http://yoursite.com/log; \
done

สิ่งนี้จะดาวน์โหลด logfile ทุกสองวินาทีและบันทึกลงในการlog.txtต่อท้ายเอาต์พุตกับสิ่งที่มีอยู่แล้ว ( -cหมายถึงการดาวน์โหลดต่อและ-aหมายถึงผนวกเอาต์พุตไปยังชื่อไฟล์ที่กำหนด) เปลี่ยนเส้นทางข้อความผิดพลาด-o/dev/null/

ดังนั้นตอนนี้คุณมีสำเนาของ log.txt ในเครื่องและสามารถทำงานtail -fได้:

tail -f log.txt 

ฉันพบว่าฉันสามารถใช้ davfs2 เพื่อรวมกับส่วนต่อประสาน webDAV แล้วใช้ไฟล์เช่นไฟล์ปกติ นี่คือสิ่งที่ฉันคาดหวัง แต่วิธีการแก้ปัญหาของคุณง่ายขึ้นและใช้งานได้จริง
ขบฉัน

ฉันพบว่าทุกอย่างถูกบันทึกไว้ในไฟล์ "log" ไม่ใช่ "log.txt" ในกรณีของฉันนี้ใช้งานได้: wget -ca -O log.txt -o / dev / null yoursite.com/log
yatsek

@munch davfs2 ทำงานได้ไม่ดี ในกรณีของฉันฉันพบtail -fว่าไม่ได้อัปเดตการเปลี่ยนแปลงไฟล์ยกเว้นว่ามีกระบวนการอื่นที่ขอเซิร์ฟเวอร์สำหรับการอัปเดตไดเรกทอรี (ดูธรรมดาlsพอสมควร) ปัญหานั้นtail -fขึ้นอยู่กับการรู้แจ้งไม่ถูกต้องและการรู้แจ้งไม่ดูเหมือนจะทำงานได้มากกว่า davfs2
jesjimher

@jesjimher tailไม่ได้ขึ้นอยู่กับ inotify มันเพียงแค่อ่านไฟล์ค้นหาและอ่านอีกครั้ง ถ้ามันทำงานได้ไม่ดีกับ davfs นั่นจะลงไปถึงวิธีการทำงานของ davfs สันนิษฐานได้ว่ามันจะอัปเดตข้อมูลเมื่อมีบางสิ่งที่กำลังอ่านไดเรกทอรีอยู่และเนื่องจากtailทำให้ไฟล์เปิดอยู่ซึ่งจะไม่ทริกเกอร์ หรือบางสิ่งบางอย่างตามเส้นเหล่านั้น
terdon

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

3

ฉันตอบคำถามเดียวกันตรงนี้ด้วยเชลล์สคริปต์ที่ใช้ URL เพราะเป็นอาร์กิวเมนต์tail -fแล้ว นี่คือสำเนาของคำต่อคำตอบทั้งหมด:


สิ่งนี้จะทำ:

#!/bin/bash

file=$(mktemp)
trap 'rm $file' EXIT

(while true; do
    # shellcheck disable=SC2094
    curl --fail -r "$(stat -c %s "$file")"- "$1" >> "$file"
done) &
pid=$!
trap 'kill $pid; rm $file' EXIT

tail -f "$file"

มันไม่ได้เป็นมิตรมากบนเว็บเซิร์ฟเวอร์ คุณสามารถแทนที่trueด้วยsleep 1เป็นทรัพยากรที่น้อยลง

เช่นเดียวกับที่tail -fคุณต้องทำ^Cเมื่อคุณดูการส่งออกเสร็จสิ้นแม้ว่าจะเสร็จสิ้นการส่งออก


0

ขดกับตัวเลือกช่วงร่วมกับนาฬิกาสามารถใช้เพื่อให้บรรลุนี้:

ช่วง

HTTP 1.1 แนะนำให้รู้จักกับช่วงไบต์ การใช้สิ่งนี้ลูกค้าสามารถขอได้หนึ่งส่วนย่อยหรือมากกว่าของเอกสารที่ระบุ Curl รองรับสิ่งนี้ด้วยแฟล็ก -r

watch -n <interval> 'curl -s -r -<bytes> <url>'

ตัวอย่างเช่น

watch -n 30 'curl -s -r -2000 http://yoursite.com/log'

สิ่งนี้จะดึงข้อมูล 2000 ไบต์ล่าสุดของบันทึกทุก ๆ 30 วินาที

หมายเหตุ: สำหรับ https ใช้ตัวเองเซ็น - ตัวเลือก curl ที่ไม่ปลอดภัย

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