วิธีการมีสตรีมบันทึกหลายรายการในนักเทียบท่า


21

เรามีแอปพลิเคชันที่เขียนบันทึกสามประเภทลงในไฟล์ที่แยกต่างหากสามไฟล์: บันทึกการเข้าถึงบันทึกแอปพลิเคชันทั่วไปและบันทึกระบบ รูปแบบ (และวัตถุประสงค์) ของบันทึกเหล่านี้แตกต่างกันมาก และเรามี logforwarders แยกต่างหากที่ส่งแยกต่างหากไปยังระบบบันทึกข้อมูลส่วนกลางของเรา

ตามบันทึกการรักษาเป็นหลักการสตรีมเหตุการณ์เรากำลังคิดเกี่ยวกับการย้ายจากการใช้ไฟล์ไปยัง stdout ในขณะที่เรารู้ถึงประโยชน์บางประการของวิธีการนี้สิ่งนี้ก็หมายความว่าเราจะได้รับกระแสข้อมูลที่ผสานของรูปแบบบันทึกที่แตกต่างกันซึ่งเราจะต้องแยกอีกครั้งก่อนที่เราจะสามารถส่งพวกเขาไปยังระบบกลางของเรา (Kibana / Splunk / ฯลฯ ) หรือด้านใน

เราสงสัยว่ามีเครื่องมือหรือคำแนะนำเกี่ยวกับวิธีที่เราควรเข้าหาสถานการณ์นี้หรือไม่


4
ฉันไม่คิดว่ามันจะคุ้มค่า เหตุใดจึงต้องทำงานรวมกันมากขึ้นแล้วแยกบันทึกการเข้าชมเพียงเพราะ "หลักการ" บางอย่าง ไฟล์เป็นสิ่งที่ดี ไฟล์ทำงาน เสียงนี้ถูก overengineered ฉันจะบอกว่าอาจไปป์ไลน์ทั้งหมดใน syslog ด้วยแท็กที่แตกต่างกัน ฯลฯ แต่ฉันต้องบอกว่าถ้ามีคนในทีมของฉันแนะนำสิ่งนี้ .. ฉันจะ .. ผิดหวัง
Assaf Lavie

เนื่องจากการใช้ไฟล์มีฝันร้ายในการจัดการประเภทอื่น ๆ โดยเฉพาะอย่างยิ่งหากมันถูกสร้างขึ้นจากภายในคอนเทนเนอร์นักเทียบ สำหรับตอนนี้ดูเหมือนว่าข้อเสียจากการเปลี่ยนไปใช้ stdout มีมากกว่าประโยชน์สำหรับกรณีการใช้งานของเรา แต่เรากำลังมีปัญหากับวิธีการใช้ไฟล์ของเราแล้ว
SztupY

3
ฉันไม่รู้เรื่อง "ฝันร้าย" ฉันรู้ว่านี่เป็นวิธีที่ทำได้ในขณะนี้และมีซอฟต์แวร์จำนวนมากที่ช่วยคุณทำสิ่งนี้ ไฟล์บันทึกจะหมุนอ่านด้วยจุดตรวจสอบ - ไฟล์เป็นสิ่งที่เป็นนามธรรมที่ดีสำหรับเรื่องนี้ ฉันจะไม่ซื้อเป็นหลักการที่ขายฝันร้ายใหม่ให้ฉันเพราะกลัวว่าจะเป็นรูปแบบเก่า ๆ ที่คุ้นเคย บันทึกการบันทึกของคุณจะถูกเขียนไปยังไฟล์หรือจัดการในหน่วยความจำ (อย่างน้อยตราบใดที่มีการย้ายไปมาในคอนเทนเนอร์) ขอให้โชคดีบรรลุความน่าเชื่อถือของล็อกไฟล์ด้วยตัวแยกและการรวมสตรีมในหน่วยความจำ
Assaf Lavie

@AssafLavie คุณควรเขียนเป็นคำตอบที่สามารถ upvoted ได้ IMHO เป็นมุมมองที่ถูกต้องสมบูรณ์
Dan Cornilescu

2
ฉันมาที่นี่ด้วยคำถามเดียวกัน ความจริงง่ายๆคือฟังก์ชั่นการบันทึกในตัวของนักเทียบท่าขึ้นอยู่กับทุกสิ่งที่จะไปสู่ ​​stdout / stderr ดังนั้นไดรเวอร์การบันทึกและระบบนิเวศของเครื่องมือของบุคคลที่สามที่สร้างขึ้นรอบ ๆ มันก็เช่นกัน ฉันอยากจะทิ้งบันทึกทั้งหมดของฉันในโฮสต์ปริมาณเกินไป แต่ฉันรู้ว่าฉันจะต้องกลับไปและจัดการว่าเมื่อคอนเทนเนอร์ของฉันย้ายไปที่ k8s หรือ openshift หรือ gke หรืออะไรก็ตามในขณะที่ถ้าฉันทำตามนักเทียบท่า วิธีการ stdout มันจะราบรื่นมาก ในขณะเดียวกันฉันจะค้นหาคำตอบสำหรับคำถามที่ถูกกฎหมายนี้ต่อไป
Rhubarb

คำตอบ:


13

ฉันยังคงมองหาการควบรวม / วิธีการแยกตัวเอง แต่ในขณะเดียวกันวิธีนี้แนะนำโดยเอกสาร Kubernetes ดูเหมือนว่าวิธีการแก้ปัญหาเสียง: ใช้ภาชนะรถจักรยานยนต์สำหรับแต่ละบันทึกแยกต่างหากของคุณ

"sidecar" คือคอนเทนเนอร์ของนักเทียบท่าใด ๆ ที่คุณใช้ควบคู่ไปกับคอนเทนเนอร์ของนักเทียบท่าตัวอื่นเพื่อทำงานกับมันในบางวิธี ในกรณีนี้สำหรับบันทึกทั้งสามรายการของคุณคุณจะมีที่เก็บแยกต่างหากที่สแกนหรือตัดบันทึกและส่งออกไปยัง stdout

วิธีนี้แต่ละล็อก -idecar-container ของคุณมี loger-log ของมันเองจาก stdout ของมันเอง เมื่อแยกออกจากกันคุณสามารถใช้วิธีปฏิบัติมาตรฐาน docker (และ kubernetes ฯลฯ ) สำหรับการแยกหรือรวม นี่คือสิ่งที่หน้า Kubernetes ได้พูด:

วิธีนี้ช่วยให้คุณสามารถแยกสตรีมบันทึกต่างๆจากส่วนต่าง ๆ ของแอปพลิเคชั่นของคุณซึ่งบางส่วนอาจขาดการสนับสนุนสำหรับการเขียนไปยัง stdout หรือ stderr ตรรกะที่อยู่เบื้องหลังการเปลี่ยนเส้นทางบันทึกมีน้อยจึงแทบไม่มีค่าใช้จ่ายที่สำคัญ นอกจากนี้เนื่องจาก stdout และ stderr ได้รับการจัดการโดย kubelet คุณสามารถใช้เครื่องมือในตัวเช่นบันทึก kubectl

ต้นกำเนิด "แยกบันทึกสตรีม" จากการติดแท็กในตัวที่นักเทียบท่าใช้กับบันทึกจากคอนเทนเนอร์ต่าง ๆ ที่อธิบายไว้ในเอกสารประกอบของนักเทียบท่าที่นี่:

ตัวเลือกบันทึกแท็กระบุวิธีการจัดรูปแบบแท็กที่ระบุข้อความบันทึกของภาชนะ โดยค่าเริ่มต้นระบบจะใช้อักขระ 12 ตัวแรกของรหัสคอนเทนเนอร์ ในการลบล้างพฤติกรรมนี้ให้ระบุตัวเลือกแท็ก


เป็นมูลค่าการกล่าวถึงข้อเสียของวิธีการ log-sidecar-container อ้างถึง: "โปรดทราบว่าแม้จะมีการใช้งาน CPU และหน่วยความจำต่ำการเขียนบันทึกลงในไฟล์ ฉันสงสัยว่ามีใครลองใช้วิธีนี้ในทางปฏิบัติหรือไม่
yusong

8

ความคิดที่จะรวมพวกเขาเป็นหนึ่งกระแสเพื่อแยกพวกเขาในภายหลังฟังดูเจ็บปวด ฉันไม่มีเหตุผลที่จะทำสิ่งนี้ด้วยตัวเอง แต่นี่คือที่ที่ฉันจะเริ่ม:

  • เมื่อคุณเรียกใช้คอนเทนเนอร์นักเทียบท่าสร้างโวลุ่มเพื่อให้ง่ายต่อการดู / จัดส่งบันทึกจากโฮสต์
  • ใช้บางอย่างเช่นremote_syslog2เพื่อจัดส่งบันทึกไปยังตัวรวบรวมบันทึกของคุณ

รู้สึกน้อยกว่าสง่างามเล็กน้อยที่จะต้องทำการตั้งค่าบางอย่างบนโฮสต์เช่นกัน แต่ถ้าคุณใช้บางสิ่งบางอย่างอย่างเช่นที่คุณสามารถเรียกใช้ playbook และตั้งค่านั้นในระหว่างการปรับใช้กับกล่องมันไม่ควรเกินไป ไม่ดี


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