มีวิธีที่เหมาะสมในการล้างบันทึกหรือไม่


64

ฉันสงสัยว่ามีวิธีที่เหมาะสมในการล้างบันทึกโดยทั่วไปหรือไม่

ฉันใหม่กับ Ubuntu และฉันกำลังพยายามตั้งค่า Postfix /var/log/mail.logบันทึกในคำถามคือ ฉันสงสัยว่ามีวิธีที่ถูกต้องในการล้างมันมากกว่าที่ฉันจะเข้าไปในนั้นและลบบรรทัดทั้งหมดและบันทึกไว้ ฉันพบว่าบางครั้งข้อผิดพลาดจะไม่ถูกเขียนลงในไฟล์ทันทีหลังจากฉันลบบันทึกและบันทึก

หมายเหตุด้านข้าง: ฉันมีปัญหาในการตั้งค่า Postfix และพยายามทำให้ง่ายขึ้นสำหรับฉันที่จะอ่านบันทึกโดยหวังว่ามันจะช่วยฉันได้แทนที่จะต้องเลื่อนลงไปจนสุด


2
หากคุณต้องการที่จะเห็นจุดสิ้นสุดของไฟล์แล้วหางเป็นเพื่อนของคุณ tail /var/log/mail.log เพื่อแสดง 5 บรรทัดสุดท้าย tail -f /var/log/mail.log เพื่อดูบรรทัดทั้งหมดที่เขียนไปที่ท้ายไฟล์
user9517

คำตอบ:


79

คุณสามารถใช้ได้:

> /var/log/mail.log

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

นอกจากนี้หากคุณกำลังดูเนื้อหาของบันทึกคุณอาจต้องการใช้tailคำสั่ง:

tail -f /var/log/mail.log

Ctrl-C จะตัดหางออก


2
/bin/csh(ทั่วไปสำหรับ FreeBSD) จะประกันตัวด้วย "คำสั่ง null ไม่ถูกต้อง" ในขณะเดียวกันzsh(การแทนที่ยอดนิยมbash) จะรอ EOF ดูserverfault.com/a/381380/67675
poige

ฉันจะกำหนดเวลามันได้อย่างไร การวาง>ไวยากรณ์ใน crontab ไม่ได้ทำงานเนื่องจากอาจไม่ได้รับการยอมรับว่าเป็นไวยากรณ์
ishandutta2007

26

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

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

หากโปรแกรมที่เขียนไฟล์บันทึกนั้นmultilogมาจากdaemontoolsแพ็คเกจคุณจะไม่ทำสิ่งใดเพื่อหมุนล็อกเลย - ไม่มีสคริปต์แบบแมนนวลไม่มีcronงานทำ เพียงแค่บอกmultilogว่าเอาท์พุทบันทึกเป็นไดเรกทอรีและมันจะรักษาชุดของไฟล์บันทึก N แบบหมุนโดยอัตโนมัติและกำหนดขนาดด้วยขนาดในไดเรกทอรีนั้น

หากโปรแกรมที่เขียนไฟล์บันทึกนั้นsvlogdมาจากrunitแพ็คเกจอีกตัวอย่างหนึ่งจะมีผลเช่นเดียวกัน คุณไม่ได้ทำอะไรนอกจากชี้ไปที่ไดเรกทอรี มันจะรักษาชุดของไฟล์บันทึก N แบบหมุนโดยอัตโนมัติและกำหนดขนาดไว้ในไดเรกทอรีนั้น

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

syslogdวิธีการเก่า ๆในการหมุนเวียนบันทึกซึ่งยังคงคาดหวังจากการบันทึกโปรแกรมเช่น syslog-ngและเป็นตัวอย่างโดยเครื่องมือเช่นที่logrotateกล่าวถึงโดยdjangofanคำตอบอื่น ๆ ที่นี่เป็นเรื่องที่จับจดมากกว่า หนึ่งรันcronงานที่เปลี่ยนชื่อไฟล์บันทึกเป็นระยะ ๆ และรีสตาร์ท daemon การบันทึก (ใช้ daemon supervisor ใดก็ตามที่รันอยู่) แน่นอนปัญหานี้คือมันไม่ได้บังคับขนาดโดยรวม ในสัปดาห์ที่ช้าหนึ่งสามารถรับ N ไฟล์บันทึกรายวันขนาดเล็กมากในขณะที่ในวันที่ไม่ว่างเราสามารถรับล็อกไฟล์ขนาดใหญ่ 1 ไฟล์ซึ่งมีขนาดเกินขีด จำกัด

นี่คือเหตุผลที่ในภายหลังและเครื่องมือที่ดีกว่าเช่นmultilogและsvlogdมีแฟ้มตัวเลือกการกำหนดขนาดและจริงตรวจสอบแฟ้มบันทึกขนาดตัวเองแน่นอน โลกได้เรียนรู้ว่าการสำรวจบันทึกตามกำหนดเวลากับcronงานหรือแม้แต่logrotateภูตออกจากหน้าต่างเพื่อให้ขนาดไม่ถูกต้องและสถานที่ที่เหมาะสมในการตรวจสอบเหล่านี้และบังคับใช้ขนาดสูงสุดที่ผู้ดูแลระบบกำหนดไว้อย่างเข้มงวดไฟล์บันทึกไม่เคยกลืนพาร์ติชั่นที่อยู่ในโปรแกรมที่กำลังเขียนไฟล์ออกมาตั้งแต่แรก


สำหรับ rsyslog นั้นสามารถกำหนดค่าได้อย่างง่ายดายดังนั้นให้ใช้ชื่อไฟล์ที่อธิบายโดย "pattern" ซึ่งรวมถึงตัวอย่างเช่น YEAR, MONTH และ DAY นี้เป็นเรื่องง่ายเหมือนการมีคำสั่งตามtemplate(name="DYNmail" type="string" string="/var/log/%$YEAR%/%$MONTH%/%$DAY%/mail.log") if ($syslogfacility-text == 'mail') then -?DYNmail;TraditionalFormatด้วยวิธีนี้การหมุนล็อกเป็นเพียงปัญหาที่เกิดขึ้นอย่างน้อยเมื่อไฟล์เดียวต่อวันก็โอเค สำหรับบันทึกปริมาณมาก (ต้องหมุนหลายรอบต่อวัน) ก็มี$HOURเช่นกัน
Damiano Verzulli

13

คุณสามารถใช้สิ่งนี้ได้เช่นกัน ..

truncate /opt/package/logs/*.log --size 0

นี่คือไฟล์บันทึกทั้งหมดใน / opt / แพ็คเกจ / บันทึกจะว่างเปล่า ..


ฉันไม่เห็นว่าสิ่งนี้จะดีกว่าคำตอบที่เก่ากว่า
kasperd

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

11

ใช่มีเครื่องมือสำหรับลินุกซ์ที่เรียกว่าlogrotate


9
เพียงแค่การแก้ไขเล็กน้อย: นี่ไม่ใช่บริการนี่เป็นเครื่องมือที่มักจะเรียกใช้จากบริการ cron
rvs

10

หากเหตุผลที่คุณล้างบันทึกคือเพื่อเพิ่มพื้นที่ว่างคุณสามารถ cat / dev / null ไปยังไฟล์เหล่านั้นได้โดยไม่ต้องขัดจังหวะโปรแกรมที่เขียนลงไป ไม่ต้องลบเลย! ซอฟต์แวร์บางตัวอาจบ่นโดยหยุดทำงานหรือเพิกเฉยต่อการบันทึกอย่างสมบูรณ์จนกว่าจะรีสตาร์ทครั้งถัดไป

cat /dev/null > /path/to/logfile

# to empty all the logs in a directory
for i in /var/log/*; do cat /dev/null > $i; done

3
เพื่อล้างแฟ้มบันทึกซ้ำ:for i in $(find /var/log -type f); do cat /dev/null > $i; done
Iurie มาลัย

4

การเขียนทับเนื้อหาสั้นและเข้ากันได้: : > /dest/file

แต่ยังมีการตัดระบบ (2) การเรียกใช้ระบบและเครื่องมือ userspace ที่สอดคล้องtruncateกับ * NIX'es จำนวนมาก


1

หากคุณต้องการเก็บไฟล์ไว้ก่อนที่จะล้างข้อมูลคุณสามารถทำสิ่งต่อไปนี้

cp /var/log/mail.log /var/log/mail.log.1 && echo -n "" > /var/log/mail.log

หากคุณต้องการค้นหาข้อความหรืออีเมลเฉพาะในบันทึกคุณสามารถใช้ grep หากคุณต้องการเก็บกราฟิกบางอย่างเกี่ยวกับการใช้จดหมายคุณสามารถใช้ AWStats


1

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

# Clear nginx logs.
# @usage delnginxlogs
function delnginxlogs() {
  echo "--------------- ⏲  Clearing logs... ---------------"

  # Clear logs.
  for i in /var/log/nginx/*; do cat /dev/null > $i; done

  echo "--------------- ⏲  Deleting .gz log files... ---------------"

  # Delete .gz files.
  find /var/log/nginx -type f -regex ".*\.gz$" -delete

  echo "--------------- 💯 DONE: NGINX logs cleared ... ---------------"
}

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