David Bohm

Hay dos frases que definen mi manera de pensar:
Realmente no hemos prestado mucha atención al pensamiento como un proceso; hemos participado en pensamientos, pero sólo hemos prestado atención al contenido, no al proceso.
La capacidad de percibir o pensar de manera diferente es más importante que el conocimiento adquirido.
Ambas son de David Bohm.

miércoles, 3 de febrero de 2021

Análisis de los errores y logs de un sistema Linux

Cuando hay un problema en un servidor tenemos que tener un procedimiento que nos permita realizar un análisis exhaustivo de forma ordenada y sencilla.

Como ya vimos en una entrada anterior los logs se almacenan en: /var/log

Está claro que ahí tendremos que realizar un recorrido según el problema del que se trate, pero quizás sea interesante empezar por otro lado para coger perspectiva. Veamos algunos comandos que son útiles cuando analizas un sistema y comencemos por analizar a los usuarios, quien está conectado, su historial de conexión, etcétera. Dependiendo de la distribución, quizás sea necesario instalar algún paquete. Si la idea te gusta dejatelo ya instalado previamente por si un día tienes que analizar el sistema.

USUARIOS E INICIO DE SESIÓN

Obtengamos un listado de todos los usuarios del sistema:

   # cat /etc/passwd

Para saber quien está conectado actualmente:

   # who -a

Si queremos ver el historial de los inicios de sesión podemos ejecutar el comando:

   # last -a


Para ver el último inicio de sesión de los usuarios en el sistema:

   # lastlog

Para ver el último reinicio del sistema:

   # last reboot


CPU, MEMORIA, PROCESOS Y RED

Veamos un listado de los procesos del sistema, par ver uso de CPU, memoria, tamaños de cache, procesos con PID, usuarios, etcétera:

   # top

Si este comando te gusta, prueba a instalar htop, tiene caracteristicas y un interfaz mas trabajado.

   # htop

Listado de ficheros abiertos actualmente:

   # lsof

Sobre la red, puertos y paquetes de entrada y salida:

   # netstat -a

En cuanto a los procesos de entrada y salida en disco, podemos ejecutar:

   # iotop

Si quieres obtener estadisticas de utilización del ancho de banda de la red:

   # iftop

Obviamente si necesitamos tener visibilidad y exactitud sobre todo lo que pasa a nivel de paquetes en la red...wireshark es tu aliado, pero eso es otro cantar.

HARDWARE, DISCO DURO Y ESPACIO

Tabla de particiones:

   # fdisk -l

Listado de puntos de montaje con el comando mount:

   # mount -l

Listado de puntos de montaje, sistemas de archivos y su uso:

   # df -aTh

Interesante echar un vistazo a fstab:

   # cat /etc/fstab

NAVEGADOR DE LOGS

Y por último, cuando acabas en el directorio de logs y te enfrentas a tanto archivo, la forma tradicional era hacer un cat o tail por ejemplo:

   # cat /var/log/syslog

Podemos añadir filtros con grep y ver por ejemplo todo lo que contenga la palabra Network:

   # cat /var/log/syslog | grep Network

Con Tail podemos ir mas allá y mantener el fichero abierto y ver en tiempo real que pasa en el log:

   # tail -f /var/log/syslog

Otra herramienta utilizada ultimamente era journalctl del systemd, una herramienta que podemos instalar y utilizar.

Pero un programa muy interesante para tener una perspectiva global de los logs del sistema es lnav. Y creo que combina muy bien todo lo que nos puede ofrecer tail

Dependiendo del sistema debemos instalarlo:

   En distribuciones derivadas de Debian:

      # apt install lnav

   En distribuciones derivadas de Red Hat:

      # yum install epel-release

      # yum install lnav

Al lanzarlo sin especificar el archivo log que quieres consultar, verás como ha navegado en todos los logs del sistema y te presenta un resumen exhaustivo de todo lo que ha pasado, y lo mas importante, de todo lo que está pasando en vivo y en directo.

   # lnav 

Siempre puedes analizar solo una parte de los logs, por ejemplo:

   # lnav /var/log/syslog

O podemos centrarnos en syslog pero para todos los archivos de la rotación de logs:

   # lnav /var/log/syslog*

Lo bueno es que realiza resaltado de sintaxis y esto ayuda mucho a un repaso visual rápido.

Otro punto fuerte es que permite realizar búsquedas como las que realizarías en un vim, por poner un ejemplo cercano en el mundo de la consola. En este ejemplo resaltaría todo lo que contenga la palabra especificada:

   /Network

Nada mas poner el cáracter / lnav muestra una pequeña ayuda en la sintaxis:

   Syntax Help  ::
       .   Any character     a|b  a or b         ^       Start of string
       \w  Word character    a?   0 or 1 a's     $       End of string
       \d  Digit             a*   0 or more a's  (...)   Capture
       \   Escape character  a+   1 or more a's  [ab-d]  Any of a, b, c, or d
   Examples
     abc* matches 'ab', 'abc', 'abccc'
     key=(\w+) matches key=123, key=abc and captures 123 and abc
     \[abc\] matches '[abc]'

Incluso realiza una previsualización en la que puedes ver algunos resultados y como quedaría la búsqueda.

Pero lnav va mucho mas allá, permite realizar búsquedas sql. En la página oficial podemos consultar como hacer esa extracción de datos aquí. Tenemos que comenzar con el carácter ; para entrar en el modo búsqueda. Cuando introducimos el cáracter ; directamente nos muestra una pequeña ayuda:

   Query Help   ::
       SELECT  Select rows from a table       DELETE  Delete rows from a table
       INSERT  Insert rows into a table       UPDATE  Update rows in a table
       CREATE  Create a table/index           DROP    Drop a table/index
       ATTACH  Attach a SQLite database file  DETACH  Detach a SQLite database
   Examples
       SELECT * FROM syslog_log WHERE log_level >= 'warning' LIMIT 10
       UPDATE syslog_log SET log_mark = 1 WHERE log_line = log_top_line()
       SELECT * FROM logline LIMIT 10

Para ver las tablas y campos que podemos consultar debemos lanzar el siguiente comando:

    ;.schema

Ahí veremos todas las tablas virtuales que se generan y los campos a los que podríamos acudir para filtrar la búsqueda.

Por poner algún ejemplo útil, podríamos hacer una consulta sencilla tal y como marca la documentación oficial para ver el resultado:

    ;select * from logline

Herramienta sencilla, fácil de implementar, utilizar y con muchas posibilidades para consultar los logs del sistema.

SaluDOS

No hay comentarios:

Publicar un comentario