Deja de iniciar sesión en los archivos. Pero, ¿qué sistema elegir?

El inicio de sesión en archivos funciona desde la época de Unix de 1970.

Creo que es hora de un cambio.

mis razones:

  • rotar archivos es una molestia: el servidor necesita recargarse después de rotar...
  • registrar datos estructurados significa este flujo de trabajo:
    • buenas estructuras de datos de alto nivel se serializan en una cadena de bytes
    • más tarde, la cadena de bytes debe construirse nuevamente en una buena estructura de datos de alto nivel. Puede romperse si dos procesos se registran en el mismo archivo.
  • Sí, grep es bueno para la mayoría de los casos. Pero las consultas complejas (que abarcan varias líneas) son difíciles.

Pero, ¿qué elegir?

Mi entorno:

  • Servidores Linux
  • Principalmente software de Python
  • Sistemas satelitales:
    • Nuestro software se ejecuta en las intranets de los clientes.
    • El satélite funciona solo, pero se gestiona desde nuestra oficina central
    • La conexión de red entre el satélite y la oficina central a veces es lenta o inactiva.

Requisitos

  • La interrupción de la red entre el satélite y la oficina central puede ocurrir diariamente. Se necesita algún tipo de almacenamiento en búfer
  • grep-replacement: necesitamos una forma simple de "grep" los registros del shell (en el satélite y la oficina central)
  • soporte de datos estructurados: necesitamos poder registrar datos estructurados (json o yaml)
  • Soporte para Python virtualenvs: Ejecutamos varios virtualenvs en un servidor Linux. Los registros deben mantenerse separados de cada virtualenv

Respuestas (2)

Es posible que pueda usar: https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-elk-stack-on-ubuntu-14-04

Logstash reenvía los registros al servidor de registro central.


Además, rsyslog se puede configurar para reenviar a un almacén central y almacenar en caché los registros localmente con la siguiente configuración:

$WorkDirectory /rsyslog/work # ubicación predeterminada para archivos de trabajo (spool) A través de una configuración extendida, incluso se puede configurar para iniciar sesión en un servidor MySQL. La configuración puede generar entradas complejas.

Es posible que desee iniciar sesión en bases de datos SQLite en lugar de archivos de texto sin formato por las siguientes razones:

  • SQLite es parte de la biblioteca de tiempo de ejecución estándar de Python. Por lo tanto, las bases de datos se pueden crear, llenar y mantener muy fácilmente.
  • La distribución binaria consta de un único ejecutable de línea de comandos (scriptable), el shell sqlite, que se puede usar para consultar fácilmente los registros.
  • sqlite proporciona un mecanismo de bloqueo que evita que los archivos sean dañados por un acceso de escritura simultáneo
  • Los datos JSON y YAML pueden serializarse y almacenarse como texto (SQLite permite un tamaño de campo de texto de 2 31 -1 bytes) o, si la estructura tiene un tamaño limitado y es coherente entre las entradas de registro, las tablas de la base de datos podrían estructurarse en consecuencia.
  • consultar las bases de datos mediante el uso de SQL puede ser mucho más rápido y más conveniente que usar grep en archivos de texto. SQLite también implementa la búsqueda de texto completo indexada para acelerar la búsqueda de cadenas
  • Disminuyó en gran medida la necesidad de rotación de registros: el número máximo teórico de filas en las bases de datos SQLite (que corresponde a un número de entradas de registro posibles) es 2 64 . Incluso sin rotación de registros, las entradas recientes se pueden consultar rápidamente si la marca de tiempo se integra explícitamente como campo en las tablas

La recomendación sería usar una base de datos SQLite local separada para cualquier virtualenv. Luego, los registros podrían ser recopilados por el satélite. Tan pronto como la red esté disponible, la base de datos satelital se puede consultar desde la oficina central. Alternativamente, el satélite y la oficina central también podrían usar cualquier otro RDBMS para integrar datos (en general, los sistemas de administración de bases de datos también incluyen un cliente de línea de comando para administrar o consultar rápidamente, o como lo llamó, "grepping" la base de datos)

Es cierto que hay algunas limitaciones:

  • rendimiento de escritura: puede ser un problema, si las entradas se generan muy rápido y cada una debe ir a la base de datos en una transacción separada. En este caso, solo se pueden escribir unas pocas docenas de entradas por segundo. De lo contrario, si se pueden combinar varias entradas en una transacción, este es un problema mucho menor (eche un vistazo a https://stackoverflow.com/questions/1711631/improve-insert-per-second-performance-of-sqlite )
  • El tamaño máximo de la base de datos sqlite puede ser una limitación: si el volumen de datos generado es muy alto, el límite de tamaño de la base de datos de ~ 140 TB no está tan lejos. En ese caso, uno preferiría un sistema con más capacidad si se quiere evitar completamente la rotación. Para una comparación de diferentes RDBMS, consulte https://en.wikipedia.org/wiki/Comparison_of_relational_database_management_systems#Limits
Quiero evitar soluciones hechas por mí mismo. SQLite es una gran base de datos. Pero por resolver todavía faltan muchas cosas: ¿Qué esquema de base de datos sería útil? Cómo obtener los mensajes de registro de la base de datos...