¿Hay una manera adecuada de borrar registros?

65

Me preguntaba si había una manera adecuada de borrar registros en general.

Soy nuevo en Ubuntu y estoy tratando de configurar Postfix. La pregunta de inicio de sesión es /var/log/mail.log. Me preguntaba si había una forma correcta de borrarlo, en lugar de que yo entrara y eliminara todas las líneas y lo guardara. Me parece que a veces los errores no se escriben inmediatamente después de borrar el registro y guardarlo.

Nota al margen: Tengo problemas para configurar Postfix y estoy tratando de facilitarme la lectura de los registros con la esperanza de que pueda ayudarme, en lugar de tener que desplazarme hacia abajo.

mastofact
fuente
2
si solo quieres ver el final del archivo, entonces tail es tu amigo. tail /var/log/mail.log para mostrar las últimas 5 líneas. tail -f /var/log/mail.log para ver todas las líneas escritas al final del archivo.
user9517 es compatible con GoFundMonica el

Respuestas:

79

Puedes usar:

> /var/log/mail.log

Eso truncará el registro sin que tenga que editar el archivo. También es una forma confiable de recuperar el espacio. A veces, las personas cometen el error de usar rm en el registro y luego recrear el nombre de archivo, si otro proceso tiene el archivo abierto, entonces no recuperas el espacio hasta que ese proceso cierra su control y puedes desordenar sus permisos.

Además, si está viendo el contenido del registro, puede usar el tailcomando:

tail -f /var/log/mail.log

Ctrl-C romperá la cola.

davey
fuente
2
/bin/csh(común para FreeBSD) rescataría esto con un "comando nulo inválido", mientras que zsh(reemplazo popular para bash) esperaría EOF. Ver serverfault.com/a/381380/67675
poige
¿Cómo puedo programarlo? poner la >sintaxis en crontab no se está ejecutando, ya que puede que no se reconozca como una sintaxis
ishandutta2007
26

Sí, hay una manera adecuada: no borras registros en absoluto. Los giras . La rotación implica cambiar la salida del registro a un nuevo archivo, con el mismo nombre, con los N archivos de registro anteriores guardados bajo un conjunto de N nombres de archivos relacionados.

La forma en que uno rota los registros depende de cómo se están escribiendo en primer lugar. Este es un punto que a menudo se pasa por alto. Algunas de las respuestas aquí tocan al menos, mencionando que algunos programas de registro mantienen un descriptor de archivo abierto para el archivo de registro, por lo que solo eliminar el archivo no liberará espacio, o incluso cambiará la salida a un archivo de registro nuevo.

Si el programa que escribe el archivo de registro es multilogdel daemontoolspaquete , por ejemplo, entonces no hace nada para rotar los registros en absoluto: sin scripts manuales, sin crontrabajos. Simplemente diga multilogque la salida del registro es a un directorio, y mantendrá un conjunto de N archivos de registro rotados automáticamente y con un tamaño limitado en ese directorio.

Si el programa que escribe los archivos de registro es svlogddel runitpaquete , para otro ejemplo, entonces se aplica lo mismo. No hace nada aparte de apuntar la herramienta a un directorio. En sí mismo mantendrá un conjunto de N archivos de registro rotados automáticamente y con límite de tamaño en ese directorio.

Si está utilizando rsyslogpara escribir archivos de registro, entonces se le puede decir al programa de registro que se detenga después de que el archivo de registro alcance un cierto tamaño y ejecute un script . Debe escribir el meollo de la secuencia de comandos, para cambiar el nombre del archivo de registro y eliminar los archivos de registro antiguos en función de las restricciones de tamaño total, pero al menos el programa de registro ha cerrado el archivo y pausó la escritura del registro mientras esto sucede.

La antigua syslogdforma de rotar los registros, aún esperada por los programas de registro como syslog-ng y como lo ejemplifican las herramientas como se logrotatemenciona djangofanen otra respuesta aquí, es algo más azarosa. Uno ejecuta un crontrabajo que periódicamente renombra los archivos de registro y reinicia el demonio de registro (utilizando cualquier supervisor de demonio con el que se esté ejecutando). El problema con esto, por supuesto, es que no impone un límite de tamaño general. En las semanas lentas se pueden obtener N archivos de registro diarios muy pequeños, mientras que en los días ocupados se puede obtener 1 archivo de registro muy grande que está muy por encima del límite de tamaño.

Es por eso que más tarde y mejores herramientas tienen multilogy svlogdtienen opciones de configuración de tamaño de archivo y, de hecho, verifican los tamaños de archivo de registro. El mundo ha aprendido que sondear los registros en un horario con crontrabajos, o incluso un logrotatedemonio, deja ventanas para que el tamaño sea incorrecto, y que el lugar adecuado para realizar estos controles, y de manera rigurosa imponga límites de tamaño definidos por el administrador para que uno los archivos de registro nunca se tragan la partición en la que se encuentran, está en el programa que en realidad está escribiendo los archivos en primer lugar.

JdeBP
fuente
En cuanto a rsyslog, se puede configurar fácilmente para confiar en los nombres de archivo descritos por un "patrón" que incluye, por ejemplo, AÑO, MES y DÍA. Esto es tan fácil como tener una template(name="DYNmail" type="string" string="/var/log/%$YEAR%/%$MONTH%/%$DAY%/mail.log")directiva, seguida de a if ($syslogfacility-text == 'mail') then -?DYNmail;TraditionalFormat. De esta manera, la rotación de registros simplemente no es un problema, al menos cuando un solo archivo por día está bien. Para volúmenes muy altos de registro (que necesitan rotación múltiple por día), también existe $HOUR.
Damiano Verzulli 01 de
13

Puedes usar esto también ...

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

Aquí todos los archivos de registro en / opt / package / logs quedarán vacíos.

Yasar
fuente
No veo cómo esto podría ser mejor que las respuestas anteriores.
kasperd
44
Esta es realmente una muy buena respuesta, y realmente la única que responde directamente a la pregunta de si hay una manera adecuada de truncar los archivos de registro. CÓMO es mejor que las otras respuestas es que no ELIMINA el archivo de registro, pone a cero el contenido correctamente, por lo tanto, los errores de permiso y los archivos de registro faltantes que causan el pánico de algunos demonios no ocurrirán en este caso.
hmedia1
11

Sí, hay una herramienta para Linux llamada LogRotate .

djangofan
fuente
99
Solo una pequeña corrección: esto no es un servicio, es una herramienta, que generalmente se ejecuta desde el servicio cron.
rvs
10

Si la razón por la que borra el registro es para liberar espacio, puede usar cat / dev / null para ellos, sin interrumpir los programas que se escriben en él. ¡Nunca los elimines! algunos programas pueden quejarse al dejar de funcionar o ignorar el registro por completo hasta el próximo reinicio

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
Elvis
fuente
3
Para borrar archivos de registro de forma recursiva:for i in $(find /var/log -type f); do cat /dev/null > $i; done
Iurie Malai
4

Sobreescritura de contenido breve y compatible: : > /dest/file

Pero también hay una llamada de sistema truncada (2) y la herramienta de espacio de usuario correspondiente truncateen muchos * NIX'es.

poige
fuente
1

Si desea conservar el archivo antes de limpiarlo, puede hacer lo siguiente:

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

Si desea buscar un texto o correo electrónico específico en el registro, puede usar grep. Si desea conservar algunos gráficos sobre el uso del correo, puede usar AWStats.

ghm1014
fuente
1

Así es como lo hago, y esto es solo para NGINX, puede eliminarlo para que funcione en todos los archivos de registro.

# 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 ... ---------------"
}
Ahmad Awais
fuente
-2

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

Funciona para mi

Carlos Gallardo I.
fuente