Convierte Container Logs en tablas consultables.
Cada contenedor que ejecuta el daemon escribe un registro. Consúltalos todos a la vez, con el nombre real del contenedor, su imagen y su servicio de Compose, en lugar de un directorio lleno de identificadores de 64 caracteres.
Usa los resultados en Excel, Google Sheets, herramientas de IA y tus aplicaciones mediante Database REST API.
Todos los tipos de conectores están disponibles en el plan gratuito. Empieza con 2 fuentes de datos y 1 agente.
Lee, organiza y consulta en tu máquina.
Consultas de solo lectura · conexión salienteLos archivos de origen permanecen en su sitio. Tus herramientas reciben los resultados de las consultas.
Query Streams convierte los registros json-file de Docker, las exportaciones de docker logs que guardas manualmente y el propio registro del servidor de Portainer en tablas SQL en tiempo real, legibles desde Microsoft Excel, Google Sheets, asistentes de IA a través de MCP, REST API y Power BI. El problema difícil que resuelve es la identidad: en el disco, estos archivos se nombran con el ID del contenedor, así que el agente relaciona cada uno con el nombre real del contenedor, su imagen y su servicio de Compose antes de cargar las filas. No se sube nada: el agente lee los archivos en el host y solo los resultados de las consultas salen de tu red.
- Nombres reales de contenedores, no ID
- Imagen y servicio de Compose en cada fila
- stdout y stderr se mantienen separados
Conecta Container Logs con la configuración adecuada.
Mantén la conexión en Network Agent. Estos son los detalles específicos de Container Logs.
- Carpeta
- El directorio de registros del daemon en el host de contenedores o una carpeta que contenga registros exportados
- Fuentes
- Registros json-file de Docker, exportaciones guardadas de docker logs y el registro del servidor de Portainer
- Identidad
- Nombre del contenedor, imagen y servicio de Compose obtenidos del daemon, para que las filas no se identifiquen mediante un ID de 64 caracteres
- Rotación
- Se siguen los cambios cuando el daemon rota los archivos, además de los diez patrones de rotación con nombre para archivos exportados
- Líneas no coincidentes
- Se conservan literalmente en events_raw_lines; nunca se descartan
- Credenciales
- Ninguna: el agente lee los archivos directamente en el host
- dialecto SQL
- DuckDB: SQL estándar, sin nada específico de contenedores que aprender
El agente lee los archivos de registro que el daemon ya ha escrito. No se conecta a los contenedores, no mantiene abierto el socket del daemon para transmitir datos y nunca escribe en esos archivos ni los rota; así que, aunque dejes un conector en ejecución, no puede cambiar el comportamiento del host.
Diseñado para el funcionamiento de Container Logs.
Lo difícil es la identidad, no el análisis
El controlador json-file de Docker escribe el registro de cada contenedor en un directorio cuyo nombre es su ID de 64 caracteres. Analizar el JSON es trivial; saber de qué contenedor procede no lo es, y eso es lo que hace que la tabla resulte útil.
- Cada fila incluye el nombre real del contenedor, su imagen y su servicio de Compose, obtenidos del daemon en lugar de deducirse a partir de la ruta.
- Eso significa que «errores en el servicio api esta mañana» se expresa con una cláusula WHERE, no con una tabla de búsqueda que tengas que mantener a mano.
- También se conserva el flujo, para que stdout y stderr sigan siendo distinguibles en lugar de fusionarse en una sola columna de texto.
- Un contenedor que se ha eliminado conserva las filas que ya había generado: el historial no desaparece con el contenedor.
-- Qué servicios generan más ruido ahora mismo
SELECT service, stream, COUNT(*) AS lines
FROM fileset.events
WHERE stream = 'stderr'
GROUP BY service, stream
ORDER BY lines DESCTres cosas, no una
Los registros json-file del daemon son el evento principal, pero no son los únicos registros de contenedores que merece la pena consultar: una exportación de docker logs guardada manualmente tiene una estructura distinta, y Portainer escribe su propio registro del servidor. Los tres tienen perfiles, así que eliges qué estás leyendo en lugar de esperar que un único analizador pueda con todo.
Los formatos y el comportamiento, en detalle.
Abre la referencia que necesitas para Container Logs.
Una carpeta de registros de contenedores se convierte en una tabla.
Una carpeta de registros de contenedores se convierte en una tabla.
Query Streams lee los archivos que el daemon ya escribe, fija el formato y te ofrece columnas tipadas con el nombre del contenedor junto a cada fila. Sin sidecar, sin canalización de envío ni índice que mantener; y las líneas que el analizador no puede leer se conservan como filas con un motivo, en lugar de descartarse en silencio.
Rotaciones, archivos comprimidos y archivos releídos: todo resuelto
SELECCIONE aplicación, componer_servicio,
contar(*) AS pauta
DESDE eventos del conjunto de archivos
DONDE flujo = 'stderr'
GRUPO POR aplicación, servicio de composición
ORDENAR POR pauta DESCIntégrala a la base de datos de tu aplicación en la misma consulta.
Archivos que el demonio ya escribe, ahora una tabla sobre la que puede generar informes.
Dos herramientas, tres formatos, sin sidecar
Dos herramientas, tres formatos, sin sidecar
Cada tarjeta indica los archivos exactos que lee Query Streams y dónde se encuentran. No tienes que cambiar el controlador de registro para que esto funcione: — archivo json es el predeterminado de Docker, y el predeterminado es el compatible.
Registros de contenedores compatibles
3 formatos · 2 herramientas- Uno
{"registro","flujo","tiempo"}sobre por línea, escrito por el demonio - El nombre del contenedor procede del propio Docker
config.v2.jsonjunto al tronco - Imagen y componer proyecto/servicio recorrido como columnas
- Generalmente
/var/lib/docker/contenedores - Apéndices; rotaciones numeradas y
.gzseguido
- Archivos que guardaste con
Registros de Docker --marcas de tiempo - Una marca de tiempo RFC 3339 con nanosegundos, seguida de la línea del propio contenedor
- Las líneas del banner del contenedor se omiten por declaración, no por casualidad.
- Cualquier carpeta donde guardes las exportaciones
- Un archivo por servicio; el nombre proviene de la raíz del archivo.
portainer.logo la salida del propio contenedor- Los códigos de color ANSI se eliminan antes del análisis, por lo que un nivel es un nivel.
- El
clave=valorLa cola se convierte en columnas; el resto cae endatos - También se leen las líneas, de estructura distinta, del servidor de túnel integrado
- Sellos con resolución de minutos, leídos en UTC
Con cada nueva versión del Agente, se añaden nuevos formatos de registro de contenedores. Dado que los Agentes se actualizan automáticamente, un formato añadido posteriormente aparece en el conector sin necesidad de que nadie acceda al servidor.
registros de Docker extraídas de un host Swarm y el registro del servidor de Portainer CE 2.39.1. Algo que conviene saber de antemano: en Docker Desktop para Windows y Mac, los registros json-file están dentro de su máquina virtual, a la que un Agent que se ejecuta como servicio no puede acceder. Expórtalos con Registros de Docker --marcas de tiempo y utilice el segundo perfil.
Contenedores en todas las regiones; registros leídos donde se encuentran
Contenedores en cada región, registros leídos donde se sientan
Rara vez se ejecutan todos los contenedores en un mismo lugar. Un host en la oficina, un clúster Swarm en una región de la nube y un único equipo en otro país. En cada ubicación, un Network Agent lee los archivos de registro donde ya están y se conecta a Query Streams. Desde el punto de vista del firewall, es una conexión saliente normal: no hay nada que abrir ni que configurar como VPN.
registros de Docker exportación por servicio
marca fuera
Tres conexiones salientes, un único lugar para consultarlas: sin puertos entrantes, sin VPN y sin cambios en el firewall
Un agente por ubicación
Un Agent cubre todo un sitio, no solo una carpeta: cada formato de registro que quieras consultar allí se convierte en su propio conector File Set en ese mismo Agent. Lo habitual es tener un Agent por ubicación. El plan Free ejecuta un único Agent y los planes de pago permiten ejecutar más.
1 sitio = 1 agente = muchos conectores
Nada que abrir
El Agent establece una única conexión saliente cifrada, y tanto las solicitudes como las filas de respuesta viajan por ella. Sin puertos entrantes, sin VPN ni cambios que solicitar para el firewall; además, las credenciales permanecen dentro de tu red.
una conexión, en ambas direcciones
Una consulta en varios sitios
Cada fuente en un consulta federada indica su propio Agent, de modo que una sola instrucción puede leer un registro en un país y otro en otro país, y devolver un único resultado; también puede combinar cualquiera de ellos con una base de datos. Incluido en Business y Enterprise.
2 países → 1 conjunto de resultados
Se mantienen al día
Los agentes se actualizan automáticamente, por lo que un formato de registro de contenedores añadido en una versión posterior llega a todos los sitios sin que nadie tenga que iniciar sesión en un servidor para instalarlo. Eso es lo que convierte el muro anterior en un punto de partida, en lugar de una lista fija.
Llegan nuevos formatos con el Agente
Nombres, relojes y códigos de color
Nombres, relojes y códigos de color
Un registro de contenedor no es un archivo de texto con una fecha. Suelen surgir tres problemas al intentar tratarlo como datos, y aquí se abordan mediante una declaración explícita en lugar de conjeturas.
Nombres, no identificadores hexadecimales
Docker nombra cada carpeta de registro según el ID del contenedor, lo que hace que una consulta agrupada sea ilegible. Query Streams lee el registro que Docker escribe junto al archivo de registro y toma el nombre real, manteniendo el ID como una columna aparte.
a3f9c1…-json.log → app = shopfront-api
El reloj del daemon
Si confías en la marca de tiempo propia de un contenedor que imprime el tiempo en segundos desde epoch, la fecha resultante será de 1970. La hora del evento es la hora de captura del daemon; la marca del contenedor se conserva como columna, en lugar de considerarse fiable.
hora del sobre → event_time
Códigos de color en el archivo
Los registradores de consola escriben secuencias de escape de terminal directamente en el registro. Se eliminan antes del análisis, para que el nivel se lea como tal y no como un nivel rodeado de caracteres de escape, y los bytes originales no se modifican.
códigos de escape eliminados → level = INF
Nada contó dos veces
Cada archivo se identifica mediante sus primeros 4 KB, de modo que un archivo rotado se reconoce como el mismo archivo en lugar de leerse de nuevo desde el principio. Una ventana de duplicados deslizante detecta la superposición cuando un escritor reproduce su cola.
Hash del prefijo de 4 KB · ventana de 20 000 registros
Las columnas que realmente obtienes
Las columnas que realmente obtienes
No es un bloque de texto con una marca de tiempo al lado. Cada formato se analiza en columnas tipadas que puedes filtrar, agrupar y agregar directamente; y cuando un contenedor registra JSON estructurado, sus propios campos también se desglosan en columnas.
Cada fila también lleva tiempo_del_evento, la marca original desde la que se leyó y el archivo de procedencia. Cada formato añade su columna de identidad: aplicación para archivos json y Portainer, recipiente para una exportación; y las filas json-file también incluyen imagen, componer_proyecto, servicio_componer y ID del contenedor. El único mensaje La columna de una exportación es intencionada: la línea propia del contenedor se conserva íntegra, en lugar de intentar adivinar su estructura.
Lo que esto deliberadamente no hace
Lo que esto deliberadamente no hace
No se trata de una lectura en tiempo real. Query Streams lee los archivos tal como están en el disco al ejecutar la consulta, por lo que un bucle de reinicio se muestra como filas en lugar de como un flujo que se puede observar. Si necesita alertas con precisión de subsegundos sobre una línea a medida que se imprime, una canalización de registros es la herramienta adecuada.
La salida de un contenedor es de formato libre, y esto tiene una consecuencia que conviene expresar con claridad: todo lo que imprima tu aplicación es lo que acaba en la tabla. Si registra un token o el correo electrónico de un cliente, esa cadena ya está en el archivo de registro y también estará en la columna. No hay un mapa de encabezados que permita excluir datos, como ocurre con el registro de un servidor web; trata la tabla resultante con el mismo cuidado que tratarías el archivo.
Dos límites más pequeños, nombrados en lugar de ocultos. En un registros de Docker Al exportar, la línea propia del contenedor se conserva íntegra en una sola mensaje columna; todavía no se puede volver a analizar esa línea interna según su propio formato. Además, los atributos opcionales que Docker puede adjuntar mediante una etiqueta de registro solo se reconocen por su estructura: ningún contenedor del corpus capturado los utilizó, así que esa posibilidad está definida, pero no comprobada.
El resto sigue el diseño habitual. El agente se conecta y lee archivos; no se instala nada en el contenedor, no se escribe nada, el socket y la API de Docker nunca se modifican y el acceso es de solo lectura. El campo de retención comienza en 30 días para esta configuración predeterminada y usted puede modificarlo.
De la conexión a resultados útiles.
- Instala Network Agent en el host del contenedor, donde pueda acceder al directorio de registros del daemon.
- Indícale al conector dónde está. Se detectan los registros json-file de todos los contenedores, y puedes limitar la selección con patrones.
- El agente relaciona cada directorio de 64 caracteres con el contenedor al que pertenece —su nombre real, imagen y servicio de Compose—, para que las filas sean legibles antes de escribir cualquier SQL.
- Cada línea se convierte en una fila, con su flujo (stdout o stderr) y la marca de tiempo del daemon; además, el agente sigue la rotación a medida que el daemon rota los registros.
- Consúltalos. Errores de todos los contenedores a la vez, de un servicio por separado o comparando el antes y el después de una implementación.
Aprovecha los resultados de Container Logs.
Una conexión sirve a tus hojas de cálculo, aplicaciones y herramientas de IA. Comparte el permiso para ejecutar una consulta guardada; los destinatarios ven los resultados permitidos, con el SQL y el inicio de sesión de origen ocultos.
Para su equipo, proveedores y socios
Lleva los resultados en tiempo real de Container Logs directamente a una hoja de cálculo y actualízalos cuando quieras: en Excel de escritorio, Excel Online o Microsoft 365.
Explorar ExcelEjecuta desde la barra lateral una consulta guardada de Container Logs y añade las filas a la hoja. Los colaboradores con quienes la compartas también podrán actualizarla.
Explora Google SheetsHaz una pregunta en lenguaje sencillo. Nova ya conoce tus tablas de Container Logs, escribe y ejecuta el SQL, explica la respuesta y la representa en un gráfico: no tienes que escribir consultas ni compartir credenciales.
Cómo funciona NovaComparte un resultado en tiempo real de Container Logs con quien quieras —un compañero, un proveedor o un socio— mediante una cuadrícula con un enlace guardable en favoritos que vuelve a ejecutar la consulta al abrirse, desde un móvil, una tableta o un ordenador. Verán los resultados, nunca el SQL ni los archivos.
Cómo funciona el visor de datosPara aplicaciones y sistemas
Publica una consulta de Container Logs como endpoint JSON autenticado al que pueda llamar cualquier aplicación, con una especificación OpenAPI 3.1 y colecciones listas para Postman, Insomnia y Hoppscotch. No se abre ningún puerto de base de datos.
Explorar REST APIPega el código M de Power Query generado en el Editor avanzado de Power BI y el informe leerá en tiempo real los resultados de Container Logs a través de HTTPS: sin controlador ODBC ni puertos de base de datos abiertos.
Explorar Power BISincroniza filas de Container Logs con una base de Airtable según una programación o recupéralas desde un script de automatización de Airtable.
Explora AirtableAlimenta una tabla de Baserow con datos de Container Logs a través del endpoint REST, tanto si usas una instancia autoalojada como Baserow Cloud.
Explora BaserowMantén actualizada una base de SeaTable con datos de Container Logs, sin exportar archivos ni exponer la base de datos.
Explora SeaTableEnvía los resultados de Container Logs a una cuadrícula de Smartsheet para que los planes y los informes lean los datos del sistema de origen, en lugar de una exportación de la semana pasada.
Explora SmartsheetConecta una aplicación Python de Anvil con Container Logs mediante el endpoint REST, en lugar de incluir credenciales de base de datos en la aplicación.
Explora AnvilPara herramientas de IA
Da a un asistente de IA acceso de solo lectura a Container Logs, con el esquema que necesita para escribir SQL correcto, sin compartir credenciales en el chat.
Explora MCPEntregado a las personas
Programa una consulta de Container Logs y envía las filas a Slack, Discord, correo electrónico o un webhook firmado; o retén el mensaje hasta que el número de filas, un umbral o un cambio porcentual supere el límite que hayas establecido.
Cómo funcionan las alertas y los informesCombina Container Logs con el resto de tus datos.
Reúne bases de datos, API empresariales, archivos y registros en una sola consulta de solo lectura. Todos los conectores admiten consultas federadas.
Indica los nombres de las conexiones y las tablas. Query Streams se encarga de las consultas de origen y combina los resultados.
Explorar consultas federadas-- nada copiado, nada fusionado, nada programado
SELECCIONE c.region, COUNT(*) AS orders, SUM(i.amount_due) AS invoiced
DESDE containerlogs.fileset.orders1 f
ÚNASE A pg_crm.clientes.públicos2 c ON c.id = f.customer_id
ÚNASE A facturación.stripe.facturas3 i ON i.cliente = c.stripe_id
GRUPO POR región c
ORDENAR POR facturado DESC;Usa tus propios nombres de conexión, esquema, tabla y columna.
Compartido por toda la familia de conectores.
Cada conector de registros también te ofrece
- events: una fila por cada línea analizada, con la marca de tiempo, los campos definidos por la gramática y _source_file, que indica el nombre del archivo de origen.
- events_raw_lines: líneas que no coinciden con la gramática, conservadas tal cual en lugar de descartarse, para que puedas seguir respondiendo preguntas sobre formatos que no habías previsto.
- files_current y files_events: el inventario actual y el registro de auditoría; qué apareció, qué rotó, qué desapareció y qué se retuvo, junto con el nombre del archivo y el motivo.
- La rotación se reconoce; no se esquiva: hay diez patrones de rotación con nombre y también archivos sin rotar, así que el registro de ayer y su archivo comprimido forman la misma tabla que los de hoy.
Es bueno saberlo
- Solo lectura, garantizado: una instrucción cada vez, únicamente SELECT y otras similares. Nunca escribimos, movemos, rotamos ni truncamos tus registros.
- No se carga nada: las líneas se analizan y se guardan en caché, cifradas, en tu propio equipo junto al agente. Solo el resultado de una consulta sale de tu red.
- Solo se leen los bytes nuevos: el agente retoma la lectura donde la dejó en cada archivo, en lugar de volver a leerlo, para que un registro con mucha actividad no te cueste más cada día.
- El dialecto SQL es DuckDB: el mismo SQL que escribirías para cualquier otro conector.
Preguntas sobre Container Logs
¿Dónde puedo usar los resultados de consultas de Container Logs?
Usa los resultados de Container Logs en Excel, Google Sheets, Data Viewer, tus aplicaciones mediante Database REST API y herramientas de IA mediante MCP o Nova. Los resultados guardados también alimentan los destinos de Automation compatibles, los informes y las alertas. La disponibilidad de los destinos y las cuotas dependen de tu plan.
¿Tengo que abrir un puerto de entrada para Container Logs?
No. Instala Network Agent en una máquina que pueda acceder a Container Logs. El agente se conecta de forma saliente a Query Streams; no se necesita ningún puerto de entrada ni VPN. Aun así, la fuente debe permitir que la máquina del agente se conecte según sus propias reglas de acceso.
¿Se cargan mis archivos de Container Logs?
Network Agent lee los archivos donde están y guarda su caché en la máquina del agente. Los archivos de origen no se cargan, se mueven ni se reescriben. Solo los resultados de las consultas solicitadas salen de tu red a través de la conexión cifrada saliente.
¿Qué necesito para conectar Container Logs?
Carpeta: el directorio de registros del daemon en el host del contenedor, o una carpeta que contenga registros exportados. Fuentes: registros Docker json-file, exportaciones guardadas de docker logs y el registro del servidor de Portainer. Identidad: nombre del contenedor, imagen y servicio de Compose resueltos por el daemon, para que las filas no se identifiquen mediante un ID de 64 caracteres. Rotación: se sigue a medida que el daemon rota los archivos, además de los diez patrones de rotación con nombre para archivos exportados
¿Puedo combinar Container Logs con otras fuentes conectadas?
Sí. Las consultas federadas son compatibles con todos los tipos de conectores, incluidas bases de datos, API empresariales, archivos y registros. Indica las conexiones y tablas en una sola consulta de solo lectura. Query Streams traduce las partes de origen según sea necesario y combina sus resultados. Descubre cómo funcionan las consultas federadas.
¿Tengo que cambiar mi controlador de registro de Docker?
No. archivo json es el controlador predeterminado de Docker y es el que se admite. Si nunca has configurado el registro, los archivos ya están ahí y ya tienen el formato adecuado.
Si se ha cambiado a un controlador diferente, el Registros de Docker --marcas de tiempo La exportación es la ruta de entrada: funciona independientemente del controlador, porque la CLI lee a través del demonio.
¿Cómo sabe el nombre del contenedor y no solo su id?
Docker escribe su propio registro de un contenedor en la misma carpeta que el registro. Query Streams lee el nombre de ese archivo y lo usa como columna de identidad, con la imagen y el proyecto y servicio de Compose mantenidos como columnas adyacentes. El ID de carpeta de 64 caracteres se conserva como ID del contenedor, así que no se pierde nada.
Si falta ese registro, no se puede leer o no contiene un nombre, se usa en su lugar el nombre de la carpeta y el proceso de revisión cuenta cuántas veces ha ocurrido; así, la alternativa queda reflejada en una cifra que puedes consultar, en lugar de aplicarse de forma silenciosa.
Estoy usando Docker Desktop para Windows o Mac. ¿Esto funciona?
No se trata de acceder directamente a los registros en formato JSON. Docker Desktop los mantiene dentro de su propia máquina virtual, y un agente que se ejecuta como servicio en el host no puede acceder a ellos.
La solución es el perfil de exportación: docker logs --timestamps <contenedor> redirigido a un archivo en cualquier carpeta que Agent pueda leer. Es un formato compatible por derecho propio, no una solución provisional: es la misma vía que ya usa la gente para conservar una copia del registro después de que desaparezca un contenedor.
¿Esto es en tiempo real?
Funciona bajo demanda, no en flujo continuo. Los archivos se leen tal como están cuando se ejecuta la consulta, de modo que las líneas nuevas aparecen a medida que los contenedores las escriben y se detecta el archivo; no según un horario nocturno fijo, pero tampoco como una lectura en tiempo real.
Para hacer una pregunta sobre las últimas semanas en cada contenedor y obtener la respuesta en una hoja de cálculo, esa es la forma útil y requiere considerablemente menos maquinaria que una pila de troncos.
¿Qué hay de Kubernetes o Podman?
Ninguno de los dos tiene un perfil propio hoy en día, y preferimos decirlo en lugar de implicar cobertura. Lo que sí aplica es el formato de exportación: el perfil está vinculado a la forma exacta. Registros de Docker --marcas de tiempo escribe — una marca de tiempo RFC 3339 con nanosegundos, un espacio y, después, la línea del propio contenedor; un archivo por servicio. Las herramientas que escriben con ese mismo formato pueden leerlo.
La forma más fiable de comprobarlo para tus propios archivos es mediante la prueba de conexión, que informa de lo que ha detectado antes de que confirmes nada.
Mis contenedores registran datos en formato JSON. ¿Debo obtener sus campos como columnas?
Sí, para los registros json-file. Se desenvuelve el contenedor del daemon y el JSON propio del contenedor que contiene se aplana en columnas —nivel, logger, mensaje, host y servicio, cuando están presentes. Todo lo que no se corresponda con una columna con nombre se conserva en un datos columna en lugar de descartarse, por lo que un campo inusual aún se puede consultar.
Lo único que no se toma del JSON del contenedor es la marca de tiempo. Esa se obtiene del daemon, porque la marca propia de una aplicación puede tener cualquier formato y, si se interpreta mal, la fila se coloca silenciosamente en un momento incorrecto.
¿Qué ocurre con una línea que el analizador sintáctico no puede leer?
Se conserva, no se descarta. Una línea que no coincide con el formato fijado se mantiene como una fila sin formato con una explicación adjunta, de modo que una entrada mal formada o un cambio de formato inesperado se muestra como algo visible y consultable, en lugar de como un hueco silencioso en los números.
Lleva Container Logs al lugar donde se realiza el trabajo.
Empieza con el plan Free: todos los tipos de conectores, 2 fuentes de datos y 1 Network Agent. Amplía las prestaciones incluidas en tu plan a medida que crezcan tus necesidades.

