sexta-feira, 29 de novembro de 2013

Script para efetuar ROTATE nos Logs do Apache ( Linux )


#!/bin/sh
# -----------------------------------------------------------------------------
#  APACHE ROTATE LOGS *********************************************************
# -----------------------------------------------------------------------------
   umask 077
   PATH="/usr/scripts:${PATH}"
   PATH="${PATH}:/usr/local/bin"
   PATH="${PATH}:/usr/local/sbin"
   export PATH
   BASE="/usr/local/apache"
   PID="/var/run/httpd.pid"
   [ ! -d ${BASE} ] && exit 1

   MINLAP=82800 # 23:00 hours
   RMFILE=".last.rotation" # last rotation mark file

   ACC="access_log"
   ERR="error_log"
   HIST="access_log.history"

   TODAY=`date +%d`
   MONTH=`date +%m`
   YEAR=`date +%Y`

   MONTH=`expr ${MONTH} - 1`
   if [ ${MONTH} -eq 0 ]
      then
            MONTH=12
            YEAR=`expr ${YEAR} - 1`
      fi

   [ ${MONTH} -eq  1 ] && MNAME="January"
   [ ${MONTH} -eq  2 ] && MNAME="February"
   [ ${MONTH} -eq  3 ] && MNAME="March"
   [ ${MONTH} -eq  4 ] && MNAME="April"
   [ ${MONTH} -eq  5 ] && MNAME="May"
   [ ${MONTH} -eq  6 ] && MNAME="June"
   [ ${MONTH} -eq  7 ] && MNAME="July"
   [ ${MONTH} -eq  8 ] && MNAME="August"
   [ ${MONTH} -eq  9 ] && MNAME="September"
   [ ${MONTH} -eq 10 ] && MNAME="October"
   [ ${MONTH} -eq 11 ] && MNAME="November"
   [ ${MONTH} -eq 12 ] && MNAME="December"
#
# -----------------------------------------------------------------------------
#
   DONE=""
   SERVER=""
   ARGS="$*"

   if [ -z "${ARGS}" ]
      then
             for  ONE  in `ls -d "${BASE}"/logs/* 2> /dev/null`
              do
                  ARGS="${ARGS} `basename ${ONE}`"
            done
      fi

    for  ONE  in  ${ARGS}
     do
         DIR="${BASE}/logs/${ONE}"
         MRK="${DIR}/${RMFILE}"

         if [ -d "${DIR}" ]
            then
                  AUX=`expr ${MINLAP:-0} + 1 2> /dev/null`

                  if [ -f "${MRK}" ]
                     then
                           AUX=`getftime "${MRK}" 2> /dev/null | \
                                awk '{print $3}'`
                           AUX=`expr ${AUX:-0} + 0 2> /dev/null`
                     fi

                  [ ${AUX:-0} -gt ${MINLAP:-0} ] && \
                                                 SERVER="${SERVER} ${ONE}"
            fi
   done
#
#-----------------------------------------------------------------------------
#
    for  ONE  in  ${SERVER}
     do
         DIR="${BASE}/logs/${ONE}"
         REF="${DIR}/${ACC}"
         MRK="${DIR}/${RMFILE}"
         AUX=`expr ${MINLAP:-0} + 1 2> /dev/null`

         if [ -f "${MRK}" ]
            then
                  AUX=`getftime "${MRK}" 2> /dev/null | \
                       awk '{print $3}'`
                  AUX=`expr ${AUX:-0} + 0 2> /dev/null`
            fi


         if [ ${AUX:-0} -gt ${MINLAP:-0} ]
            then
                  cp  -p "${REF}" "${MRK}" 2> /dev/null
                  cat /dev/null > "${MRK}" 2> /dev/null
                  DONE="${DONE} ${ONE}"

                  echo "Rotating Apache web logs for ${ONE}"
                  rotate.files 7 2 "${DIR}/${ACC}"
                  rotate.files 2 2 "${DIR}/${ERR}"
            fi
   done
   kill -HUP `cat "${PID}" 2> /dev/null` > /dev/null 2>&1
#
#-----------------------------------------------------------------------------
#
   if [ ${TODAY} -eq 1 ]
      then
             for  ONE  in  ${DONE}
              do
                  DIR="${BASE}/logs/${ONE}"
                  if [ -d "${DIR}" ]
                     then
                           SRC="${DIR}/${HIST}"
                           SAVED="${DIR}/${ACC}.${YEAR}.${MNAME}"
                           if [ ! -f "${SAVED}" -a -f "${SRC}" ]
                              then
                                    cp -p "${SRC}" "${SAVED}" 2> /dev/null
                                    cat /dev/null > "${SRC}" 2> /dev/null
                              fi
                     fi
            done
      fi
#
#-----------------------------------------------------------------------------
#
    for  ONE  in  ${DONE}
     do
         DIR="${BASE}/logs/${ONE}"
         if [ -d "${DIR}" ]
            then
                  SRC="${DIR}/${ACC}.00"
                  DST="${DIR}/${HIST}"
                  if [ -f "${SRC}" ]
                     then
                        (  if [ ! -f "${DST}" ]
                              then
                                    cp -p "${SRC}" "${DST}"
                                    [ -f "${DST}" ] && cat /dev/null > "${DST}"
                              fi

                           [ -f "${DST}" ] && \
                           cat "${SRC}" 2> /dev/null | gzip -cfq >> "${DST}"
                        )  2> /dev/null
                     fi


                  SRC="${DIR}/${ACC}.00"
                  TMP=`mktemp ${DIR}/${ACC}_aux_`
                  if [ -f "${SRC}" ]
                     then
                        (  rm -f ${DIR}/${ACC}_aux_*
                           cat "${SRC}" 2> /dev/null | gzip -cfq > "${TMP}"
                           touch -r "${SRC}" "${TMP}"
                           [ -f "${TMP}" ] && cat "${TMP}" > "${SRC}"
                           touch -r "${TMP}" "${SRC}"
                           rm -f "${TMP}"
                        )  2> /dev/null
                     fi


                  SRC="${DIR}/${ERR}.00"
                  TMP=`mktemp ${DIR}/${ERR}_aux_`
                  if [ -f "${SRC}" ]
                     then
                        (  rm -f ${DIR}/${ERR}_aux_*
                           cat "${SRC}" 2> /dev/null | gzip -cfq > "${TMP}"
                           touch -r "${SRC}" "${TMP}"
                           [ -f "${TMP}" ] && cat "${TMP}" > "${SRC}"
                           touch -r "${TMP}" "${SRC}"
                           rm -f "${TMP}"
                        )  2> /dev/null
                     fi
            fi
   done
# -----------------------------------------------------------------------------

Nenhum comentário:

Postar um comentário