Score:0

ตั้งค่าลำดับความสำคัญของ INFO/ERROR สำหรับข้อความที่บันทึกลงในเจอร์นัลผ่าน stdout และ stderr หรือไม่

ธง jp

เรามีแอปที่ใช้งานจริงจำนวนมาก (บุคคลที่หนึ่งและบุคคลที่สาม) ที่ออกจากการเข้าสู่ระบบไปยังกระบวนการที่เรียกใช้แอปและเพียงแค่เข้าสู่ แย่ สำหรับ ข้อมูล และ สตเดอร์ สำหรับ ข้อผิดพลาด บันทึก (เช่น ลำดับความสำคัญของบันทึกเพียง 2 รายการ: ข้อมูล | ข้อผิดพลาด).

ด้วยหน่วยบริการ systemd สำหรับแอป คุณสามารถตั้งค่าได้ดังนี้:

StandardOutput=วารสาร
StandardError=วารสาร

สิ่งนี้ช่วยให้ devops จัดการทุกอย่างผ่านหน่วย systemd และเจอร์นัลเพื่ออำนวยความสะดวกในการรวบรวมบันทึกจากส่วนกลาง ตรวจสอบอะไรก็ตาม... และพวกเขาไม่จำเป็นต้องกังวลเกี่ยวกับการค้นหาและแยกวิเคราะห์บันทึกในรูปแบบ/ตำแหน่งที่แตกต่างกันสำหรับทุกแอปที่ปรับใช้

สมุดรายวันของ systemd มีระบบลำดับความสำคัญของข้อความที่เข้ากันได้กับระบบลำดับความสำคัญของข้อความ 7 ระดับของ syslog ข้อมูล เป็นระดับ 6 และ ข้อผิดพลาด เป็นระดับ 3. ดูข้อมูลอ้างอิงสำหรับรายละเอียดเพิ่มเติม

ปัญหาคือ... systemd/journal ไม่แยกแยะระหว่างข้อความที่เขียนไปยังเจอร์นัลจาก stdout vs stderr ทั้งข้อความ stdout และ stderr ล้วนถูกเขียนไปยังบันทึกประจำวันโดยมีลำดับความสำคัญเริ่มต้นที่ 6 (ข้อมูล).

ตัวอย่าง: "แอพแฟนซี"

/opt/log-test.sh

#!/bin/bash

echo "นี่คือข้อผิดพลาด" 1>&2
echo "นี่คือข้อมูล"

ทางออก 0

/etc/systemd/system/log-test.service

[หน่วย]
คำอธิบาย=บันทึกการทดสอบสำหรับสมุดรายวัน

[บริการ]
ประเภท = ง่าย

ExecStart=/opt/log-test.sh

StandardOutput=วารสาร
StandardError=วารสาร
SyslogIdentifier=บันทึกการทดสอบ

เรียกใช้และตรวจสอบวารสาร

$ systemctl เริ่มการทดสอบบันทึก
$ Journalctl -u บันทึกการทดสอบ
-- บันทึกเริ่มเมื่อพฤ. 2022-04-07 08:17:16 UTC สิ้นสุดในพฤ. 2022-04-07 16:35:02 UTC --
07 เม.ย. 16:34:58 host.example.com systemd[1]: เริ่มการทดสอบบันทึกสำหรับเจอร์นัล
07 เม.ย. 16:34:58 host.example.com log-test.sh[29909]: นี่คือข้อผิดพลาด
07 เม.ย. 16:34:58 host.example.com log-test.sh[29909]: นี่คือ INFO
$ journalctl -u log-test -p 6 # ลำดับความสำคัญของข้อมูล syslog
-- บันทึกเริ่มเมื่อพฤ. 2022-04-07 08:17:16 UTC สิ้นสุดในพฤ. 2022-04-07 16:35:08 UTC --
07 เม.ย. 16:34:58 host.example.com systemd[1]: เริ่มการทดสอบบันทึกสำหรับเจอร์นัล
07 เม.ย. 16:34:58 host.example.com log-test.sh[29909]: นี่คือข้อผิดพลาด
07 เม.ย. 16:34:58 host.example.com log-test.sh[29909]: นี่คือ INFO
$ Journalctl -u บันทึกการทดสอบ -p 3 # ลำดับความสำคัญของข้อผิดพลาด syslog
-- ไม่มีรายการ --
$

คุณจะเห็นว่าทั้งข้อความ stderr และ stdout ถูกตั้งค่าเป็นลำดับความสำคัญ 6 (ข้อมูล) เมื่อเขียนถึงวารสาร

นี่เป็นปัญหาเนื่องจากเราไม่มีวิธีง่าย ๆ ในการแยกแยะเอาต์พุตของ stdout vs stderr เมื่อใช้ stdio->วารสาร เป็นสิ่งอำนวยความสะดวกในการเข้าสู่ระบบหลัก

นี้ได้รับ กล่าวถึงก่อน และ โซลูชั่น เป็นไปได้ แต่ ไม่ได้ดำเนินการ. ฉันหวังว่าทีม systemd จะนำสิ่งนี้ไปใช้ในที่สุด แต่ในขณะเดียวกันฉันก็ต้องการวิธีแก้ปัญหา

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

ฉันไม่ต้องการให้แอปทั้งหมดที่เราปรับใช้ (ไม่ใช่ทั้งหมดเขียนโดยเรา) ต้องใช้การรวมเจอร์นัลหรือ syslog เพื่อให้ได้ลำดับความสำคัญของบันทึกเมื่อเราต้องการเพียงสองระดับเท่านั้น: ข้อมูล (stdout) และ ข้อผิดพลาด (สแตเดอร์).

สิ่งที่เราปรับใช้ส่วนใหญ่ไม่ได้อยู่ในคอนเทนเนอร์ ดังนั้นการพึ่งพาสิ่งอำนวยความสะดวกในการบันทึกของคอนเทนเนอร์จึงไม่ใช่วิธีแก้ปัญหาสำหรับเราเช่นกัน

การให้ stderr และ stdout ไปที่ Journal/syslog ในลำดับความสำคัญที่แตกต่างกันโดยค่าเริ่มต้นนั้นค่อนข้างสำคัญอย่างยิ่งสำหรับการตรวจสอบข้อผิดพลาดของบันทึกแบบกระจายที่ง่ายขึ้น

อ้างอิง:

Score:1
ธง tz

ถ้าต้องใช้ แย่/สตเดอร์คุณสามารถใช้ sd-ภูต คำนำหน้าการบันทึก.

เติมของคุณ สตเดอร์ กับ <3> เพื่อส่ง ข้อผิดพลาด ลำดับความสำคัญ วารสาร บันทึก.

ใช้ของคุณ log-test.sh และ บันทึกการทดสอบบริการ:

#!/bin/bash

>&2 echo "<3>นี่คือข้อผิดพลาด"
echo "นี่คือข้อมูล"

ทางออก 0

และ วารสาร ctl เอาต์พุต:

$ Journalctl -u บันทึกการทดสอบ -p 3
02 พฤษภาคม 01:22:58 host.example.com log-test.sh[29909]: นี่คือข้อผิดพลาด

ถ้าคุณ แอพแฟนซี มี API ใด ๆ ที่จะเขียนถึง syslogคุณสามารถใช้สิ่งนั้นเพื่อเขียนไปยัง UNIX datagram /dev/log (โดยปกติจะเขียนได้โดยค่าเริ่มต้น และบันทึกไปที่ วารสาร) แทน แย่/สตเดอร์. ใช้แท็ก syslog เพื่อระบุของคุณ แอพแฟนซี, syslog ลำดับความสำคัญเป็น ข้อผิดพลาด หรือ ข้อมูล ขึ้นอยู่กับความต้องการของคุณและสิ่งอำนวยความสะดวก syslog

ตัวอย่างเช่นใน Bash เราสามารถใช้ คนตัดไม้:

# ส่งข้อความ INFO ไปที่ Journalctl
$ คนตัดไม้ -t แอพแฟนซี -u /dev/log -p user.info "นี่คือข้อมูล"

# ส่งข้อความผิดพลาดไปที่ Journalctl
$ คนตัดไม้ -t แอพแฟนซี -u /dev/log -p user.error "นี่คือข้อผิดพลาด"

# แสดงข้อความเจอร์นัลสำหรับแอพแฟนซี
$journalctl -t แอพแฟนซี
02 พฤษภาคม 01:23:38 host.example.com fancy-app[27302]: นี่คือข้อมูล
02 พฤษภาคม 01:23:39 host.example.com fancy-app[27303]: นี่คือข้อผิดพลาด

# แสดงข้อความ ERROR ของ Journald สำหรับแอปแฟนซี
$journalsctl -t แอพแฟนซี -p 3
02 พฤษภาคม 01:23:39 host.example.com fancy-app[27303]: นี่คือข้อผิดพลาด

โปรดทราบว่าใน distros ส่วนใหญ่ วารสาร รายการมักจะส่งต่อไปยัง syslog daemon โลคัล (syslog-ng, rsyslog, ...) ดังนั้นอาจตรวจสอบตัวกรอง syslog ของคุณ หรืออาจใช้ ท้องถิ่น0...ท้องถิ่น7 สิ่งอำนวยความสะดวก.

เรามีแอปที่ใช้งานจริงจำนวนมาก (บุคคลที่หนึ่งและบุคคลที่สาม) ที่ปล่อยให้การเข้าสู่ระบบไปยังคอนเทนเนอร์และเพียงแค่เข้าสู่ stdout สำหรับ INFO และ stderr สำหรับบันทึกข้อผิดพลาด (เช่น ลำดับความสำคัญของการบันทึกเพียง 2 รายการ: INFO|ERROR)

เอ็นจิ้นคอนเทนเนอร์ส่วนใหญ่ควรสามารถเข้าสู่ syslog ได้ ฉันจะใช้ Docker เป็นตัวอย่างโดยไม่รู้ว่าคอนเทนเนอร์เอนจิ้นของคุณ

นักเทียบท่ามี ไดรเวอร์การบันทึก syslog ที่สามารถใช้เพื่อส่งข้อความบันทึกโดยใช้รูปแบบ syslog ไปยังเป้าหมาย syslog ใดๆ คุณควรจะเข้าสู่ระบบได้ วารสาร ด้วยสิ่งที่ชอบ:

นักเทียบท่ารัน \
    --log-driver syslog \
    --log-opt syslog-address=unix:///dev/log \
    --log-opt syslog-facility=user \
    --log-opt tag=fancy-app \
    แอพแฟนซี: ล่าสุด

นักเทียบท่าก็มี โปรแกรมควบคุมการบันทึก Journald มีอยู่. ตัวอย่างเช่น:

นักเทียบท่ารัน \
    --log-driver Journald \
    --log-opt tag=fancy-app \
    แอพแฟนซี: ล่าสุด

ทั้งไดรเวอร์การบันทึก (syslog และ วารสาร) รองรับการแยกระหว่าง แย่ และ สตเดอร์; เช่น. แย่ ข้อความจะถูกบันทึกด้วย ข้อมูล ลำดับความสำคัญและ สตเดอร์ ข้อความจะถูกบันทึกด้วย ข้อผิดพลาด ลำดับความสำคัญ.

นอกเหนือจากปรัชญาและสงครามแห่งเปลวเพลิงแล้ว ทำไมไม่เข้าสู่ syslog จริงล่ะ ง่ายกว่า จัดเก็บในรูปแบบข้อความ และโดยทั่วไปรองรับโดยซอฟต์แวร์การจัดการบันทึก (ดู เกรย์ล็อก, ล็อกสแตช, ทางกระดาษ).

mattpr avatar
jp flag
ขอบคุณสำหรับคำตอบ ฉันจะสรุปรายละเอียดในวันนี้หลังจากดื่มกาแฟเพิ่มเติม เราไม่ได้ใช้คอนเทนเนอร์สำหรับหลายสิ่งหลายอย่าง ดังนั้นนั่นจึงไม่ใช่วิธีแก้ปัญหาในทันที ส่วนที่เหลือบางส่วนดูเหมือนจะเป็นประโยชน์ เราทำการรวมบันทึกส่วนกลางด้วย ELK หรือ Graylog (ปัจจุบันคือ greylog) และสามารถใช้/ขนส่งทั้ง syslog และเจอร์นัล (ผ่าน journalbeat ตอนนี้ filebeat) เพื่อบันทึกคลัสเตอร์การรวม ปัญหาคือเรามักควบคุมโค้ดแอปที่เราปรับใช้ไม่ได้ (เช่น แอปของบุคคลที่สามที่เราไม่ต้องการรักษาแพตช์การบันทึก) และแอปมักมีค่าเริ่มต้นเป็น stdout/stderr...หรือแย่กว่านั้นคือไฟล์บันทึกของตัวเอง /รูปแบบ.

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา