# Controlador de registro Journald


El controlador de registro `journald` envía los registros de los contenedores al [diario de `systemd` (systemd journal)](https://www.freedesktop.org/software/systemd/man/systemd-journald.service.html). Las entradas de registro se pueden recuperar utilizando el comando `journalctl`, a través de la API `journal` o utilizando el comando `docker logs`.

Además del propio texto del mensaje de registro, el controlador `journald` almacena los siguientes metadatos en el diario con cada mensaje:

| Campo                                | Descripción                                                                                                                                                                                   |
| :----------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CONTAINER_ID`                       | El ID del contenedor truncado a 12 caracteres.                                                                                                                                                |
| `CONTAINER_ID_FULL`                  | El ID completo del contenedor de 64 caracteres.                                                                                                                                               |
| `CONTAINER_NAME`                     | El nombre del contenedor en el momento en que se inició. Si utilizas `docker rename` para renombrar un contenedor, el nuevo nombre no se refleja en las entradas del diario.                |
| `CONTAINER_TAG`, `SYSLOG_IDENTIFIER` | La etiqueta del contenedor ([documentación de la opción de etiqueta de registro](/engine/logging/drivers/journald/log_tags/)).                                                                                               |
| `CONTAINER_PARTIAL_MESSAGE`          | Un campo que marca la integridad del registro. Mejora el registro de líneas de registro largas.                                                                                               |
| `IMAGE_NAME`                         | El nombre de la imagen del contenedor.                                                                                                                                                        |

## Uso

Para usar el controlador `journald` como el controlador de registro predeterminado, establece las claves `log-driver` y `log-opts` con los valores adecuados en el archivo `daemon.json`. Para obtener más información sobre cómo configurar Docker mediante `daemon.json`, consulta [daemon.json](/reference/cli/dockerd/#daemon-configuration-file).



> [!NOTE]
>
> Si usas Docker Desktop, edita la configuración del demonio a través del
> panel de Docker Desktop. Abre **Settings** y selecciona **Docker Engine**.
> Para más detalles, consulta
> [Configuración de Docker Engine](/desktop/settings-and-maintenance/settings/#docker-engine).


El siguiente ejemplo establece el controlador de registro en `journald`:

```json
{
  "log-driver": "journald"
}
```

Reinicia Docker para que los cambios surtan efecto.

Para configurar el controlador de registro para un contenedor específico, utiliza la opción `--log-driver` en el comando `docker run`.

```console
$ docker run --log-driver=journald ...
```

## Opciones

Utiliza la opción `--log-opt NOMBRE=VALOR` para especificar opciones adicionales del controlador de registro `journald`.

| Opción         | Requerido | Descripción                                                                                                                                                                                                        |
| :------------- | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `tag`          | opcional  | Especifica la plantilla para establecer el valor de `CONTAINER_TAG` y `SYSLOG_IDENTIFIER` en los registros de journald. Consulta la [documentación de la etiqueta de registro](/engine/logging/drivers/journald/log_tags/) para personalizar el formato. |
| `labels`       | opcional  | Lista de claves de etiquetas separadas por comas que deben incluirse en el mensaje, si estas etiquetas se especifican para el contenedor.                                                                          |
| `labels-regex` | opcional  | Similar y compatible con labels. Una expresión regular para hacer coincidir etiquetas relacionadas con el registro. Se utiliza para opciones avanzadas de [etiquetas de registro](/engine/logging/drivers/journald/log_tags/).                    |
| `env`          | opcional  | Lista de claves de variables de entorno separadas por comas que deben incluirse en el mensaje, si estas variables se especifican para el contenedor.                                                               |
| `env-regex`    | opcional  | Similar y compatible con `env`. Una expresión regular para hacer coincidir variables de entorno relacionadas con el registro. Se utiliza para opciones avanzadas de [etiquetas de registro](/engine/logging/drivers/journald/log_tags/).          |

Si ocurre una colisión entre las opciones `label` y `env`, el valor de `env` tiene prioridad. Cada opción añade campos adicionales a los atributos de un mensaje de registro.

El siguiente es un ejemplo de las opciones de registro requeridas para registrar en journald.

```console
$ docker run \
    --log-driver=journald \
    --log-opt labels=location \
    --log-opt env=TEST \
    --env "TEST=false" \
    --label location=west \
    su/aplicacion
```

Esta configuración también indica al controlador que incluya en la carga útil el valor de la etiqueta `location` y la variable de entorno `TEST`. Si se omitieran los argumentos `--env "TEST=false"` o `--label location=west`, la clave correspondiente no se establecería en el registro de journald.

## Nota sobre los nombres de los contenedores

El valor registrado en el campo `CONTAINER_NAME` es el nombre del contenedor establecido al arrancar. Si utilizas `docker rename` para renombrar un contenedor, el nuevo nombre no se refleja en las entradas del diario. Las entradas del diario continúan utilizando el nombre original.

## Recuperar mensajes de registro con `journalctl`

Utiliza el comando `journalctl` para recuperar los mensajes de registro. Puedes aplicar expresiones de filtro para limitar los mensajes recuperados a aquellos asociados con un contenedor específico:

```console
$ sudo journalctl CONTAINER_NAME=webserver
```

Puedes utilizar filtros adicionales para limitar aún más los mensajes recuperados. La opción `-b` solo recupera los mensajes generados desde el último arranque del sistema:

```console
$ sudo journalctl -b CONTAINER_NAME=webserver
```

La opción `-o` especifica el formato para los mensajes de registro recuperados. Utiliza `-o json` para devolver los mensajes de registro en formato JSON.

```console
$ sudo journalctl -o json CONTAINER_NAME=webserver
```

### Ver los registros de un contenedor con un TTY habilitado

Si un contenedor tiene el TTY habilitado, es posible que veas `[10B blob data]` en la salida al recuperar los mensajes de registro.
La razón de esto es que se añade `\r` al final de la línea y `journalctl` no lo elimina automáticamente a menos que se configure `--all`:

```console
$ sudo journalctl -b CONTAINER_NAME=webserver --all
```

## Recuperar mensajes de registro con la API de `journal`

Este ejemplo utiliza el módulo Python de `systemd` para recuperar los registros del contenedor:

```python
import systemd.journal

reader = systemd.journal.Reader()
reader.add_match('CONTAINER_NAME=web')

for msg in reader:
    print '{CONTAINER_ID_FULL}: {MESSAGE}'.format(**msg)
```

