Linux: ¿cómo enviar nuevas líneas en archivos de registro a syslog remoto?

8

Tenemos varias aplicaciones que están generando sus propios archivos de registro de texto sin formato, que me gustaría reenviar a un servidor remoto de syslog para el registro centralizado. No tengo acceso rooten estas máquinas, ni puedo reconfigurar syslogpara redirigir la salida a una máquina remota.

He encontrado algunas soluciones en línea, pero en su mayoría son scripts de bash caseros de las personas, y estoy buscando algo más robusto que sea adecuado para la implementación en un entorno de producción de alto volumen potencial.

Preferiblemente, algo diseñado con un ojo para una huella pequeña, un demonio de fondo que sigue funcionando, que puede mantenerse al día con muchas líneas, etc. - ¿Qué soluciones están disponibles actualmente?

Michael Martinez
fuente
3
¿Has mirado el módulo de entrada de archivo de texto para rsyslog?
Yoonix
@yoonix: No, no lo he hecho, pero voy a :)
Michael Martinez
3
Uhm, syslog puede enviar a servidores remotos de syslog. Configure su syslog local para enviar a un servidor remoto. Luego, acceda a su syslog local a través de las llamadas estándar de syslog o usando logger o algo así.
Zoredache
44
¿Por qué no escribe sus archivos de registro en una tubería con nombre y tiene un demonio escuchando que los envía en su camino serverfault.com/questions/189477/…
User9517
3
No debería tener que modificar la aplicación, simplemente coloque una tubería con el mismo nombre que el archivo de registro en el que está escribiendo la aplicación.
user9517

Respuestas:

13

Ya ha rechazado los "scripts de bash de otras personas", pero esta es una solución bastante común: un uso creativo del loggercomando puede seguir un archivo y enviar su contenido a otra parte.
Sin embargo, personalmente no haría esto en un entorno de producción.


Se está utilizando una mejor opción que requiere menos piratería de secuencias de comandos rsyslogdy el módulo de entrada de archivos de texto como yoonix mencionó : esta es una solución bastante decente, aunque existe la posibilidad de líneas perdidas durante la rotación de un archivo, y si está en un sistema Linux con rsyslogcomo su demonio syslog no se requiere mucho trabajo adicional.

syslog-ngtambién es compatible con una fuente de entrada de archivo con una funcionalidad similar a rsyslogla de.


En mi humilde opinión, la mejor solución, aunque requiera modificar la aplicación que genera estos registros, es iniciar sesión en syslog directamente. No desea pasar por pasos intermedios, archivos, etc., sysloges el SYStem LOGger, y las cosas que escriben registros en una plataforma Unix deberían enviarlos a syslog.
La implementación de esto, desafortunadamente, se deja como un ejercicio para el lector (y el desarrollador de la aplicación) y puede no ser posible si sus desarrolladores son inexistentes, flojos o incompetentes ...

voretaq7
fuente
77
@MichaelMartinez Modificaría la rsyslogconfiguración que se ejecuta actualmente en el sistema. NO deberías ejecutar dos demonios syslog. No debe ser grosero, pero debe dejar de intentar hacerlo mal *: toda solución adecuada para este escenario requiere acciones administrativas (raíz) en el servidor o modificación de la aplicación. Tendrá que enfrentar esa realidad y tratar con cualquier grupo dentro de su organización que tenga raíces en los sistemas en cuestión, de lo contrario, esta pregunta está fuera de tema (está tratando de eludir las políticas de su organización) ...
voretaq7
55
@Michael Todo esto nos dice que alguien está tratando de obligar al equipo equivocado a implementar la solución.
Andrew B
44
@MichaelMartinez imho, eso suena como una ruta bastante rápida para niveles paralizantes de deuda técnica.
Sirex
2
@Sirex. Sea lo que sea, es la forma de las cosas. Trabajo en una organización que emplea a 10 de miles de personas, la mayoría de los cuales son técnicos (ingenieros, desarrolladores, operaciones, etc.)
Michael Martinez
55
Supongo. En general, he encontrado a largo plazo que no hay medallas en ganar batallas autoinfligidas. Cuando la deuda técnica llega al punto, impacta irónicamente en el negocio. Las personas que trabajaron arduamente para evitar al elefante en la habitación tienden a terminar cargando la lata, en mi experiencia. Entonces diría que te cubras el culo y que alguien acepte por escrito las desventajas de esto.
Sirex
6

Puede usar logstash con la entrada del archivo y la salida de syslog .

Por ejemplo, cree una configuración con el archivo (o archivos) que desea monitorear y la información de su servidor syslog.

file-to-syslog.conf:

input { file { path => "/var/log/kern.log" } }
output {
    syslog {
        facility => "kernel"
        host => "syslog.example.com"
        port => 514
        severity => "informational"
    }
}

El inicio logstash con

java -jar logstash-1.2.2-flatjar.jar agent -f file-to-syslog.conf
Sciurus
fuente
+1. si usar la entrada de archivos de rsyslog no es una opción, logstash es la mejor opción. En muchos sentidos, es mejor a largo plazo.
Sirex
No estoy familiarizado con esto. Si hace lo que necesito, me habría ahorrado la molestia de piratear coreutils y util-linux.
Michael Martinez
Sí, la configuración se verá un poco así: pastebin.com/xeC9hxD3
Sirex
Parece una herramienta genial, pero definitivamente exagero para lo que necesito aquí. logstash es su propio servicio, con interfaz web, requiere java, etc. Continuaré usando mi registrador de archivos que es liviano, ocupa poco espacio y está optimizado para el rendimiento. ... Pero, gracias por sugerir logstash porque puedo ver su necesidad en otras situaciones en el futuro
Michael Martinez
Sí, es una herramienta jruby llena de jarras. La interfaz gráfica de usuario es en realidad kibana, que se empaqueta fácilmente, pero en realidad es un proyecto separado, por lo que no es necesario solo para analizar mensajes. Básicamente es una navaja suiza de tala. Usted define entradas y salidas y, en el medio, opcionalmente puede asimilar los registros, lo que les da contexto. - Es probable que sea excesivo para usted a menos que también desee utilizar Elasticsearch en sus datos de registro.
Sirex
4

Pirateé juntos tail.cy logger.cen un solo programa compilado de huella pequeña (binario) que es ligero, rápido y estable. Siempre que tenga acceso de lectura a los archivos de registro, funcionará sin necesidad de privilegios de root.

También realicé un par de mejoras en el registrador nativo y agregué una nueva capacidad (opcional) de insertar una cadena de texto al comienzo de cada línea de registro antes de que se envíe al servidor de registro. El resultado es un programa que se puede ejecutar solo, sin necesidad de utilizar tuberías de shell (es decir, no es necesario tail logfile | logger). Se ejecutará para siempre hasta que se elimine explícitamente o encuentre un error al escribir en el zócalo de la red. Incluso continúa ejecutándose si el archivo de registro se gira o incluso desaparece (solo continuará buscando para ver si el archivo vuelve a aparecer).

Es fácil de usar: solo dele uno o más archivos de registro para monitorear, y cada vez que se escriba una nueva línea en el archivo, enviará una copia de esa línea al servidor syslog local o remoto que especifique. Además de la cadena de texto adicional si usa esa opción.

De hecho, terminé el programa en diciembre, pero estaba esperando que Yahoo tomara los derechos de autor y lo pusiera a disposición, lo que ahora han hecho. (Lo escribí como parte de mi trabajo en Yahoo).

información del programa de registro de archivos y enlace de descarga:

Michael Martinez
fuente
@slm: Reescribí lo que me pediste
Michael Martinez
Muy útil, gracias Michael. ¿Hay alguna posibilidad de que lo empaquete para debian apt-get install?
joelparkerhenderson
@joelparkerhenderson. Hola joel Desafortunadamente, probablemente no porque no trabajo con Debian. ¿Has intentado copiar el binario en tu sistema y ver si se ejecuta?
Michael Martinez
1

Hay varias formas de abordar esto. Pero la misma, muy primero que debe hacer es: transmita los registros mediante syslog en sí .

Syslog (y muchos reemplazos para syslog) tienen funciones integradas para reenviar el registro a otro servidor syslog en una dirección diferente. Puede hacerlo fácilmente cambiando el archivo de configuración y agregando la dirección para reenviar la instalación. Por ejemplo, agregando esta línea a:

*.*    @192.168.1.1

... reenviaría todas las instalaciones a la máquina en 192.168.1.1, que (con suerte) tiene el servicio en ejecución. El ejemplo que doy aquí es para rsyslog, que es el servidor syslog de stock en Debian, aunque debería funcionar para muchos otros. Consulte la documentación para su implementación de syslog man syslogy vea lo que dice sobre "reenvío".

El servidor remoto de syslog puede ser lo que quieras. Incluso hay productos, como Splunk , que felizmente agregan estos registros en una sola vista con un panel web, búsqueda, notificaciones basadas en eventos, etc., etc. Puede ver más aquí: http://www.splunk.com/ Si que no satisface tus necesidades, puedes usar otra cosa. ¡Incluso hay servidores de syslog que se volcarán a una base de datos SQL!

Claro, podrías escribir tu propio script / programa / servicio para hacer esto por ti, pero ¿por qué reinventar la rueda cuando está hecha para ti y ya te la dieron?


Editar: Así que volví y releí la pregunta, y noté varios comentarios. Suena como:

  1. desea agregar sus registros de aplicaciones
  2. no tienes acceso a root
  3. sus aplicaciones simplemente vuelcan el texto en alguna parte
  4. sus aplicaciones no saben cómo escribir en el syslog local
  5. no tienes control sobre el código fuente de tu aplicación

Entonces abordemos cada uno en secuencia:

  1. syslog estaba destinado a agregar registros juntos. Puedes usar lo que quieras, pero hay una razón por la que ha existido durante mucho tiempo. Está bien probado, bien depurado, bien documentado, conocido y para la mayoría de las plataformas * nix casi universalmente compatibles en un sabor u otro.
  2. no necesitamos acceso rootpara configurar el registro. Solo necesitamos acceso a la API de syslog. rootno es un requisito para escribir en el syslog; Si este fuera el caso, todos los servicios que pierden privilegios no podrían escribir diagnósticos en los archivos de registro.
  3. Re: volcados de texto, esto es normal. sin embargo, debería poder usar un subshell para canalizar la salida de STDERR y STDOUT a un programa que llame a la API syslog. Esto no es ciencia espacial, está lejos de ser frágil y está bien documentado. De hecho, es una de las razones por las que incluso existe la redirección de salida. Un comando simple que podría lanzarse en un solo script de shell sería:

    (my-application 2> & 1 | my-syslog-shunt) &

  4. Si tiene la capacidad de alterar el código fuente de su aplicación, debe escribir una derivación en él para volcar la salida de texto en syslog en lugar de un archivo de texto sin formato. Esto no debería ser demasiado difícil; todo lo que debe hacer es tomar las líneas que generaría y envolverlas con una llamada. Sin embargo....

  5. es posible que no tenga acceso al código fuente, por lo que no puede hacer esto. Lo que significa que algo como el # 3 anterior funcionaría bien.

Avery Payne
fuente
dos razones: (1) simplemente porque, como ya se mencionó, no tenía root o sudo en los cuadros en cuestión. (2) el "registrador" en sí puede reenviar al servidor remoto, pero tiene un límite de 400 caracteres por línea de registro, que no es apropiado para los registros de Apache. De todos modos, ya armé una solución personalizada que hace exactamente lo que necesitaba (y también mejora el "registrador"). Vea mi respuesta aquí para "filelogger"
Michael Martinez
4. Syslog no es solo una secuencia de archivos que puedo abrir y escribir texto. ¿La derivación que escribo tendría que abrir un socket al puerto UDP en el que escucha syslog?
Noumenon
1
@Noumenon, no tengo del todo claro su intención, pero supongo que desea canalizar la salida del programa en el registro del sistema, lo que se puede hacer con el comando logger. linux.die.net/man/1/logger
Avery Payne
@AveryPayne Me gusta Runtime.exec("logger ...") OK, gracias.
Noumenon
0

Estoy respondiendo mi propia pregunta.

La muestra podría haber funcionado, pero no pude hacer que el módulo Sys :: Syslog de perl funcione en el host, y el / usr / bin / logger que se instaló en el host no admite el registro en el servidor remoto (util-linux-ng- 2.17.2).

Entonces, lo primero que hice fue descargar el código fuente de util-linux-2.20.1 para el cual el programa registrador admite el registro remoto. Tras la prueba, se hizo evidente que hay un límite impuesto en la cantidad de caracteres permitidos en la línea de registro. Al profundizar en el código fuente, encontré un límite de 400 caracteres codificado. (Si no me cree, ejecute "strings / usr / bin / logger | grep 400" en cualquier sistema Linux).

Este límite no es aceptable para el registro de tipo apache (incluidos los nodejs), por lo que modifiqué el código y aumenté el límite a 4096. Mientras lo hacía, también agregué una nueva opción de línea de comandos que permite insertar una opción cadena de texto al comienzo de cada línea de registro. Hice esto porque los registros de nodejs no incluyen el nombre de host como se podría ver en apache.

En este punto, podría ejecutar un script de shell con "tail -F -n 0 [logfile] | ./modified_logger ...." y funcionó. Pero tenía algunas preocupaciones acerca de ejecutar esto desde supervise (daemontools) o incluso en segundo plano, porque si uno u otro lado de la tubería termina, entonces existe el riesgo de que toda la tubería termine. También tenía preocupaciones (aunque no probadas) sobre el rendimiento.

así que decidí combinar la funcionalidad de la cola con la funcionalidad del registrador en un solo binario ejecutable que evitaría la necesidad de usar tuberías Unix o programas externos. Lo hice pirateando tail.c desde gnu coreutils e incorporando lo que necesito en el programa de registro modificado.

El resultado es un nuevo binario (tamaño de 117k) al que llamo "registrador de archivos" y que monitorea continuamente uno o más archivos y registra cada nueva línea en un syslog local o remoto, ya sea a través de UDP o TCP. Funciona a las mil maravillas. Pude hacer un pequeño benchmarking y registra aproximadamente 17,000 líneas (1.8MB) en aproximadamente 3 segundos a través de subredes con un vlan y un par de conmutadores físicos entre ellos, en un servidor remoto que ejecuta syslog-ng.

para ejecutar el programa, debe hacer algo como lo siguiente (ya sea en primer plano, en segundo plano o supervisado con daemontools):

./filelogger -t 'acceso' -d -p local1.info -n [control remoto] -u / tmp / ignorado -a $ (nombre de host) / tmp / myfile1 / tmp / myfile2 ...

/ tmp / myfile1 y / tmp / myfile2 son los archivos que se monitorean.

La "-a" es la nueva opción que agregué. En este caso, inserto el nombre de host local al comienzo de cada línea de registro.

Esta solución era exactamente el tipo de solución que estaba buscando cuando hice la pregunta y, como resultó, no existía hasta que la hice yo mismo. :)

Michael Martinez
fuente
Probablemente haré esto disponible en sourceforge en algún momento. Sus ventajas son que es una huella muy pequeña, ligera, fácil de usar y optimizada para el rendimiento. Una vez que se lee el texto del mensaje, todo el procesamiento se realiza en el búfer de memoria y luego se transfiere directamente al socket.
Michael Martinez
1
xkcd.com/763
user9517
44
Estoy tratando de no ser muy duros, pero yo estoy voy a ser franco: no existía Esta solución, ya que es terrible. En lugar de la interfaz con los otros grupos de la organización e implementación de un cuerdo, solución estándar que has tirado un corte en su lugar con código totalmente compatible que usted ahora necesita de prueba / debug / a mantener en el futuro. Ignoraste fácilmente más de 50 años de experiencia combinada diciéndote "No hagas eso". Espero por tu bien que esto no te explote en la cara, pero indudablemente lo estás haciendo mal aquí ...
voretaq7
1
Si. bien ... Así es como el código abierto avanza, amigo. Si todos lo hicieran a su manera, no habría progreso. ¿Cómo crees que surgieron GNU, Linux y todo lo que se basa en él? Gente haciendo exactamente el tipo de cosas que hice aquí. Si te hace sentir mejor, tengo la intención de que mi código entre en nuestro sistema de administración de paquetes, donde todos en la organización son libres de usarlo, implementarlo y mejorarlo, si así lo desean.
Michael Martinez
Y para su información, no es una solución terrible. Por el contrario, es una herramienta muy útil. Cuando estaba buscando soluciones en línea la semana pasada, me encontré con otras personas preguntando dónde podían encontrar esta funcionalidad exacta.
Michael Martinez