.. _rsyslog: Sistema tradicional =================== En este sistema los registros se almacenan bajo :file:`/var/log` a través de una doble vía: #. Los mensajes de algunas aplicaciones se envían a un demonio encargado de procesarlos para que este los escriba en el *log* correspondiente. #. Otras aplicaciones escriben directamente los mensajes en sus propios ficheros de registro (que, por lo general, también están bajo :file:`/var/log`). En los sistemas *debian* este demonio se llama :command:`rsyslog`, que es una variante avanzada del tradicional :command:`syslogd`. El resto del epígrafe se dedicará a describir cómo se clasifican los *logs* y qué hace con ellos el deminio que los gestiona. Clasificación ------------- Es obvio que todos los mensajes ni tienen la misma naturaleza ni tienen la misma gravedad. Por este motivo, cada mensaje es de una determinada *facility* (o sea, de una determinada categoría o naturaleza, si queremos traducir libremente al término inglés) y de un determinado nivel. Según su naturaleza los mensajes pueden ser de los siguientes tipos: .. table:: **Categorías (facility)** ======== ========= ====== ======================================================= Código Término Linux Descripción ======== ========= ====== ======================================================= 0 kern Sí Mensajes del núcleo 1 user Sí Mensajes de procesos de usuario 2 mail Sí Mensajes del sistema de correo 3 daemon Sí Mensajes de los demonios del sistema 4 auth Sí Mensajes de procesos de autenticación\ [#]_ 5 syslog Sí Mensajes del propio sistema de *logs* 6 lpr Sí Mensajes del sistema de impresión 7 news Sí Mensajes del sistema encargado de acceder a USENET\ [#]_ 8 uucp Sí Mensajes relacionados con el antiguo protocolo *UUCP* 9 cron Sí Mensajes de los demonios de planificación de tareas. 10 authpriv Sí Mensajes de procesos de autenticación 11 ftp Sí Mensaje del servicio de FTP. 12 ntp No Mensajes del servicio NTP. 13 logaudit No Mensajes del servicio :ref:`audit `. 14 logalert No log alert 15 clock No Mensajes del demonio del reloj. 16 local0 Sí Uso local (0) 17 local1 Sí Uso local (1) 18 local2 Sí Uso local (2) 19 local3 Sí Uso local (3) 20 local4 Sí Uso local (4) 21 local5 Sí Uso local (5) 22 local6 Sí Uso local (6) 23 local7 Sí Uso local (7) ======== ========= ====== ======================================================= Y según su nivel: .. table:: **Nivel (level)** ======= ======= ============================================================= Valor Término Descripción ======= ======= ============================================================= 0 emerg Aciso de circunstancia que vuelve inservible el sistema. 1 alert Aviso de circunstancia que debe ser inmediatamente subsanada. 2 crit Aviso de error crítico. 3 err Aviso de error. 4 warning Advertencia de que algo puede ir mal o acabar mal. 5 notice Notificación de que ocurre algo anormal. 6 info Notificación de funcionamiento normal. 7 debug Notificaciones para depurar el comportamiento de un programa. ======= ======= ============================================================= Ficheros -------- Bajo :file:`/var/log` hay distintos ficheros: algunos debidos a la activdad de servicios que escriben sus propios registros al margen de :command:`rsyslogd` y otros debidos a la actividad de este. En principio, :command:`rsyslog` registra todos los mensajes en el fichero :command:`/var/log/syslog`, pero mediante su :ref:`configuración ` puede hacerse que los mensajes dependiendo de su categoría y nivel se escriban en uno u otro fichero particular. Lo habitual es lo siguiente: :file:`syslog` Contiene todos los mensajes, excepto los de autenticación. :file:`auth.log` Contiene los mensajes de autenticación. :file:`kern.log` Contiene todos los mensajes del núcleo\ [#]_. :file:`messages` Contiene los mensajes del núcleo de los niveles 4-6 (*warning*, *notice* e *info*). :file:`daemon.log` Contiene los mensajes de la *facility* *daemon*. :file:`mail.log` Contiene todos los mensajes relativos al funcionamiento del servicio de correo. Hay otros, :file:`mail.info`, :file:`mail.err` y :file:`mail.warn` que almacenan su *facility* correspondiente. :file:`user.log` Contiene todos los mensajes de las aplicaciones de usuario. :file:`lpr.log` Contiene todos los mensajes referentes al servicio de impresión. Esta es la configuración pretederminada en *debian*. El resto de ficheros que encontramos, bien se debe a que se haya alterado esta configuración, bien a que haya otros servicios que registren por su cuenta. Dentro de :file:`/var/log` y entre los ficheros que no gestiona *rsyslog*, se cuentan: :file:`btmp` Que registra los accesos fallidos al sistema. :file:`wtmp` Que registra los accesos al sistema. .. index:: utmpdump Estos ficheros, a diferencia de los restantes, tienen un formato binario y pueden leerse a través del comando :command:`utmpdump`:: # utmpdump /var/log/btmp | more .. _rsyslog.conf: Consulta -------- Los registros son ficheros de texto plano de modo que el acceso a los mensajes se puede realizar con cualquier orden que permite acceder a su contenido. El simple :ref:`cat ` (o :ref:`more ` o :ref:`less `, si se quiere paginar) sirve para este propósito. Sin embargo, estos ficheros suelen contener gran cantidad de mensajes de distintos servicios, por lo que lo más adecuado es buscar herramientas que nos permitan filtrar mediante el uso de expresiones regulares. Para esta labor de filtrado, conviene conocer cuál es el formato que el demonio da a estos mensajes. Tal formato se puede configurar al gusto, pero *rsyslog* tiene configuradas algunas plantillas de las cuales la predefinida en *debian* es :var:`RSYSLOG_TradicionalFileFormat`, que presenta el siguiente aspecto:: []: Cuando filtramos, necesitamos conocer cuál es el fichero adecuado y cuál es el conjunto de mensajes que deseamos ver. Por ejemplo, si nuestra intención fuera mirar los mensajes que genera el servidor *DHCP*, podríamos filtrar del siguiente modo:: # egrep '\bdhcpd\b' /var/log/syslog | more La información que obtenemos de los registros puede ser muy precisa: basta con ser capaz de formar la expresión regular adecuada. Por ejemplo, todas las IP que ha concedido el servidor DHCP podrían mostrarse de esta forma:: $ sed -r '/\bdhcpd\b.*DHCPACK on/!d ; s:.*DHCPACK on ([^ ]+).*:\1:' /var/log/syslog | sort | uniq Aunque hay que tener cierto espíritu crítico con lo obtenido. Saldrán en este listado todas las IPs concedidas desde que se empezó a escribir el fichero, con lo que el listado puede no coincidir en absoluto con direcciones IP ocupadas. Configuración ------------- .. _logger: .. note:: Para hacer probaturas es muy útil el :index:`comando ` :command:`logger` que permite enviar al demonio mensajes de la categoría y nivel que indiquemos:: $ logger -p mail.info -s "Esto es un mensaje manual que escribo yo" El demonio lee su configuración del fichero :file:`/etc/rsyslog.conf`. Sin embargo, puede tener una directiva *IncludeConfig* que permite leer el contenido de otros ficheros, de suerte que es común que también exista un directorio :file:`/etc/rsyslog.d`, en el que incluir configuración adicional de forma modular. Otro aspecto a tener en cuenta en la definición de este fichero es que desde la versión *6*, hay dos sintaxis para el fichero, la tradicional y una nueva. Tradicional """"""""""" Existen tres tipos de líneas: * Los comentarios, que todas aquellas líneas que empiezan por un asterisco. * Las directivas que empiezan por un dolar. * Las reglas que permiten indicar qué hacer con cada mensaje. Directivas '''''''''' Hay de muy diversos tipos. Algunas muy útiles son: #. Hacer escuchar al demonio en un *socket* adicional (útil cuando tenemos demonios enjaulados):: $AddUnixListenSocket /var/spool/postfix/dev/log #. Define el propietario y los permisos de los ficheros (y directorios) que puedan crear las *acciones*:: # Definimos esta máscara inicial para que # los permisos definidos a continuación sean # los que expresamente indicamos. $Umask 0000 $FileOwner root $FileGroup adm $FileCreateMode 0640 $DirCreateMode 0755 Estas directivas afectan a todas las acciones que tengan por debajo. Pueden volver a definirse más adelante otra vez y, en ese caso, afectarán a las *acciones* que se añadan a continuación. Por ejemplo:: $FileCreateMode 0640 *.* /var/log/log1 $FileCreateMode 0644 *.* /var/log/log2 :file:`log1` se creará con permisos *0640* y :file:`log2` con permisos *0644*. #. Cargar los ficheros contenidos en :file:`/etc/rsyslog.d`:: $IncludeConfig /etc/rsyslog.d/*.conf #. Define una plantilla predeterminada para el formato de línea de los ficheros:: $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat Reglas '''''' Las reglas indican qué se hará con cada mensaje. Cada regla consta de dos partes: el :dfn:`selector`, que indica a qué mensajes afecta; y la :dfn:`acción`, qeu indica qué hacer (habitualmente, escribirlos en un fichero de registro bajo :file:`/var/log`. Para seleccionar mensajes se usan la categoría y el nivel: * Todos los mensajes:: *.* * Todos los mensajes de nivel *info*:: *.=info * Todos los mensajes hasta el nivel *info* (es decir, que sólo quedan fuera los de nivel debug*):: *.info * Todos los mensajes de la categoría *mail*:: mail.* * Los mensajes de la categoría *mail* y la prioridad *info*:: mail.=info * Todos los mensajes de las categorías *mail* y *news*:: mail,news.* * Los mensajes de las categorías *mail* y *news* hasta *notice*:: mail,news.notice * Los mensajes de la categoría *mail* y nivel *info*, y de la categoría *news* y nivel *err*:: mail.info;news.=err Este último ejemplo muestra como hacer la unión de dos selectores independientes: separarlos con punto y coma. Ahora bien hay forma también de hacer la diferencia entre dos selectores. Para ello hay que seleccionar primero un conjunto de mensajes y, tras el punto y coma, seleccionar otro conjunto que lo contiene, añadiendo a la parte correspondiente al nivel la exclamación (``!``) o el nivel especial *none*, que implica que se desechan todos los mensajes de la categoría: * Todos los mensajes exceptos los de *authpriv* y *auth*:: *.*;auth,authpriv.none * Todos los mensajes, excepto los de la depuración:: *.*;*.!=debug * Todos los mensajes, excepto los de *news* hay que estén entre el nivel *emerg* al nivel *warning*:: *.*;*.!warning Por su parte la acción, si lo que se quiere es enviar los ficheros exige escribir la ruta absoluta. Una regla completa quedaría pues así:: auth,authpriv.* /var/log/auth.log A veces se encuentra antepuesto un signo menos (``-``) a la ruta. Esto indicaba que se quería deshabilitar la sincronización del fichero en cada escritura. En las versiones modernas de *rsyslog* la sincronización está deshabilitada por defecto, con lo que el signo, no tiene ninguna relevancia. Es importante tener presente que el hecho de que un mensaje se seleccione en una regla, no significa que el demonio ejecute la acción y deje de probar las reglas siguientes. Por ejemplo, las líneas:: auth,authpriv.* /var/log/auth.log *.* /var/log/syslog provocarían que los mensajes relacionados con la autenticación se escribieran también en :file:`/var/sys/log`. Ahora bien, si se usa como acción la virgulilla (``~``), entonces sí se desechan los mensajes:: auth,authpriv.* /var/log/auth.log auth,authoriv.* ~ *.* /var/log/syslog Sí impediría que se escribieran los mensajes en el segundo registro (y en todos los que se mentaran sucesivamente). Además, se puede sustituir el selector por el ampersand (``&``), lo que significa que para la nueva acción se usará el mismo selector que para la anterior. las siguientes líneas tienen el mismo efecto que las anteriores:: auth,authpriv.* /var/log/auth.log & ~ *.* /var/log/syslog Por último, para usar un formato de línea distinto en un fichero en particular puede usarse la siguiente sintaxis:: auth,authpriv.* /var/log/auth.log;RSYSLOG_TraditionalFileFormat .. todo:: Filtros más complejos .. https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/s1-basic_configuration_of_rsyslog.html Nuevo formato ''''''''''''' A partir de su versión 6, *rsyslog* usa un nuevo formato (*RainerScript*) para escribir su configuración, aunque se puede seguir usando el antiguo e incluso incluir sentencias de uno u otro estilo dentro del mismo fichero. .. todo:: Escribir una pequeña guía al respecto. .. _logrotate: .. index:: logrotate Rotación -------- Los registros dentro de :file:`/var/log` son persistentes, de manera que crecen indefinidamente, a menos que pongamos los medios para evitarlo. Con este propósito existe el servicio :command:`logrotate`. La :dfn:`rotación de logs` consiste en copiar cada cierto tiempo los registros antiguos a otro fichero y vaciar el fichero de registro. Por ejemplo, supongamos que definimos que todos los días se realiza esta rotación. En ese caso ocurrirá lo siguiente: * El primer día tendremos un único fichero :file:`syslog`. * El segundo día tendremos dos ficheros :file:`syslog.1`, que contendrá los registros del día anterior; y :file:`syslog`, sin estos registros, empezará a recoger los del día presente. * El tercer día, se comprimirá y renombrará :file:`syslog.1` a :file:`syslog.2.gz`, el contenido de :file:`syslog` pasará a :file:`syslog.1` y, una vez vaciado :file:`syslog` se comenzará a registrar en él. * El proceso antes descrito se repite todos los días, de manera que cada vez aparecen más ficheros que almacenan registros antiguos de :file:`syslog`. Sin embargo, al programa de *rotación* se le puede indicar un límite máximo de manera que, pasado este, se desecharán los registros. Si este límite fueran diez días, entonces nunca se llegaría a crear :file:`syslog.10.gz`. :command:`logrotate` no es un demonio que se ejecute permanentemente en el ordenador, sino que en :file:`/etc/cron.daily` hay un *script* que lo invoca a diario. Su configuración se hace en :file:`/etc/logrotate.conf` o, de forma modular, en ficheros creados dentro de :file:`/etc/logrotate.d`. En :file:`logrotate.conf` suele guardarse la configuración predeterminada para la rotación, mientras que en cada fichero de file:`/etc/logrotate.d` se guarda la configuración particular para un registro que no queremos que siga la predeterminada. Es bastante común que los paquetes de aplicaciones que generan *logs* incluyan un fichero particular para los suyos propios. En :file:`/etc/logrotate.conf` podríamos encontrar el siguiente contenido:: # Rotación semanal weekly # Conserva 4 semanas rotate 4 # Compresión (con xz, pero no se comprime por defecto) #compress compresscmd /usr/bin/xz compressext .xz # Ficheros de configuración modular: include /etc/logrotate.d # Rotación para los ficheros wtmp y btmp # [...] La rotación de los registros de cada servicio es probable que la encontremos en un fichero propio dentro de :file:`/etc/logrotate.d`. Por ejemplo:: # /etc/logrotate.d/apt /var/log/apt/*.log { rotate 12 monthly compress notifempty } En este ejemplo, cualquier fichero *log* dentro de :file:`/var/log/apt`, queremos que rote mensualmente (*monthly*), que se compriman los registros rotados, y que si el fichero de log está vacío, no se realice rotación (*notifempty*). Algunas de las directivas que podemos incluir son las siguientes: :code:`hourly`, :code:`daily`, :code:`weekly`, :code:`monthly`, :code:`yearly` Frecuencia con la que se realizará la rotación. :code:`copytruncate` En vez de mover el fichero y crear uno nuevo, hace copia y trunca a 0. Con esto se consigue que el fichero en el que el servicio apunta los registros sea el mismo, lo cual es necesario si el servicio está activo en todo momento y no podemos reiniciarlo. :code:`create` Indica cómo crear el nuevo fichero después de haber movido el anterior:: create 0640 root adm :code:`delaycompress` Retrasa un ciclo la compresión. Esto hace que la rotación *.1* no esté comprimida. :code:`maxsize` Tamaño máximo en bytes que puede alcanzar el registro. Si lo alcanza, se rotará el fichero, aunque no se haya cumplido la frencuencia. Pueden usarse las unidades *k*, *M* o *G*:: maxsize 1M :code:`minsize` Tamaño mínimo en bytes a partir del cual se procederá a la rotación. Si no se ha llegado a este tamaño, no se rotará, aunque toque según la frecuencia. :code:`size` Tamaño a partir del cual se procederá a la rotación. La diferencia con *maxsize* es que con esta opción no se atiende a la frecuencia en absoluto. :code:`missingok` Si no existe el fichero *log* no se produce ningún error. :code:`rotate` N Número de rotaciones que sufren los registros. :code:`prerotate`/:code:`endscript` Ejecuta las órdenes entre estas dos directivas antes de proceder a la rotación. :code:`postrotate`/:code:`endscript` Ejecuta las órdenes entre estas dos directivas tras realizar a la rotación:: postrotate invoke-rc.d nginx rotate >/dev/null 2>&1 endscript :code:`sharedscripts` Está relacionado con las dos directivas anteriores. Cuando se incluye, no ejecuta los comandos para la rotación de cada fichero, sino una sola vez para todos los ficheros que se han expresado en el bloque. .. note:: Es preciso indicar explícitamente a través de la configuración que se quiere rotar un fichero de registro. Dicho de otro modo, :command:`logrotate` no rota cualquier fichero que se encuentre bajo :file:`/var/log`, sino sólo aquellos explicitamente citados en su configuración. .. rubric:: Notas al pie .. [#] Citado en la página de manual de *syslog*. .. [#] Hay otra categoría, *authpriv*, para mensajes de este mismo tipo. La página de manual de *syslog* indica que se desaprueba el uso de *auth* en favor de *authpriv*. .. [#] `USENET `_ ha ido en los últimos años reduciendo significativamente su tráfico ante el empuje de la web (los foros ocupan su mismo nicho de servicio). Pero hemos de tener en cuenta que todo este sistema que se explica se ideó a principio de los años 80. .. [#] Los mensajes del núcleo también pueden ser revisados gracias al index:`comando ` :command:`dmesg`:: # dmesg En Jessie_, la consulta con :command:`dmesg` puede realizarla cualquier usuario. Sin embargo, en Stretch_ requerirá los permisos de *root*. Otro aspecto a tener en cuenta es que :command:`dmesg` puede no mostrar todos los mensajes desde el arranque, ya que lo que hace es leer del *buffer* circular del núcleo. Como todo *búffer* circular, tiene un tamaño fijo, de manera que al llenarse por completo, comienza a reescribir las primeras entradas. Para ver todos los mensajes hay que recurrir a la lectura de :file:`/var/log/kern.log`, que, además, al ser persistente, podrá contener mensajes de arranques anteriores.