LPIC-1 Tema 108.2: registros del sistema
Nueva entrada sobre las certificaciones del Linux Professional Institute. Esta vez sobre el tema 108.2 para la preparación de los exámenes LPIC-1. Este tema está dedicado a los registros del sistema, los famosos logs de GNU/Linux que aportan información muy valiosa para el administrador.
Las preguntas sobre este tema irán destinadas a comprobar las competencias básicas que tiene el futuro aspirante a administrador de sistemas sobre configuración de los registros, tanto con el sistema clásico como con systemd, así como manejar algunas herramientas para operar sobre los registros, consultarlos, rotarlos, etc.
ÍNDICE:
Ficheros
Como sabrás, los logs o registros de Linux los encuentras en el directorio /var/log. Allí se almacenan todos ellos, con algunos directorios específicos para ciertos programas y ficheros generales del sistema. Ya sabes que en los sistemas con Sys-V init son ficheros de texto plano, pero con systemd eso ha cambiado y son binarios, por lo que necesitas herramientas específicas para verlos…
En esos ficheros se almacena gran cantidad de información muy valiosa. Por ejemplo, los usuarios que han iniciado sesión en el sistema, los intentos de logging, errores, o alertas de programas, etc. Por tanto, pueden servirte para identificar el origen de los problemas en tu sistema.
Además de conocer dónde se almacenan estos logs, también deberías conocer otros ficheros importantes…
/etc/rsyslog.conf
rsyslog es una utilidad de software usada en sistemas UNIX y Unix-like para reenviar mensajes de registro en una red IP. Existen alternativas para este programa, pero en estas certificaciones es el que se necesita conocer…
Pues bien, para la configuración de rsyslog existe este fichero. Si lo examinas con el concatenador o con tu editor de texto favorito, verás que hay varias lineas que comienzan por # que son ignoradas, ya que son comentarios. Pero hay algunas otras interesantes:
- kern.* indica todos los mensajes del kernel, independientemente de la severidad que sean.
- *.info;mail.none;authpriv.none;cron.none los marcados con estas designaciones son mensajes de información (de cualquier programa), de origen mail (/var/log/maillog), authpriv (de autenticación privada y almacenados en /var/log/secure), y cron (/var/log/cron) respectivamente.
- Reglas: ya sabes que existen varios tipos o niveles de errores, como debug , info , notice , warning , warn , err , error , crit , alert , emerg y panic. Es decir, para mensajes de depuración, información, noticias, advertencias, errores, críticos, alertas, emergencias y kernel panic.
Por ejemplo, aquí te explico dos líneas que he comentado:
#Todos los mensajes de local2 sin importar severidad, serán almacenados en /var/log/boot.log local2.* /var/log/boot.log #Solo los mensajes de nivel igual o de severidad mayor a warn se almacenarán en /var/log/mi.log local8.*warn /var/log/mi.log
/etc/logrotate.conf y /etc/logrotate.d/
El primero es el fichero de configuración, mientras que el segundo es un directorio con ficheros de configuración en su interior. Todos ellos relacionados con la herramienta logrotate, es decir, para hacer la rotación de registros como verás más adelante.
- /etc/logrotate.conf fichero que contiene algunas configuraciones predeterminadas sobre la rotación de algunos logs o registros propiedad del sistema. Si lo examinas verás que usa la sentencia include para obtener la configuración de cualquier fichero que se encuentre dentro del siguiente directorio… Por cierto, recuerda que si un paquete o herramienta que necesita registrar logs no tiene un bloque de configuración específica, entonces tomará la configuración predeterminada de este fichero por defecto.
- /etc/logrotate.d/ es un directorio donde se colocan las configuraciones de logrotate de los paquetes instalados en el sistema. Por ejemplo, aquí se configurarán registros de programas como rsyslog, dpkg, apt, rpm, zypper, etc. Si eres root o tienes privilegios, también podrás crear tus ficheros de configuración aquí.
Por ejemplo, imagina que tienes este segmento de configuración para la herramienta APT en un fichero apt.conf dentro del directorio anterior:
#APT output /var/log/apt/term.log { rotate 12 monthly compress missingok notifempty } /var/log/apt/history.log { rotate 12 monthly compress missingok notifempty }
Esto hace que el gestor de paquetes APT no tenga que usar la configuración predeterminada de logrotate.conf, sino que tenga la suya propia. Concretamente apunta a /var/log/apt/term.log y a history.log. Ambos con idénticas opciones:
- rotate 12 indica que mantendrá 12 archivos de registros de antigüedad. Más de esos serán eliminados. Esto podría ser bueno para buscar entradas registradas hace tiempo, pero restará espacio a tu almacenamiento.
- weekly indica que se tienen que rotar una vez a la semana.
- compress para que comprima los ficheros rotados. Así ocuparán menos. Por defecto usa gzip, generando un .gz, pero lo puedes modificar con la opción compresscmd.
- missingok no mostrará mensajes de error si el registro en cuestión no existiera.
- notifempty no hará la rotación si el log está vacío.
Existen muchas más opciones disponibles, puedes saber más con:
man logrotate
/var/log/journal y /etc/systemd/journald.conf
Ya sabrás que en los nuevos sistemas con systemd, el journal se escribe en /var/log/journal. Además, tienes otros ficheros de configuración como /etc/systemd/journald.conf para configurar éste. En él se configuran algunos parámetros para el servicio de diario systemd-journal.service.
Su configuración y parámetros es similar a las anteriores. Para más información puedes consultar el manual:
man systemd-journald.service
Herramientas
Por último, deberías conocer estas herramientas básicas para gestionar los registros del sistema:
logger
rsyslog se ha transformando casi en un estándar en las distros, y con logger podrás enviar mensajes personalizados a él. Su uso es bastante sencillo, permitiendo agregar entradas al registro de una forma simple y rápida:
#Prueba logger "¡Hola mundo!" #Evitar que el nombre de programa coincida con el de usuario logger -t programa-prueba "Esto es una prueba" #Enviar mensajes de programas específicos logger -p prueba.notice "Este es un mensaje de ejemplo" logger -p local4.warn "Esta es una advertencia"
Si miras los registros, verás que aparecen…
logrotate
Para evitar logs o registros enormes, se irán rotando según las políticas de rotación configuradas en los ficheros que mostré anteriormente. Por ejemplo, con logrotate se puede forzar el rotado de un registro:
#Forzar rotación de gunicorn logrotate -f /etc/logrotate.d/gunicorn
journalctl
Con systemd, para consultar los ficheros de los registros con el concatenador o con un editor de texto plano no es una opción. Son binarios y lo único que verás serán símbolos incomprensibles. Pero existe una herramienta específica para poder consultarlos y esa es journalctl. Por ejemplo:
#Mostrar todo journalctl #Mostrar todos los menajes registrados por la unidad del servicio SSH journalctl _SYSTEMD_UNIT=sshd.service #No solo mostrará mensajes de registro de la unidad SSH, también mensajes sobre SSH journalctl -u sshd.service #Muestra cualquier mensaje con nivel error journalctl -p err #Muestra mensajes que tengan del nivel emergencia hasta error journalctl -p emerg..err #Mostrar cualquier mensaje de arranque journalctl -b #Listar los arranques disponibles para consultar journalctl --list-boots #Muestra mensajes del primer arranque journalctl -b -1 #Mostrar solo mensajes registrados entre unas fechas concretas journalctl --since "2013-02-02 20:30:00" --until "2020-03-31 12:00:00" #Por rangos de horas o días journalctl --since "2 days ago" journalctl --since "1 hour ago" #Mostrar solo los 50 últimos mensajes registrados journalctl -n 50 #Más información man journalctl
systemd-cat
Por último, deberías conocer systemd-cat, es un programa capaz de conectar la entrada y salida estándar de los programas con journal. Es muy práctico para scripts donde quieras que registren ciertos mensajes en los registros. También puede servir para otras aplicaciones que no tienen soporte journalctl nativo y quieras que envíen logs por la salida estándar.
Usarlo en scripts o comandos es muy sencillo, por ejemplo, imagina que quieres mandar la salida de un echo a journal:
#Enviar mensaje echo "Mensaje de prueba" | systemd-cat #Agregar un nivel echo "Otra prueba" | systemd-cat -p warning