วิธีที่เหมาะสมในการหมุนบันทึก Nginx


12

ฉันต้องการที่จะบรรลุการหมุนของบันทึก nginx ที่:

  1. จะทำงานโดยไม่มีซอฟต์แวร์พิเศษใด ๆ (เช่น - ดีที่สุดหากไม่มี "logrotate")
  2. จะสร้างไฟล์ที่หมุนด้วยชื่อตามวันที่

วิธีที่ดีที่สุดคือ PostgreSQL มี - นั่นคือในตัวแปร config ของ log_filename ฉันสามารถระบุรูปแบบ strftime-style% Y-% m-% d และมันจะเปลี่ยนวันที่เข้าสู่ระบบ (หรือเวลา) โดยอัตโนมัติ

อีกวิธีหนึ่งจาก Apache - ส่งบันทึกผ่านไพพ์ไปยังโปรแกรม rotatelogs

เท่าที่ฉันสามารถค้นหา - ไม่มีวิธีการดังกล่าวอยู่ สิ่งที่ฉันทำได้คือใช้ตัวเลือก logrotate กับ dateext แต่มีชุดข้อเสียของตัวเองและฉันอยากใช้สิ่งที่ทำงานเช่น | rotatelogs หรือ log_filename ใน PostgreSQL


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

logrotate (พร้อม dateext) เกือบจะใช้งานได้ แต่ฉันไม่ชอบเพราะจะต้องทำงานผ่าน cron และมันมีข้อเสียอยู่บ้าง

เนื่องจาก nginx ไม่สนับสนุนการไพพ์บันทึกของมันไปยังโปรแกรมอื่น ๆ ไม่สนับสนุนการหมุนเวียนบันทึกด้วยตัวเองและคุณไม่ชอบวิธีที่ใช้ cron คุณอาจไม่ได้สิ่งที่ต้องการ บางครั้ง "เกือบจะได้ผล" ก็ดีพอ ๆ กับที่ได้รับ ;) ยกเว้นกรณีที่คุณต้องการแพทช์ nginx ด้วยตัวคุณเอง
joschi

คำตอบ:


7

ในขณะที่โลกถูกแบ่งออกว่าท่อที่มีชื่อต่ำต้อยเป็นเพื่อนหรือศัตรูมันน่าจะเป็นทางออกที่ง่ายที่สุดสำหรับปัญหาของคุณ มันมีข้อเสียเล็กน้อย (ซึ่งคุณต้องสร้างท่อล่วงหน้า) แต่ไม่จำเป็นต้องมี cron และให้คุณใช้การบันทึกไปป์ pipe-filter ที่คุณเลือก

นี่คือตัวอย่างการใช้ระบบบันทึกเวลาบนaccess.log:

  1. เลือกเส้นทางสำหรับไพพ์ที่มีชื่อของเรา ฉันตั้งใจจะเก็บบันทึกไว้/var/log/nginxดังนั้นฉันจะใส่ท่อของฉันที่นั่นเช่นกัน ชื่อขึ้นอยู่กับคุณ ฉันผนวก.fifoและก็เพื่อให้เหมืองจะเป็นที่access.log/var/log/nginx/access.log.fifo
  2. ลบไฟล์หากมีอยู่
  3. สร้างไปป์ที่มีชื่อสำหรับ logfile:

    mkfifo /var/log/nginx/access.log.fifo
    
  4. กำหนดค่าnginx.confให้ชี้ล็อกที่ไพพ์ที่คุณเพิ่งทำ:

    access_log /var/log/nginx/access.log.fifo;
    
  5. ปรับเปลี่ยนสคริปต์ init.d ของคุณเพื่อเริ่ม log rotator เพื่อฟังไปป์ก่อนที่เราจะเริ่มเซิร์ฟเวอร์:

    LOGS="/var/log/nginx"
    pkill -f "/usr/sbin/cronolog --symlink $LOGS/access.log"
    ( cat $LOGS/access.log.fifo | /usr/sbin/cronolog --symlink $LOGS/access.log "$LOGS/%Y/%m/%d/access.log" ) &
    

    บรรทัดคำสั่งที่คล้ายกันจะใช้สำหรับrotatelogsหากคุณต้องการให้cronolog- ดูเอกสารของพวกเขาสำหรับไวยากรณ์

    หากการแพร่กระจายของคุณมี a start-stop-daemonคุณควรใช้สิ่งนั้นแทนเนื่องจากในทางทฤษฎีจะมีความรู้พิเศษเกี่ยวกับแพลตฟอร์มของคุณที่นั่นและดูแลpkillคุณ เพียงห่อคำสั่งในสคริปต์แล้วส่งผ่านตาม--execที่start-stop-daemonคุณinit.d/nginxต้องการ


ฉันรักคำบอกเวลา เป็นการดีที่ได้เห็นผู้คนจำนวนมากที่ใช้ / แนะนำ
natacado

1

ฉันได้เขียนโปรแกรมอย่างง่าย datelog เพื่อแยกบันทึกทั่วไปตามวันที่บันทึกซึ่งตรงข้ามกับเวลาของระบบปัจจุบันเมื่อเห็นบรรทัดบันทึกโดยโปรแกรม นี่อาจเป็นหรือไม่ตรงตามลำดับเวลาหรือตัวแยกบันทึกอื่นทำอยู่แล้ว แต่การเขียนของฉันเองเร็วกว่าการค้นหาว่าคนอื่นทำอะไร

ใช้ปีและเดือนในคำขอที่บันทึกไว้บรรทัดจะถูกเขียนไปยังไฟล์หรือไพพ์ซึ่งรวมถึง YYYYMM ที่คำนวณจากข้อมูลที่บันทึก ใช่มันค่อนข้างเฉพาะสำหรับรูปแบบบันทึกทั่วไป [แรกจะถือว่าการกำหนดเขตวันที่ ระวังที่อยู่ IPv6 :)

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

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

รหัสที่มา: http://stuge.se/datelog.c

โปรดส่งข้อเสนอแนะและแพทช์แน่นอน!


1

คุณสามารถทำได้โดยใช้ bash script และ cron ง่ายๆ

#!/bin/bash
DATE=$(date +%Y-%m-%d-%H%M)
mv /var/log/nginx/access.log /var/log/nginx/nginx.access.log.$DATE
mv /var/log/nginx/error.log /var/log/nginx/nginx_error.log.$DATE
kill -USR1 `cat /var/run/nginx.pid`
sleep 1
gzip /var/log/nginx/access.log.$DATE
gzip /var/log/nginx/error.log.$DATE

รายละเอียดเพิ่มเติมเกี่ยวกับการตั้งค่า crontab ฯลฯ พบได้ที่นี่: การหมุนไฟล์บันทึก Nginx ผ่าน Cron


0

ฉันกลัวว่าฉันไม่เข้าใจคำถามของคุณจริง ๆ : เนื่องจาก nginx ไม่สนับสนุนการบันทึกแบบ builtin ใด ๆ คุณจะต้องไปกับสิ่งที่ชอบ

mv access.log access.log.$(date "+%Y-%m%d")
kill -USR1 $(cat master.nginx.pid)

บางแห่งใน /etc/cron.daily (คุณต้องผ่านการรับรองชื่อไฟล์ข้างต้นด้วยชื่อพา ธ แบบเต็มแน่นอน) หรือติดตั้งยูทิลิตี้ apache2 เพื่อเข้าถึง rotatelogs


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