18.224.38.3 |    

Navigation

Google Advertisement

Rotiert Logfiles in einem Verzeichnis und verwendet eine Konfigurationsdatei, in der fuer jedes Logfile gespeichert ist, nach wie vielen Tagen es umkopiert wird. Format der Contig-Datei: logfilename=dauer Dauer in Tagen. Taucht ein Logfile nicht auf ist dauer=7 Tage. Hier eine Beispiel Konfiguration.
# **********************************************************
# file: rotatelogs.cfg
# date: 2005-02-16
# author: Marko Schulz - <mschulz@jamba.net>
# dascription: config file for rotatelogs.sh - Format:
#
# name=duration	# (days)
#
# name is any filename in $logdir.
# **********************************************************

tomcat.log=5
apache.log=1
# Anything with a duration of zero is not rotated
rotatelogs.log=0


rotatelogs.sh
  1. #!/bin/bash
  2. # **********************************************************
  3. # file: rotatelogs.sh
  4. # date: 2005-02-16
  5. # author: Marko Schulz - <mschulz@jamba.net>
  6. #
  7. # Rotiert Logfiles in einem Verzeichnis (z.B. /var/log).
  8. # Verwendet eine Konfigurationsdatei, in der fuer jedes Logfile
  9. # gespeichert ist, nach wie vielen Tagen es umkopiert wird.
  10. # Format der Contig-Datei: logfilename=dauer Dauer in Tagen.
  11. # Taucht ein Logfile nicht auf ist dauer=7 Tage.
  12. # **********************************************************
  13.  
  14. # Fehler per Mail senden (on=>ja/off=>nein)...
  15. notify="on"
  16.  
  17. # Email an der Fehlermeldungen geschickt werden...
  18. email="mschulz@jamba.net"
  19.  
  20. # Verzeichnis der Logfiles welche rotiert werden sollen...
  21. logdir="/var/log"
  22.  
  23. # Name und Pfad des Configfile...
  24. config="/etc/rotatelogs.cfg"
  25.  
  26. # Name und Pfad des Programm Logfile...
  27. logfile="/var/log/rotatelogs.log"
  28.  
  29. # Default Rotation (in Tagen)...
  30. default_duration=7
  31.  
  32. # **********************************************************
  33. # Funktion zum loggen der Status bzw. Fehlermeldungen.
  34.  
  35. function myLogger() {
  36.  
  37. local msg=$1
  38. local date=$( date +%Y-%m-%d\ %H:%M:%S )
  39. echo "$date $msg" >> $logfile
  40.  
  41. }
  42.  
  43. # **********************************************************
  44. # Versenden von Fehlermeldungen und Programm beenden.
  45.  
  46. function error() {
  47.  
  48. local status=$1
  49.  
  50. if [ "$notify" = "on" -a -n "$email" ]; then
  51. 	body="This mail was sent automaticly"
  52. 	error=$( grep $( date +%Y-%m-%d ) $logfile | grep -i '\[error\]' )
  53. 	echo -e "$body\n\n$error"  | mail -s "Error at $0 ..." $email
  54. fi
  55.  
  56. exit $status
  57.  
  58. }
  59.  
  60. # **********************************************************
  61. # Programmablauf
  62.  
  63. # Startwerte...
  64. duration=$default_duration
  65. count=0
  66.  
  67. # Programm beeenden, wenn Konfigurationsdatei fehlt.
  68. [ ! -f "$config" ] && myLogger "[error] $0: config file not found" && error 1
  69.  
  70. # Programm beenden, wenn $LOGDIR keine Schreibrechte bzw. keine Rechte hat um in den Ordner zu wechseln.
  71. [ ! -w "$logdir" -o ! -x "$logdir" ] && myLogger "[error] $0: you have no permission in $logdir" && error 1
  72.  
  73. cd $logdir
  74.  
  75. # Da viele find-Versionen keine POSIX-Notation beherrschen, verwenden wir hier nicht ':digit:' sondern [0-9].
  76. for name in $( find . -type f -size +0c ! -name '*[0-9]*' ! -name '\.*' ! -name '*conf' -maxdepth 1 -print | sed 's/^\.\///' ); do
  77. 	count=$(( $count + 1 ))
  78.  
  79. 	# Eintrag in der Konfigurationsdatei suchen
  80. 	duration="$( grep "^${name}=" $config | cut -d= -f2 )"
  81.  
  82. 	if [ -z "$duration" ]; then
  83. 		duration=$default_duration
  84. 	elif [ "$duration" = "0" ]; then
  85. 		myLogger "[status] $0: set duration to 0 - jump over $name"
  86. 		continue
  87. 	fi
  88.  
  89. 	back1="${name}.1"; back2="${name}.2";
  90. 	back3="${name}.3"; back4="${name}.4";
  91.  
  92. 	# Wenn die neuste Kopie des Logfiles (back1) innerhalb der festgelegten
  93. 	# Zeit veraendert wurde, ist jetzt keine Rotation noetig.
  94. 	if [ -f "$back1" ]; then
  95. 		if [ -z $( find "$back1" -mtime +$duration -print 2>/dev/null ) ]; then
  96. 			myLogger "[status] $0: skip rotation of $name - last backup of $name less then $duration days"
  97. 			continue
  98. 		fi
  99. 	fi
  100.  
  101. 	myLogger "[status] $0: rotate log file $name ($duration days backup)"
  102.  
  103. 	# Rotieren. Wir beginnen mit dem aeltesten Log file.
  104. 	[ -f "$back3" ] && myLogger "[status] $0: rename $back3 -> $back4" && mv -f "$back3" "$back4"
  105. 	[ -f "$back2" ] && myLogger "[status] $0: rename $back2 -> $back3" && mv -f "$back2" "$back3"
  106. 	[ -f "$back1" ] && myLogger "[status] $0: rename $back1 -> $back2" && mv -f "$back1" "$back2"
  107. 	[ -f "$name" ] && myLogger "[status] $0: rename $name -> $back1" && mv -f "$name" "$back1"
  108.  
  109. 	touch "$name"
  110. 	chmod 0600 "$name"
  111.  
  112. done
  113.  
  114. [ $count -eq 0 ] && myLogger "[status] $0: nothing done - no log files big or old enough for rotation"
  115.  
  116. exit 0
  117.  
  118. # **********************************************************
  119. # end of this script...
Parsed in 0.006 seconds at 651.83 KB/s

Search
 
Full text search by name and content of a snippet.

User online
There are 3 users online.

Tags Cloud

Latest snippets
str2seconds
(Bash::Function)
is_integer
(Bash::Function)
file_rotate
(Bash::Function)
confirm
(Bash::Function)
is_workingtime
(Bash::Function)
last day of last month
(Bash::Snippets)
crypt_apr1_md5
(PHP::Function)
crypt_apr1_md5
(Perl::Function)
transparent
(CSS)
rfc2822Toiso8601
(PHP::Function)