Simplificado, es más o menos así:
El kernel registra los mensajes (usando la printk()
función) en un buffer de anillo en el espacio del kernel. Estos mensajes están disponibles para las aplicaciones de espacio de usuario de dos maneras: a través del /proc/kmsg
archivo (siempre que /proc
esté montado) y a través de sys_syslog
syscall.
Hay dos aplicaciones principales que leen (y, hasta cierto punto, pueden controlar) el búfer en anillo del núcleo: dmesg(1)
y klogd(8)
. El primero está destinado a ser ejecutado a pedido por los usuarios, para imprimir el contenido del búfer en anillo. Este último es un demonio que lee los mensajes /proc/kmsg
(o llamadas sys_syslog
, si /proc
no está montado) y los envía a syslogd(8)
, o a la consola. Eso cubre el lado del núcleo.
En el espacio del usuario, hay syslogd(8)
. Este es un demonio que escucha en varios zócalos de dominio UNIX (principalmente /dev/log
, pero también se pueden configurar otros), y opcionalmente en el puerto UDP 514 para mensajes. También recibe mensajes de klogd(8)
( syslogd(8)
no le importa /proc/kmsg
). Luego escribe estos mensajes en algunos archivos /log
, o en canalizaciones con nombre, o los envía a algunos hosts remotos (a través del syslog
protocolo, en el puerto UDP 514), como está configurado en /etc/syslog.conf
.
Las aplicaciones de espacio de usuario normalmente usan la libc
función syslog(3)
para registrar mensajes. libc
envía estos mensajes al socket de dominio UNIX /dev/log
(donde son leídos syslogd(8)
), pero si una aplicación es chroot(2)
-ed, los mensajes podrían terminar siendo escritos en otros sockets, fi /var/named/dev/log
. Por supuesto, es esencial para las aplicaciones que envían estos registros y syslogd(8)
acordar la ubicación de estos sockets. Por esta razón, syslogd(8)
se puede configurar para escuchar tomas adicionales aparte del estándar /dev/log
.
Finalmente, el syslog
protocolo es solo un protocolo de datagrama. Nada impide que una aplicación envíe datagramas de syslog a cualquier socket de dominio UNIX (siempre que sus credenciales le permitan abrir el socket), omitiendo la syslog(3)
función por libc
completo. Si los datagramas están formateados correctamente, syslogd(8)
puede usarlos como si los mensajes se hubieran enviado syslog(3)
.
Por supuesto, lo anterior cubre solo la teoría de tala "clásica". Otros demonios (como rsyslog
y syslog-ng
, como usted menciona) pueden reemplazar el plano syslogd(8)
y hacer todo tipo de cosas ingeniosas, como enviar mensajes a hosts remotos a través de conexiones TCP encriptadas, proporcionar marcas de tiempo de alta resolución, etc. Y también hay systemd
, que está fagocitando lentamente la parte UNIX de Linux. systemd
tiene sus propios mecanismos de registro, pero esa historia tendría que ser contada por otra persona. :)
Diferencias con el mundo * BSD:
En * BSD no existe klogd(8)
, y /proc
no existe (en OpenBSD) o es en su mayoría obsoleto (en FreeBSD y NetBSD). syslogd(8)
lee los mensajes del núcleo del dispositivo de caracteres /dev/klog
y los dmesg(1)
utiliza /dev/kmem
para decodificar los nombres del núcleo. Solo OpenBSD tiene un /dev/log
. FreeBSD usa dos sockets de dominio UNIX /var/run/log
y var/rub/logpriv
, en cambio, NetBSD tiene un /var/run/log
.
rsyslog
no lo usaklogd(8)
porque sus raíces se remontan, no porque recientemente haya tomado una decisión explícita de eliminarlo. Sin embargo, mi memoria puede estar fallando. De todos modos, como dije, solo estaba tratando de cubrir el registro "clásico".rsyslogd
ejecución y un Ubuntu 12.04 consyslog-ng
ejecución y ambos tenían el archivo/proc/kmsg
abierto de acuerdolsof
, es decir,klogd
no se usaba. Otra cosa interesante que noté es que los mensajes de registro se almacenan en un/proc/kmsg
archivo si no se está ejecutando un demonio syslog y uno puede verlos con, por ejemplo,cat
o editor de texto. Sin embargo, solo es posible ver esos mensajes una vez porque desaparecen después de verlos. Por último, pero no menos importante, la ejecucióndmesg
no borra el contenido del/proc/kmsg
archivo./proc/kmsg
no es un archivo normal, no hay nada "almacenado" allí, sino que es solo una vista del búfer de anillo del núcleo. Puede leerlocat
precisamente porque no tieneklogd(8)
ejecución (si ejecutaklogd(8)
,cat /proc/kmsg
bloquearía).dmesg(1)
lee mensajes de en/dev/kmsg
lugar de/proc/kmsg
; y también puede borrar el búfer si se lo indica.systemd has its own logging mechanisms, but that story would have to be told by somebody else. :)
- Por favor, dices, tienes talento :-)La otra respuesta explica, como dice su autor, "registro clásico" en Linux. Así no es como funcionan las cosas en muchos sistemas hoy en día.
El núcleo
Los mecanismos del kernel han cambiado.
El kernel genera salida a un búfer en memoria. Los softwares de aplicación pueden acceder a esto de dos maneras. El subsistema de registro generalmente accede a él como un pseudo-FIFO llamado
/proc/kmsg
. Esta fuente de información de registro no se puede compartir útilmente entre los lectores de registro, ya que es de lectura única. Si varios procesos lo comparten, cada uno obtiene solo una parte de la secuencia de datos de registro del kernel. También es de solo lectura.La otra forma de acceder es el
/dev/kmsg
dispositivo de caracteres más nuevo . Esta es una interfaz de lectura y escritura que se puede compartir entre múltiples procesos de clientes. Si varios procesos lo comparten, todos leen el mismo flujo de datos completo, sin verse afectados entre sí. Si lo abren para acceso de escritura, también pueden inyectar mensajes en la secuencia de registro del núcleo, como si fueran generados por el núcleo./proc/kmsg
y/dev/kmsg
proporcionar datos de registro en un formulario que no sea RFC-5424.Aplicaciones
Las aplicaciones han cambiado.
La
syslog()
función de la biblioteca GNU C en los intentos principales de conectarse a unAF_LOCAL
socket de datagrama llamado/dev/log
y escribir entradas de registro en él. (Lasyslog()
función de la biblioteca BSD C hoy en día se usa/var/run/log
como el nombre del socket, e intenta/var/run/logpriv
primero). Las aplicaciones pueden, por supuesto, tener su propio código para hacerlo directamente. La función de biblioteca es solo código (para abrir, conectar, escribir y cerrar un socket) ejecutándose en el contexto del proceso de la aplicación, después de todo.Las aplicaciones también pueden enviar mensajes RFC 5424 a través de UDP a un servidor RFC 5426 local, si uno está escuchando en un zócalo
AF_INET
/AF_INET6
datagrama en la máquina.Gracias a la presión del mundo de daemontools en las últimas dos décadas, muchos demonios admiten la ejecución en un modo en el que no utilizan la
syslog()
función de biblioteca GNU C o los sockets UDP, sino que simplemente escupen sus datos de registro al error estándar en el La moda ordinaria de Unix.gestión de registros con nosh y la familia daemontools en general
Con la familia de conjuntos de herramientas daemontools, hay mucha flexibilidad en el registro. Pero, en general, en toda la familia, la idea es que cada demonio "principal" tiene un demonio "de registro" asociado. los dæmons "principales" funcionan igual que los procesos que no son dæmon y escriben sus mensajes de registro en un error estándar (o salida estándar), que el subsistema de administración de servicios se encarga de conectar a través de una tubería (que se mantiene abierta para que los datos de registro no se pierdan un reinicio del servicio) a la entrada estándar del demonio "logging".
Todos los demonios de "registro" ejecutan un programa que registra en alguna parte . En general, este programa es algo así
multilog
ocyclog
que lee de la entrada estándar y escribe (sellos de tiempo de nanosegundos) archivos en una, exclusiva-escritura, directorio estrictamente tamaño límite máximo, giran automáticamente de registro. En general, también, todos estos demonios se ejecutan bajo los auspicios de cuentas de usuario dedicadas individuales sin privilegios.Entonces uno termina con un sistema de registro ampliamente distribuido, con los datos de registro de cada servicio procesados por separado.
Uno puede ejecutar algo como
klogd
osyslogd
orsyslogd
bajo una gestión de servicios daemontools familiar. Pero el mundo de daemontools se dio cuenta hace muchos años de que la estructura de gestión de servicios con demonios "logging" se presta claramente para hacer las cosas de una manera más simple. No es necesario desplegar todas las secuencias de registro en una mezcla gigante, analizar los datos de registro y luego volver a desplegar las secuencias para separar los archivos de registro; y luego (en algunos casos) atornille un mecanismo de rotación de registro externo poco confiable en el lateral. La estructura de la familia daemontools como parte de su gestión de registros estándar ya realiza la rotación de registros, la escritura del archivo de registro y la separación de la secuencia.Además: el modelo de carga en cadena de la eliminación de privilegios con herramientas comunes en todos los servicios significa que los programas de registro no necesitan privilegios de superusuario; y el modelo UCSPI significa que solo necesitan preocuparse por las diferencias, como el transporte de flujo versus el de datagrama.
El conjunto de herramientas nosh ejemplifica esto. Si bien se puede ejecutar
rsyslogd
debajo de él, listo para usar , y simplemente administrar el kernel/run/log
y la entrada de registro UDP de la manera anterior; que también ofrece más formas "nativos" daemontools de registro de estas cosas:klogd
servicio que lee/proc/kmsg
y simplemente escribe esa secuencia de registro en su error estándar. Esto se hace mediante un programa simple llamadoklog-read
. El demonio de registro asociado alimenta la secuencia de registro en su entrada estándar en un/var/log/sv/klogd
directorio de registro.local-syslog-read
servicio que lee datagramas de/dev/log
(/run/log
en los BSD) y simplemente escribe esa secuencia de registro en su error estándar. Esto lo hace un programa llamadosyslog-read
. El demonio de registro asociado alimenta la secuencia de registro en su entrada estándar en un/var/log/sv/local-syslog-read
directorio de registro.udp-syslog-read
servicio que escucha en el puerto UDP syslog, lee lo que se le envía y simplemente escribe esa secuencia de registro en su error estándar. De nuevo, el programa essyslog-read
. El demonio de registro asociado alimenta la secuencia de registro en su entrada estándar en un/var/log/sv/udp-syslog-read
directorio de registro.local-priv-syslog-read
servicio que lee datagramas/run/logpriv
y simplemente escribe esa secuencia de registro en su error estándar. De nuevo, el programa essyslog-read
. El demonio de registro asociado alimenta la secuencia de registro en su entrada estándar en un/var/log/sv/local-priv-syslog-read
directorio de registro.El conjunto de herramientas también viene con una
export-to-rsyslog
herramienta que puede monitorear uno o varios directorios de registro (usando un sistema de cursores de registro no intrusivos ) y enviar nuevas entradas en forma RFC 5424 a través de la red a un servidor RFC 5426 designado.gestión de registros con systemd
systemd tiene un solo programa de gestión de registros monolítico,
systemd-journald
. Esto se ejecuta como un servicio administrado por systemd./dev/kmsg
para los datos de registro del kernel./dev/log
(un enlace simbólico/run/systemd/journal/dev-log
) para los datos de registro de la aplicación de lasyslog()
función de la biblioteca GNU C.AF_LOCAL
socket del flujo en/run/systemd/journal/stdout
busca de datos de registro provenientes de servicios administrados por systemd.AF_LOCAL
zócalo del datagrama en/run/systemd/journal/socket
busca de datos de registro procedentes de programas que hablan el protocolo de diario específico del sistema (es decir,sd_journal_sendv()
et al.)./run/log/journal/
o/var/log/journal/
.AF_LOCAL
zócalo de datagrama en el/run/systemd/journal/syslog
que escribe datos del diario allí, si está configurado el reenvío a syslog./dev/kmsg
mecanismo de escritura .Las cosas malas suceden en todo el sistema si este programa falla o si se detiene el servicio.
systemd mismo organiza las salidas estándar y los errores de (algunos) servicios para que se conecten al
/run/systemd/journal/stdout
socket. Entonces, los demonios que inician sesión en el error estándar de la manera normal tienen su salida enviada al diario.Esto reemplaza completamente a klogd, syslogd, syslog-ng y rsyslogd.
Ahora se requiere que sean específicos del sistema. En un sistema systemd no llegan a ser el servidor final
/dev/log
. En cambio, toman uno de dos enfoques:/run/systemd/journal/syslog
, que (si recuerdas)systemd-journald
intenta conectarse y escribir datos del diario. Hace un par de años, uno habría configurado elimuxsock
método de entrada de rsyslogd para hacer esto.imjournal
método de entrada de rsyslogd para hacer esto.fuente