Todos los productos
Search
Centro de documentos

Simple Log Service:Recopilación de registros de texto de pods de Kubernetes (modo sidecar)

Última actualización: Sep 03, 2026

El modo sidecar inyecta un contenedor dedicado de LoongCollector (Logtail) en cada pod de aplicación para recopilar registros por pod. Es ideal cuando se requiere control detallado, aislamiento multiinquilino o una recopilación de registros vinculada al ciclo de vida.

Funcionamiento

En el modo sidecar, el contenedor de la aplicación y un contenedor de LoongCollector (Logtail) se ejecutan juntos en un mismo pod. Ambos comparten volúmenes para acceder a los registros y sincronizar sus ciclos de vida.

  • Uso compartido de registros: El contenedor de la aplicación escribe los registros en un volumen compartido (generalmente un emptyDir). El contenedor de LoongCollector (Logtail) monta este volumen en modo de solo lectura para recopilar los datos en tiempo real.

  • Asociación de configuración: Cada sidecar de LoongCollector (Logtail) declara su identidad mediante un custom identifier único. Un grupo de máquinas en la consola de SLS con el mismo identificador distribuye las configuraciones de recopilación a todos los sidecars coincidentes.

  • Sincronización del ciclo de vida: Los archivos de señal (cornerstone y tombstone) en el volumen compartido coordinan el apagado de los contenedores. Junto con el graceful termination period (terminationGracePeriodSeconds), garantizan que LoongCollector (Logtail) termine de enviar los registros pendientes antes de que el pod finalice.

Antes de empezar

Cree un Project y un logstore para almacenar sus registros. Si ya cuenta con ellos, continúe con Step 1: Inject the LoongCollector Sidecar Container.

  • Project: Unidad de gestión de recursos en SLS que aísla los registros por proyecto o servicio.

  • logstore: Unidad de almacenamiento para registros.

Crear un project

  1. Inicie sesión en la consola de Simple Log Service.

  2. Haga clic en Create Project y configure los siguientes parámetros:

    • Region: Seleccione la región de su origen de registros. No se puede modificar después de la creación.

    • Project Name: Debe ser único a nivel global en Alibaba Cloud. No se puede modificar después de la creación.

    • Deje los demás parámetros con su configuración predeterminada y haga clic en Create. En Create Project encontrará la descripción de los otros parámetros.

Crear un logstore

  1. Haga clic en el nombre de su Project.

  2. En el panel de navegación izquierdo, seleccione imageLog Storage y luego haga clic en +.

  3. En la página Create logstore, configure los siguientes parámetros principales:

    • Logstore Name: Debe ser único dentro del Project. No se puede modificar después de la creación.

    • Logstore Type: Seleccione Standard o Query según la comparación de funciones.

    • Billing Mode:

      • Pay-by-feature: Se factura de forma independiente por almacenamiento, indexación y operaciones de lectura/escritura. Ideal para uso a pequeña escala o impredecible.

      • Pay-by-ingested-data: Se factura únicamente por los datos sin procesar ingeridos. Incluye 30 días de almacenamiento gratuito, así como procesamiento y envío de datos sin costo. Recomendado cuando la retención es de aproximadamente 30 días o los pipelines son complejos.

    • Data Retention Period: Retención de registros en días. Rango: de 1 a 3,650 (3,650 equivale a permanente). Valor predeterminado: 30.

    • Deje los demás parámetros con su configuración predeterminada y haga clic en OK. En Manage logstore encontrará la descripción de los otros parámetros.

Paso 1: Inyectar el contenedor sidecar de LoongCollector

Inyecte un contenedor sidecar de LoongCollector en su pod de aplicación con un volumen compartido para la recopilación de registros. Para una prueba rápida, utilice Appendix: YAML example.

1. Modificar la configuración YAML del pod

  1. Definir volúmenes compartidos

    En spec.template.spec.volumes, agregue tres volúmenes compartidos al mismo nivel que containers:

    volumes:
      # Shared log directory (written by the application container, read by the sidecar)
      - name: ${shared_volume_name} # <-- The name must match the name in volumeMounts
        emptyDir: {}
      # Signal directory for inter-container communication (for graceful start/stop)
      - name: tasksite
        emptyDir:
          medium: Memory  # Use memory as the medium for better performance
          sizeLimit: "50Mi"
      # Shared host time zone configuration: Synchronizes the time zone for all containers in the pod
      - name: tz-config # <-- The name must match the name in volumeMounts
        hostPath:
          path: /usr/share/zoneinfo/Asia/Shanghai  # Modify the time zone as needed
    
  2. Configurar los puntos de montaje del contenedor de la aplicación

    En la sección volumeMounts de su contenedor de aplicación, como your-business-app-container, agregue los siguientes puntos de montaje de volumen:

    Asegúrese de que el contenedor de la aplicación escriba los registros en el directorio ${shared_volume_path} para que LoongCollector pueda recopilarlos.
    volumeMounts:
      # Mount the shared log volume to the application log output directory
      - name: ${shared_volume_name}
        mountPath: ${shared_volume_path}  # Example: /var/log/app
      # Mount the communication directory
      - name: tasksite
        mountPath: /tasksite  # Shared directory for communication with the LoongCollector container
      # Mount the timezone file
      - name: tz-config
        mountPath: /etc/localtime
        readOnly: true
    
  3. Inyectar el contenedor sidecar de LoongCollector

    En el arreglo spec.template.spec.containers, añada la siguiente definición de contenedor sidecar:

    - name: loongcollector
      image: aliyun-observability-release-registry.cn-shenzhen.cr.aliyuncs.com/loongcollector/loongcollector:v3.1.1.0-20fa5eb-aliyun
      command: ["/bin/bash", "-c"]
      args:
        - |
          echo "[$(date)] LoongCollector: Starting initialization"
          # Start the LoongCollector service
          /etc/init.d/loongcollectord start
          # Wait for the configuration to download and the service to be ready
          sleep 15
          # Verify the service status
          if /etc/init.d/loongcollectord status; then
            echo "[$(date)] LoongCollector: Service started successfully"
            touch /tasksite/cornerstone
          else
            echo "[$(date)] LoongCollector: Failed to start service"
            exit 1
          fi
          # Wait for the application container to complete (via the tombstone file signal)
          echo "[$(date)] LoongCollector: Waiting for application container to complete"
          until [[ -f /tasksite/tombstone ]]; do
            sleep 2
          done
          # Allow time to upload remaining logs
          echo "[$(date)] LoongCollector: Business completed, waiting for log transmission"
          sleep 30
          # Stop the service
          echo "[$(date)] LoongCollector: Stopping service"
          /etc/init.d/loongcollectord stop
          echo "[$(date)] LoongCollector: Shutdown complete"
      # health check
      livenessProbe:
        exec:
          command: ["/etc/init.d/loongcollectord", "status"]
        initialDelaySeconds: 30
        periodSeconds: 10
        timeoutSeconds: 5
        failureThreshold: 3
      # resource configuration
      resources:
        requests:
          cpu: "100m"
          memory: "128Mi"
        limits:
          cpu: "2000m"
          memory: "2048Mi"
      # environment variable configuration
      env:
        - name: ALIYUN_LOGTAIL_USER_ID
          value: "${your_aliyun_user_id}"
        - name: ALIYUN_LOGTAIL_USER_DEFINED_ID
          value: "${your_machine_group_user_defined_id}"
        - name: ALIYUN_LOGTAIL_CONFIG
          value: "/etc/ilogtail/conf/${your_region_config}/ilogtail_config.json"
        # Enable full drain mode to ensure all logs are sent before the pod terminates
        - name: enable_full_drain_mode
          value: "true"  
        # Append pod environment information as log tags
        - name: ALIYUN_LOG_ENV_TAGS
          value: "_pod_name_|_pod_ip_|_namespace_|_node_name_|_node_ip_"
        # Automatically inject pod and node metadata as log tags
        - name: "_pod_name_"
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: "_pod_ip_"
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: "_namespace_"
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: "_node_name_"
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: "_node_ip_"
          valueFrom:
            fieldRef:
              fieldPath: status.hostIP
      # Volume mounts (shared with the application container)
      volumeMounts:
        # Read-only mount for the application log directory
        - name: ${shared_volume_name} # <-- Shared log directory name
          mountPath: ${dir_containing_your_files} # <-- Path to the shared directory in the sidecar
          readOnly: true
        # Mount the communication directory
        - name: tasksite
          mountPath: /tasksite
        # Mount the timezone
        - name: tz-config
          mountPath: /etc/localtime
          readOnly: true
    

2. Adaptar la lógica del ciclo de vida del contenedor de la aplicación

Según el tipo de carga de trabajo, modifique el contenedor de la aplicación para admitir una salida coordinada con el sidecar:

Tareas de corta duración (Job/CronJob)

# 1. Wait for LoongCollector to be ready
echo "[$(date)] Application: Waiting for LoongCollector to be ready..."
until [[ -f /tasksite/cornerstone ]]; do
  sleep 1
done
echo "[$(date)] Application: LoongCollector is ready, starting application logic"
# 2. Execute core application logic (ensure logs are written to the shared directory)
echo "Hello, World!" >> /app/logs/business.log
# 3. Save the exit code
retcode=$?
echo "[$(date)] Application: Task completed with exit code: $retcode"
# 4. Notify LoongCollector that the application task is complete
touch /tasksite/tombstone
echo "[$(date)] Application: Tombstone created, exiting"
exit $retcode

Servicios de larga duración (Deployment / StatefulSet)

# Define the signal handler function
_term_handler() {
    echo "[$(date)] [nginx-demo] Caught SIGTERM, starting graceful shutdown..."
    # Send a QUIT signal to Nginx for a graceful stop
    if [ -n "$NGINX_PID" ]; then
        kill -QUIT "$NGINX_PID" 2>/dev/null || true
        echo "[$(date)] [nginx-demo] Sent SIGQUIT to Nginx PID: $NGINX_PID"
        # Wait for Nginx to stop gracefully
        wait "$NGINX_PID"
        EXIT_CODE=$?
        echo "[$(date)] [nginx-demo] Nginx stopped with exit code: $EXIT_CODE"
    fi
    # Notify LoongCollector that the application container has stopped
    echo "[$(date)] [nginx-demo] Writing tombstone file"
    touch /tasksite/tombstone
    exit $EXIT_CODE
}
# Register the signal handler
trap _term_handler SIGTERM SIGINT SIGQUIT
# Wait for LoongCollector to be ready
echo "[$(date)] [nginx-demo]: Waiting for LoongCollector to be ready..."
until [[ -f /tasksite/cornerstone ]]; do 
    sleep 1
done
echo "[$(date)] [nginx-demo]: LoongCollector is ready, starting application logic"
# Start Nginx
echo "[$(date)] [nginx-demo] Starting Nginx..."
nginx -g 'daemon off;' &
NGINX_PID=$!
echo "[$(date)] [nginx-demo] Nginx started with PID: $NGINX_PID"
# Wait for the Nginx process
wait $NGINX_PID
EXIT_CODE=$?
# Also notify LoongCollector if the exit was not caused by a signal
if [ ! -f /tasksite/tombstone ]; then
    echo "[$(date)] [nginx-demo] Unexpected exit, writing tombstone"
    touch /tasksite/tombstone
fi
exit $EXIT_CODE

3. Establecer el periodo de terminación elegante

En spec.template.spec, establezca un periodo de terminación elegante lo suficientemente largo para permitir que LoongCollector cargue todos los registros restantes.

spec:
  # ... Your other existing spec configurations ...
  template:
    spec:
      terminationGracePeriodSeconds: 600  # 10-minute graceful stop period

4. Variables

Parámetro

Descripción

${your_aliyun_user_id}

El ID de su cuenta de Alibaba Cloud. Configure user identifiers.

${your_machine_group_user_defined_id}

Identificador personalizado utilizado para crear un grupo de máquinas. Ejemplo: nginx-log-sidecar.

Importante

Asegúrese de que este identificador sea único dentro de la región del Project.

${your_region_config}

La configuración correspondiente a la región y al tipo de acceso de red de su Project de SLS. Service regions.

Ejemplo: Si su Project está en la región China (Hangzhou), utilice cn-hangzhou para acceso por red interna de Alibaba Cloud o cn-hangzhou-internet para acceso por red pública.

${shared_volume_name}

Nombre personalizado para el volumen compartido.

Importante

El valor de name en volumeMounts debe coincidir con el valor de name en volumes. Esto garantiza que ambos contenedores monten el mismo volumen compartido.

${dir_containing_your_files}

Ruta de montaje en el contenedor de LoongCollector donde se encuentran los registros de texto.

5. Aplicar la configuración y verificar

  1. Ejecute el siguiente comando para desplegar los cambios:

    kubectl apply -f <YOUR-YAML>
  2. Compruebe el estado del pod para confirmar que el contenedor de LoongCollector se inyectó correctamente:

    kubectl describe pod <YOUR-POD-NAME>

    Si observa dos contenedores (el de la aplicación y loongcollector) y su estado es Running, la inyección se realizó correctamente.

Paso 2: Crear un grupo de máquinas con identificador personalizado

Registra las instancias sidecar de LoongCollector en SLS para gestionar centralizadamente la configuración de recopilación.

Procedimiento

  1. Crear un grupo de máquinas

    1. Vaya al project deseado. En el panel de navegación izquierdo, haga clic en imageResources > Machine Groups.

    2. En la página Machine Groups, haga clic en Machine group icon > Create Machine Group.

  2. Configurar el grupo de máquinas

    Configure los siguientes parámetros y haga clic en OK:

    • Name: Nombre del grupo de máquinas. No se puede modificar después de la creación. Debe cumplir los siguientes requisitos:

      • Contener únicamente letras minúsculas, dígitos, guiones (-) y guiones bajos (_).

      • Comenzar y terminar con una letra minúscula o un dígito.

      • Tener entre 2 y 128 caracteres de longitud.

    • Machine Group Identifier: Seleccione Custom Identifier.

    • Custom Identifier: Introduzca el valor de la variable de entorno ALIYUN_LOGTAIL_USER_DEFINED_ID que estableció para el contenedor de LoongCollector en el archivo YAML en Step 1. El valor debe coincidir exactamente. De lo contrario, la asociación fallará.

  3. Verificar el estado de latido del grupo de máquinas

    Después de crear el grupo de máquinas, haga clic en su nombre para comprobar el estado de latido en la sección Machine Group Status.

    • OK: LoongCollector se conectó a SLS y el grupo de máquinas quedó registrado.

    • FAIL:

      • El cambio de configuración puede tardar hasta dos minutos en surtir efecto. Actualice la página y vuelva a comprobar el estado.

      • Si el estado sigue siendo FAIL después de dos minutos, consulte Troubleshoot Logtail machine group issues.

Cada pod corresponde a una instancia independiente de LoongCollector. Para una gestión más granular, utilice identificadores personalizados distintos para diferentes aplicaciones o entornos.

Paso 3: Crear una configuración de recopilación

Una configuración de recopilación define qué archivos de registro recopila LoongCollector, cómo analizarlos sintácticamente y qué contenido filtrar.

Procedimiento

  1. En la página image Logstore, haga clic en el icono image situado antes del nombre del logstore deseado para expandirlo.

  2. Haga clic en image junto a Data Collection. En el cuadro de diálogo Quick Data Import, busque la tarjeta Kubernetes - File y haga clic en Integrate Now.

  3. Configure Machine Group Configurations y luego haga clic en Next.

    • Scenario: Seleccione Kubernetes Clusters.

    • Deployment Method: Seleccione Sidecar.

    • Select Machine Group: En la lista Source Machine Group, seleccione el grupo de máquinas que creó en Step 2. Haga clic en image para moverlo a la lista Applied Machine Group.

  4. En la página Logtail Configurations, configure las reglas de recopilación de Logtail.

1. Configuraciones globales y de entrada

Defina el nombre, el origen de los registros y el alcance de la recopilación para la configuración.

Global Configurations:

  • Configuration Name: Nombre personalizado para la configuración de recopilación. Debe ser único dentro de su project. No se puede modificar después de la creación. Convenciones de nomenclatura:

    • Solo puede contener letras minúsculas, dígitos, guiones (-) y guiones bajos (_).

    • Debe comenzar y terminar con una letra minúscula o un dígito.

Input Configurations:

  • Type: Seleccione Text Log Collection.

  • Logtail Deployment Mode: Seleccione Sidecar.

  • File Path Type:

    • Path in Container: Recopila archivos de registro desde dentro de un contenedor.

    • Host Path: Recopila registros de servicios locales del host.

  • File Path: Ruta para la recopilación de registros.

    • Linux: La ruta debe comenzar con una barra diagonal (/). Por ejemplo, /data/mylogs/**/*.log especifica todos los archivos con extensión .log en el directorio /data/mylogs y sus subdirectorios.

    • Windows: La ruta debe comenzar con una letra de unidad, como C:\Program Files\Intel\**\*.Log.

  • Maximum Directory Monitoring Depth: Especifica la profundidad máxima de directorios para el comodín ** en File Path. El valor predeterminado de 0 monitorea únicamente el directorio actual.

2. Procesamiento y estructuración de registros

Configure reglas de procesamiento de registros para transformar datos sin procesar y no estructurados en datos estructurados y consultables. Esto mejora la eficiencia de las consultas y el análisis de registros. Se recomienda agregar una muestra de registro antes de configurar las reglas:

En la página Logtail Configuration, dentro del área Processor Configurations, haga clic en Add Sample Log e introduzca el contenido del registro que desea recopilar. El sistema identifica el formato del registro basándose en la muestra y ayuda a generar expresiones regulares y reglas de análisis sintáctico, lo cual simplifica la configuración.

Escenario 1: Manejo de registros multilínea (como trazas de pila de Java)

Registros como las pilas de excepciones de Java y los objetos JSON suelen abarcar varias líneas. En el modo de recopilación predeterminado, se dividen en múltiples registros incompletos, lo que provoca pérdida de contexto. Para evitarlo, habilite el modo multilínea y configure una expresión regular de inicio de línea para fusionar las líneas consecutivas de un mismo registro en una sola entrada completa.

Ejemplo:

Registro sin procesar

En el modo de recopilación predeterminado, cada línea se trata como un registro independiente. La traza de pila se fragmenta y se pierde el contexto.

Con el modo multilínea habilitado, una expresión regular de inicio de línea identifica los registros completos y preserva toda la estructura semántica.

2025-11-13 10:52:20.557 ERROR [app-thread-0] --- java.sql.SQLException: No suitable driver found for jdbc:mysql://db.host:3306/prod_db
    at com.datastore.util.DataProcessor.save(DataProcessor.java:434)
    at io.awesomeapp.util.PaymentGateway.fetchData(PaymentGateway.java:463)
    at org.awesomeapp.util.UserService.processRequest(UserService.java:252)
    at io.datastore.service.DatabaseConnector.fetchData(DatabaseConnector.java:172)
    at org.datastore.service.UserService.fetchData(UserService.java:517)

En el modo predeterminado, este registro se divide en 6 registros independientes: el primero contiene solo el mensaje de error java.sql.SQLException, mientras que los 5 marcos de pila restantes (como at com.datastore.util.DataProcessor.save(...)) se almacenan como entradas separadas. Los marcos de pila no se pueden correlacionar con la excepción original mediante consultas, lo que obliga a reconstruir manualmente el contexto para solucionar problemas.

Al habilitar el modo multilínea, el registro de error java.sql.SQLException: No suitable driver found for jdbc:mysql://db.host:3306/prod_db junto con sus 5 marcos de pila (DataProcessor.save → UserService.fetchData) se recopila como un solo registro en el servicio de consulta de registros. La columna de metadatos también muestra la IP, el nombre del host, la ruta del registro y otros campos.

Procedimiento: En la página Logtail Configuration, dentro del área Processor Configurations, habilite Multi-line Mode:

  • Type: Seleccione Custom o Multi-line JSON.

    • Custom: El formato del registro sin procesar no es fijo. Debe configurar una Regex to Match First Line para identificar la línea inicial de cada entrada de registro.

      • Regex to Match First Line: Puede generarla automáticamente o introducirla manualmente. La expresión regular debe coincidir con una línea completa de datos. Por ejemplo, la expresión regular de coincidencia del ejemplo anterior es \[\d+-\d+-\w+:\d+:\d+,\d+]\s\[\w+]\s.*.

        • Generación automática: Haga clic en Generate Regex Automatically. Luego, en el cuadro de texto Log Sample, seleccione el contenido del registro a extraer y haga clic en Generate Regex.

          El modo heredado de recopilación de salida estándar de Kubernetes no admite la función Add Log Sample ni la generación automática de expresiones regulares. Para probar una expresión regular, cree un LogStore de tipo registro de texto, pruebe la expresión regular en dicho LogStore y luego pegue la expresión regular en la configuración de Logtail del LogStore destino.

        • Entrada manual: Haga clic en Enter Regex Manually. Después de introducir la expresión, haga clic en Validate.

    • Multi-line JSON: Cuando todos los registros sin procesar tienen formato JSON estándar, Simple Log Service maneja automáticamente los saltos de línea dentro de un solo registro JSON.

  • Processing Method If Splitting Fails:

    • Discard: Si un segmento de texto no coincide con la regla de inicio de línea, se descarta.

    • Retain Single Line: El texto no coincidente se divide y se conserva en el modo original de una sola línea.

Escenario 2: Registros estructurados

Cuando los registros sin procesar son texto no estructurado o semiestructurado, como registros de acceso de NGINX o registros de salida de aplicaciones, la consulta y el análisis directos suelen ser ineficientes. Simple Log Service ofrece diversos plugins de análisis de datos que convierten automáticamente registros sin procesar de diferentes formatos en datos estructurados. Esto proporciona una base sólida para el análisis, el monitoreo y las alertas posteriores.

Ejemplo:

Registro sin procesar

Registro tras el análisis estructurado

192,168.*.* - - [15/Apr/2025:16:40:00 +0800] "GET /nginx-logo.png HTTP/1.1" 0.000 514 200 368 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.*.* Safari/537.36"
body_bytes_sent: 368
    http_referer: -
    http_user_agent : Mozi11a/5.0 (Nindows NT 10.0; Win64; x64) AppleMebKit/537.36 (KHTML, like Gecko) Chrome/131.0.x.x Safari/537.36
    remote_addr:192,168.*.*
    remote_user: -
    request_length: 514
    request_method: GET
    request_time: 0.000
    request_uri: /nginx-logo.png
    status: 200
    time_local: 15/Apr/2025:16:40:00

Pasos de configuración: En el área Processor Configurations de la página Logtail Configurations:

  1. Agregar un plugin de análisis sintáctico: Haga clic en Add Processor y configure un plugin, como un regular expression, delimiter, or JSON parsing plugin, según el formato de sus registros. Por ejemplo, para recopilar registros de NGINX, seleccione Native Processor > Data Parsing (NGINX Mode).

  2. NGINX Log Configuration: Copie la definición completa de log_format del archivo de configuración de su servidor Nginx (nginx.conf) y péguela en este cuadro de texto.

    Ejemplo:

    log_format main  '$remote_addr - $remote_user [$time_local] "$request" ''$request_time $request_length ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent"';
    Importante

    La definición de formato debe coincidir exactamente con el log_format de su servidor. De lo contrario, el análisis sintáctico fallará.

  3. Descripción de parámetros de configuración generales: Los siguientes parámetros son comunes a muchos plugins de análisis sintáctico y tienen funciones consistentes.

    • Original Field: Especifica el campo de origen que se va a analizar. El valor predeterminado es content, que corresponde a toda la entrada de registro recopilada.

    • Retain Original Field if Parsing Fails: Recomendado. Si el plugin no logra analizar sintácticamente un registro, esta opción conserva el contenido sin procesar en el campo original.

    • Retain Original Field if Parsing Succeeds: Si se selecciona, esta opción conserva el contenido sin procesar incluso después de un análisis sintáctico exitoso.

3. Filtrado de registros

Los grandes volúmenes de registros de bajo valor (como los de nivel DEBUG o INFO) desperdician almacenamiento, incrementan costos, reducen la eficiencia de las consultas y generan riesgos de fuga de datos. Configure directivas de filtrado para lograr una recolección de registros eficiente y segura.

Filtrado por contenido

Es posible filtrar con base en los campos del contenido del registro; por ejemplo, recolectar únicamente los registros con nivel WARNING o ERROR.

Ejemplo:

Registro original sin procesamiento

Recolectar solo registros WARNING o ERROR

{"level":"WARNING","timestamp":"2025-09-23T19:11:40+0800","cluster":"yilu-cluster-0728","message":"Disk space is running low","freeSpace":"15%"}
{"level":"ERROR","timestamp":"2025-09-23T19:11:42+0800","cluster":"yilu-cluster-0728","message":"Failed to connect to database","errorCode":5003}
{"level":"INFO","timestamp":"2025-09-23T19:11:47+0800","cluster":"yilu-cluster-0728","message":"User logged in successfully","userId":"user-123"}
{"level":"WARNING","timestamp":"2025-09-23T19:11:40+0800","cluster":"yilu-cluster-0728","message":"Disk space is running low","freeSpace":"15%"}
    {"level":"ERROR","timestamp":"2025-09-23T19:11:42+0800","cluster":"yilu-cluster-0728","message":"Failed to connect to database","errorCode":5003}

Procedimiento: En el área Processor Configurations de la página Logtail Configuration

Haga clic en Add Processor y seleccione Native Processor > Data Filtering:

  • Field Name: Campo del registro que se utilizará para el filtrado.

  • Field Value: Expresión regular empleada para el filtrado. Solo se admite la coincidencia de texto completo; no se admite la coincidencia parcial por palabra clave.

Lista de bloqueados de recolección

Utilice una lista de bloqueados para excluir directorios o archivos específicos y evitar que se carguen registros irrelevantes o sensibles.

Procedimiento: En la página Logtail Configuration, dentro del área Input Configurations > Other Input Configurations, habilite Collection Blacklist y haga clic en Add.

Se admite la coincidencia exacta y la coincidencia con comodines para directorios y nombres de archivo. Los únicos caracteres comodín disponibles son el asterisco (*) y el signo de interrogación (?).
  • File Path Blacklist: Rutas de archivo que se deben ignorar. Ejemplos:

    • /home/admin/private*.log: Ignora todos los archivos del directorio /home/admin/ que comienzan con "private" y terminan con ".log".

    • /home/admin/private*/*_inner.log: Ignora los archivos que terminan con "_inner.log" dentro de los directorios que comienzan con "private" bajo el directorio /home/admin/.

  • File Blacklist: Nombres de archivo que se deben ignorar durante la recolección. Ejemplo:

    • app_inner.log: Ignora todos los archivos llamados app_inner.log.

  • Directory Blacklist: La ruta del directorio no debe terminar con una barra diagonal (/). Ejemplos:

    • /home/admin/dir1/: La lista de bloqueados de directorios no surtirá efecto.

    • /home/admin/dir*: Ignora los archivos de todos los subdirectorios bajo /home/admin/ que comienzan con "dir".

    • /home/admin/*/dir: Ignora todos los archivos en los subdirectorios llamados "dir" que se encuentran en el segundo nivel bajo el directorio /home/admin/. Por ejemplo, se ignoran los archivos del directorio /home/admin/a/dir, mientras que se recolectan los del directorio /home/admin/a/b/dir.

Filtrado de contenedores

Establezca condiciones de recolección con base en los metadatos del contenedor (variables de entorno, etiquetas de Pod, namespaces, nombres de contenedor) para controlar qué registros de contenedores se recolectan.

Pasos de configuración: En la página Logtail Configurations, dentro del área Input Configurations, habilite Container Filtering y haga clic en Add.

Varias condiciones tienen una relación "AND". Todas las coincidencias de expresiones regulares se basan en el motor de expresiones regulares RE2 de Go, el cual presenta algunas limitaciones en comparación con motores como PCRE. Siga las indicaciones de Appendix: Regular expression limits (container filtering) al escribir expresiones regulares.
  • Lista de bloqueados/permitidos de variables de entorno: Filtra contenedores según sus variables de entorno.

  • Lista de bloqueados/permitidos de etiquetas de Pod de K8s: Filtra contenedores según las etiquetas de Pod de sus pods anfitriones.

  • Coincidencia regex de nombre de Pod de K8s: Filtra contenedores según el nombre de su Pod.

  • Coincidencia regex de Namespace de K8s: Filtra contenedores según su namespace.

  • Coincidencia regex de nombre de contenedor de K8s: Filtra contenedores según su nombre.

  • Lista de bloqueados/permitidos de etiquetas de contenedor: Filtra contenedores según sus etiquetas. Este método está diseñado para Docker y no se recomienda para Kubernetes.

4. Clasificación de registros

Cuando varias aplicaciones comparten el mismo formato de registro, resulta difícil distinguir el origen de cada uno. Configure temas de registro y etiquetado de registros para automatizar la asociación de contexto y la clasificación lógica.

Temas de registro

Si varias aplicaciones generan registros con el mismo formato pero en rutas distintas (como /apps/app-A/run.log y /apps/app-B/run.log), genere un tema para diferenciar los registros de cada servicio.

Procedimiento: En Global Configurations > Other Global Configurations > Log Topic Type, seleccione un método para generar temas. Se admiten los siguientes tres tipos:

  • Tema de grupo de máquinas: Cuando una configuración de recolección se aplica a varios grupos de máquinas, LoongCollector utiliza automáticamente el nombre del grupo de máquinas del servidor como valor del campo __topic__ para la carga. Esta opción es adecuada para escenarios donde los registros se clasifican por host.

  • Custom: El formato es customized://<custom_topic_name>; por ejemplo, customized://app-login. Resulta útil para escenarios de temas estáticos con identificadores de servicio fijos.

  • Extracción de ruta de archivo: Extrae información clave de la ruta completa del archivo de registro para marcar dinámicamente el origen del registro. Es útil cuando varios usuarios o aplicaciones comparten el mismo nombre de archivo de registro pero tienen rutas diferentes. Si varios usuarios o servicios escriben registros en distintos directorios de nivel superior, pero las subrutas y los nombres de archivo son idénticos, el origen no puede distinguirse solo por el nombre del archivo. Por ejemplo:

    /data/logs
    ├── userA
    │   └── serviceA
    │       └── service.log
    ├── userB
    │   └── serviceA
    │       └── service.log
    └── userC
        └── serviceA
            └── service.log

    En este caso, configure Extracción de ruta de archivo y utilice una expresión regular para extraer información clave de la ruta completa. El resultado coincidente se carga luego al Logstore como tema.

    Regla de extracción de ruta de archivo: Basada en grupos de captura de expresiones regulares

    Al configurar una expresión regular, el sistema determina automáticamente el formato del campo de salida según la cantidad y el nombre de los grupos de captura. Las reglas son las siguientes:

    En la expresión regular para la ruta de archivo, debe escapar la barra diagonal (/).

    Tipo de grupo de captura

    Escenario

    Campo generado

    Ejemplo de regex

    Ejemplo de ruta coincidente

    Ejemplo de campo generado

    Grupo de captura único (solo un (.*?))

    Solo se requiere una dimensión para distinguir el origen (como nombre de usuario o entorno)

    Genera el campo __topic__

    \/logs\/(.*?)\/app\.log

    /logs/userA/app.log

    __topic__: userA

    Varios grupos de captura sin nombre (varios (.*?))

    Se necesitan varias dimensiones para distinguir el origen, pero no se requieren etiquetas semánticas

    Genera un campo de etiqueta __tag__:__topic_{i}__, donde {i} es el número ordinal del grupo de captura

    \/logs\/(.*?)\/(.*?)\/app\.log

    /logs/userA/svcA/app.log

    __tag__:__topic_1__userA

    __tag__:__topic_2__svcA

    Varios grupos de captura con nombre (mediante (?P<name>.*?))

    Se necesitan varias dimensiones para distinguir el origen y se desea que los significados de los campos sean claros para facilitar consultas y análisis

    Genera un campo de etiqueta __tag__:{name}

    \/logs\/(?P<user>.*?)\/(?P<service>.*?)\/app\.log

    /logs/userA/svcA/app.log

    __tag__:user:userA;

    __tag__:service:svcA

Etiquetado de registros

Habilite el enriquecimiento de etiquetas de registro para extraer información clave de las variables de entorno del contenedor o de las etiquetas de Pod de Kubernetes y usarlas como etiquetas para una agrupación detallada de registros.

Pasos de configuración: En el área Input Configurations de la página Logtail Configurations, habilite Log Tag Enrichment y haga clic en Add.

  • Environment Variables: Configure el nombre de la variable de entorno y el nombre de la etiqueta. El valor de la variable de entorno se almacena como valor de la etiqueta.

    • Nombre de la variable de entorno: Nombre de la variable de entorno que se va a extraer.

    • Nombre de la etiqueta: Nombre de la etiqueta.

  • Pod Labels: Configure el nombre de la etiqueta de Pod y el nombre de la etiqueta. El valor de la etiqueta de Pod se almacena como valor de la etiqueta.

    • Nombre de la etiqueta de Pod: Nombre de la etiqueta de Pod de Kubernetes que se va a extraer.

    • Nombre de la etiqueta: Nombre de la etiqueta.

5. Configuración de salida

De forma predeterminada, todos los registros se envían al Logstore actual con compresión lz4. Para distribuir registros en varios Logstores, configure destinos de salida adicionales.

Distribución dinámica a múltiples destinos

Importante
  • La distribución a múltiples destinos solo está disponible en LoongCollector 3.0.0 y versiones posteriores. Logtail no admite esta función.

  • Se pueden configurar hasta cinco destinos de salida.

  • Después de configurar varios destinos de salida, la configuración de recolección deja de aparecer en la lista de configuraciones de recolección del Logstore actual. Para consultar, modificar o eliminar una configuración de distribución a múltiples destinos, consulte Manage multi-destination distribution configurations.

Pasos de configuración: En el área Output Configurations de la página Logtail Configurations.

  1. Haga clic en image para expandir la configuración de salida.

  2. Haga clic en Add Output Targets y complete la siguiente configuración:

    • Logstores: Seleccione el Logstore de destino.

    • Compression Method: Se admiten lz4 y zstd.

    • Route Settings: Enruta los registros según los campos de etiqueta. El sistema carga los registros coincidentes en el Logstore de destino. Si esta configuración está vacía, el sistema carga todos los registros recolectados en este destino.

      • Tag Name: Nombre del campo de etiqueta utilizado para el enrutamiento. Introduzca únicamente el nombre del campo (por ejemplo, __path__), sin el prefijo __tag__:. Los campos de etiqueta se dividen en dos categorías:

        Las etiquetas se describen en Manage LoongCollector collection tags .
        • Relacionadas con el agente: Vinculadas al agente de recolección e independientes de los plugins. Algunos ejemplos son __hostname__ y __user_defined_id__.

        • Relacionadas con el plugin de entrada: Proporcionadas por los plugins de entrada para enriquecer los registros con información contextual. Algunos ejemplos incluyen __path__ para la recolección de archivos y _pod_name_ o _container_name_ para la recolección en Kubernetes.

      • Tag Value: Si el campo de etiqueta de un registro coincide con este valor, el sistema envía el registro a este Logstore de destino.

      • Discard this tag?: Si se habilita, el sistema elimina este campo de etiqueta de los registros antes de cargarlos.

Paso 4: Configurar consulta y análisis

Una vez que haya configurado el procesamiento de registros y los plugins, haga clic en Next para ir a la página Query and Analysis Configurations:

  • El sistema habilita de forma predeterminada full-text index, lo que permite realizar búsquedas por palabras clave en el contenido original del registro.

  • Para realizar consultas precisas por campo, espere a que se carguen los Preview Data en la página y luego haga clic en Automatic Index Generation. Simple Log Service genera un field index con base en la primera entrada de los datos de vista previa.

Una vez completada la configuración, haga clic en Next para finalizar la configuración de recolección.

Paso 5: Consultar los registros cargados

Después de crear una configuración de recolección y aplicarla a un grupo de máquinas, esta se despliega automáticamente y comienza a recolectar registros incrementales.

  1. Verificar nuevas entradas de registro: LoongCollector recolecta únicamente registros incrementales. Ejecute tail -f /path/to/your/log/file y utilice su aplicación para generar nuevas entradas de registro.

  2. Consultar registros: Vaya a la página Search & Analyze del Logstore objetivo y haga clic en Search & Analyze. El intervalo de tiempo predeterminado corresponde a los últimos 15 minutos. Compruebe si aparecen nuevos registros. Los campos predeterminados para registros de texto de contenedores son los siguientes:

    Parámetro

    Descripción

    tag:hostname

    Nombre del host del contenedor.

    tag:path

    Ruta del archivo de registro dentro del contenedor.

    tag:container_ip

    Dirección IP del contenedor.

    tag:image_name

    Nombre de la imagen que utiliza el contenedor.

    Nota

    Si varias imágenes tienen el mismo hash pero distintos nombres o etiquetas, la configuración de recolección selecciona uno de los nombres según el hash. No se garantiza que el nombre seleccionado coincida con el definido en el archivo YAML.

    tag:pod_name

    Nombre del pod.

    tag:namespace

    Namespace al que pertenece el pod.

    tag:pod_uid

    Identificador único (UID) del pod.

Configuraciones clave para la integridad de los registros

Estos parámetros de configuración afectan directamente la integridad y confiabilidad de la recolección de registros.

Configuración de recursos de LoongCollector

Una asignación adecuada de recursos es fundamental para el rendimiento de la recolección en escenarios de alto volumen. Parámetros clave:

# Configure CPU and memory resources based on the log generation rate
resources:
  limits:
    cpu: "2000m"       
    memory: "2Gi"
# Parameters that affect collection performance
env:
  - name: cpu_usage_limit
    value: "2"      
  - name: mem_usage_limit
    value: "2048"  
  - name: max_bytes_per_sec
    value: "209715200"
  - name: process_thread_count
    value: "8"                             
  - name: send_request_concurrency
    value: "20"                            

Para configurar Logtail según su volumen de datos, consulte Logtail network types, startup parameters, and configuration files.

Configuración de cuotas del lado del servidor

Los límites de cuota del lado del servidor o los problemas de red pueden bloquear la transmisión de datos y generar contrapresión que afecta la integridad de los registros. Use CloudLens for SLS to monitor Project resource quotas.

Optimización de la configuración inicial de recolección

La directiva inicial de recolección de archivos al iniciar el pod afecta la integridad de los registros, especialmente en escenarios de alto throughput.

El tamaño inicial de recolección especifica dónde comienza la recolección en un archivo nuevo. Valor predeterminado: 1024 KB.

  • Si un archivo tiene un tamaño inferior a 1024 KB, la recolección comienza desde su inicio.

  • Si un archivo supera los 1024 KB, la recolección comienza 1024 KB antes de su final.

  • El tamaño inicial de recolección puede variar entre 0 y 10,485,760 KB (10 GB).

enable_full_drain_mode

Garantiza que LoongCollector complete toda la recolección y transmisión de datos antes de finalizar al recibir una señal SIGTERM.

# Parameter that affects collection integrity
env:
  - name: enable_full_drain_mode
    value: "true"                          # Enable full drain mode

Preguntas frecuentes

Gestión de configuraciones de distribución a múltiples destinos

Las configuraciones de distribución a múltiples destinos se aplican a varios Logstores y deben gestionarse a nivel de Project:

  1. Inicie sesión en la consola de Log Service y haga clic en el nombre del Project objetivo.

  2. En la página del Project objetivo, dentro del panel de navegación izquierdo, haga clic en imageResources > Configurations.

    Nota

    Esta página centraliza la gestión de todas las configuraciones de recolección dentro del Project, incluidas aquellas que permanecen después de eliminar un Logstore.

Siguientes pasos

  1. Data visualization: Utilice un panel de visualización para supervisar tendencias en métricas clave.

  2. Automated alerting for data anomalies: Configure directivas de alerta para detectar anomalías del sistema en tiempo real.

  3. SLS recolecta únicamente registros incrementales. Para recolectar registros históricos, consulte Import historical log files.

Apéndice: Ejemplo de YAML

Configuración completa de Kubernetes con un contenedor de aplicación Nginx y un contenedor sidecar de LoongCollector.

Antes de utilizar esta configuración, reemplace los siguientes marcadores de posición:

  1. Reemplace ${your_aliyun_user_id} con el ID de su cuenta de Alibaba Cloud.

  2. Reemplace ${your_machine_group_user_defined_id} con el custom identifier of the machine group that you created in Step 3. El valor debe coincidir exactamente.

  3. Reemplace ${your_region_config} con el nombre de configuración que corresponda a la región y al tipo de red de su proyecto de SLS.

    Ejemplo: Si su proyecto se encuentra en la región China (Hangzhou), utilice cn-hangzhou para acceso por red interna o cn-hangzhou-internet para acceso por red pública.

Tareas de corta duración (Job/CronJob)

apiVersion: batch/v1
kind: Job
metadata:
  name: demo-job
spec:
  backoffLimit: 3                   
  activeDeadlineSeconds: 3600        
  completions: 1                     
  parallelism: 1                    
  template:
    spec:
      restartPolicy: Never         
      terminationGracePeriodSeconds: 300 
      containers:
        # Application container
        - name: demo-job
          image: debian:bookworm-slim
          command: ["/bin/bash", "-c"]
          args:
            - |
              # Wait for LoongCollector to be ready.
              echo "[$(date)] Business: Waiting for LoongCollector to be ready..."
              until [[ -f /tasksite/cornerstone ]]; do 
                sleep 1
              done
              echo "[$(date)] Business: LoongCollector is ready, starting business logic"
              # Run the application logic.
              echo "Hello, World!" >> /app/logs/business.log
              # Save the exit code.
              retcode=$?
              echo "[$(date)] Business: Task completed with exit code: $retcode"
              # Notify LoongCollector that the task is finished.
              touch /tasksite/tombstone
              echo "[$(date)] Business: Tombstone created, exiting"
              exit $retcode
          # Resource requests and limits
          resources:
            requests:
              cpu: "100m"
              memory: "128Mi"
            limits:
              cpu: "500"
              memory: "512Mi"
          # volume mounts
          volumeMounts:
            - name: app-logs
              mountPath: /app/logs
            - name: tasksite
              mountPath: /tasksite
        # LoongCollector sidecar container
        - name: loongcollector
          image: aliyun-observability-release-registry.cn-hongkong.cr.aliyuncs.com/loongcollector/loongcollector:v3.1.1.0-20fa5eb-aliyun
          command: ["/bin/bash", "-c"]
          args:
            - |
              echo "[$(date)] LoongCollector: Starting initialization"
              # Start the LoongCollector service.
              /etc/init.d/loongcollectord start
              # Wait for the configuration to download and the service to be ready.
              sleep 15
              # Verify the service status.
              if /etc/init.d/loongcollectord status; then
                echo "[$(date)] LoongCollector: Service started successfully"
                touch /tasksite/cornerstone
              else
                echo "[$(date)] LoongCollector: Failed to start service"
                exit 1
              fi
              # Wait for the application container to finish.
              echo "[$(date)] LoongCollector: Waiting for business container to complete"
              until [[ -f /tasksite/tombstone ]]; do 
                sleep 2
              done
              echo "[$(date)] LoongCollector: Business completed, waiting for log transmission"
              # Allow sufficient time to send remaining logs.
              sleep 30
              echo "[$(date)] LoongCollector: Stopping service"
              /etc/init.d/loongcollectord stop
              echo "[$(date)] LoongCollector: Shutdown complete"
          # health check
          livenessProbe:
            exec:
              command: ["/etc/init.d/loongcollectord", "status"]
            initialDelaySeconds: 30
            periodSeconds: 10
            timeoutSeconds: 5
            failureThreshold: 3
          # Resource requests and limits
          resources:
            requests:
              cpu: "100m"
              memory: "128Mi"
            limits:
              cpu: "500m"
              memory: "512Mi"
          # environment variables
          env:
            - name: ALIYUN_LOGTAIL_USER_ID
              value: "your-user-id"
            - name: ALIYUN_LOGTAIL_USER_DEFINED_ID
              value: "your-user-defined-id"
            - name: ALIYUN_LOGTAIL_CONFIG
              value: "/etc/ilogtail/conf/cn-hongkong/ilogtail_config.json"
            - name: ALIYUN_LOG_ENV_TAGS
              value: "_pod_name_|_pod_ip_|_namespace_|_node_name_"
            # Inject pod metadata.
            - name: "_pod_name_"
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: "_pod_ip_"
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: "_namespace_"
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: "_node_name_"
              valueFrom:
                fieldRef:
                  fieldPath: spec.nodeName
          # volume mounts
          volumeMounts:
            - name: app-logs
              mountPath: /app/logs
              readOnly: true
            - name: tasksite
              mountPath: /tasksite
            - name: tz-config
              mountPath: /etc/localtime
              readOnly: true
      # Volume definitions
      volumes:
        - name: app-logs
          emptyDir: {}
        - name: tasksite
          emptyDir:
            medium: Memory
            sizeLimit: "10Mi"
        - name: tz-config
          hostPath:
            path: /usr/share/zoneinfo/Asia/Shanghai

Servicios de larga duración (Deployment / StatefulSet)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-demo
  namespace: production
  labels:
    app: nginx-demo
    version: v1.0.0
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1      
      maxSurge: 1          
  selector:
    matchLabels:
      app: nginx-demo
  template:
    metadata:
      labels:
        app: nginx-demo
        version: v1.0.0    
    spec:
      terminationGracePeriodSeconds: 600  # 10-minute graceful shutdown period
      containers:
        # Application container - Web application
        - name: nginx-demo
          image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6          
          # Startup command and signal handling
          command: ["/bin/sh", "-c"]
          args:
            - |
              # Define the signal handler.
              _term_handler() {
                  echo "[$(date)] [nginx-demo] Caught SIGTERM, starting graceful shutdown..."
                  # Send the QUIT signal to Nginx for a graceful stop.
                  if [ -n "$NGINX_PID" ]; then
                      kill -QUIT "$NGINX_PID" 2>/dev/null || true
                      echo "[$(date)] [nginx-demo] Sent SIGQUIT to Nginx PID: $NGINX_PID"
                      # Wait for Nginx to stop gracefully.
                      wait "$NGINX_PID"
                      EXIT_CODE=$?
                      echo "[$(date)] [nginx-demo] Nginx stopped with exit code: $EXIT_CODE"
                  fi
                  # Notify LoongCollector that the application container has stopped.
                  echo "[$(date)] [nginx-demo] Writing tombstone file"
                  touch /tasksite/tombstone
                  exit $EXIT_CODE
              }
              # Register the signal handler.
              trap _term_handler SIGTERM SIGINT SIGQUIT
              # Wait for LoongCollector to be ready.
              echo "[$(date)] [nginx-demo]: Waiting for LoongCollector to be ready..."
              until [[ -f /tasksite/cornerstone ]]; do 
                sleep 1
              done
              echo "[$(date)] [nginx-demo]: LoongCollector is ready, starting business logic"
              # Start Nginx.
              echo "[$(date)] [nginx-demo] Starting Nginx..."
              nginx -g 'daemon off;' &
              NGINX_PID=$!
              echo "[$(date)] [nginx-demo] Nginx started with PID: $NGINX_PID"
              # Wait for the Nginx process to exit.
              wait $NGINX_PID
              EXIT_CODE=$?
              # If the process exits without a signal, notify LoongCollector.
              if [ ! -f /tasksite/tombstone ]; then
                  echo "[$(date)] [nginx-demo] Unexpected exit, writing tombstone"
                  touch /tasksite/tombstone
              fi
              exit $EXIT_CODE
          # Resource requests and limits
          resources:
            requests:
              cpu: "200m"
              memory: "256Mi"
            limits:
              cpu: "1000m"
              memory: "1Gi"
          # volume mounts
          volumeMounts:
            - name: nginx-logs
              mountPath: /var/log/nginx
            - name: tasksite
              mountPath: /tasksite
            - name: tz-config
              mountPath: /etc/localtime
              readOnly: true
        # LoongCollector sidecar container
        - name: loongcollector
          image: aliyun-observability-release-registry.cn-shenzhen.cr.aliyuncs.com/loongcollector/loongcollector:v3.1.1.0-20fa5eb-aliyun
          command: ["/bin/bash", "-c"]
          args:
            - |
              echo "[$(date)] LoongCollector: Starting initialization"
              # Start the LoongCollector service.
              /etc/init.d/loongcollectord start
              # Wait for the configuration to download and the service to be ready.
              sleep 15
              # Verify the service status.
              if /etc/init.d/loongcollectord status; then
                echo "[$(date)] LoongCollector: Service started successfully"
                touch /tasksite/cornerstone
              else
                echo "[$(date)] LoongCollector: Failed to start service"
                exit 1
              fi
              # Wait for the application container to finish.
              echo "[$(date)] LoongCollector: Waiting for business container to complete"
              until [[ -f /tasksite/tombstone ]]; do 
                sleep 2
              done
              echo "[$(date)] LoongCollector: Business completed, waiting for log transmission"
              # Allow sufficient time to send remaining logs.
              sleep 30
              echo "[$(date)] LoongCollector: Stopping service"
              /etc/init.d/loongcollectord stop
              echo "[$(date)] LoongCollector: Shutdown complete"
          # health check
          livenessProbe:
            exec:
              command: ["/etc/init.d/loongcollectord", "status"]
            initialDelaySeconds: 30
            periodSeconds: 10
            timeoutSeconds: 5
            failureThreshold: 3
          # Resource requests and limits
          resources:
            requests:
              cpu: "100m"
              memory: "128Mi"
            limits:
              cpu: "2000m"
              memory: "2048Mi"
          # environment variables
          env:
            - name: ALIYUN_LOGTAIL_USER_ID
              value: "${your_aliyun_user_id}"
            - name: ALIYUN_LOGTAIL_USER_DEFINED_ID
              value: "${your_machine_group_user_defined_id}"
            - name: ALIYUN_LOGTAIL_CONFIG
              value: "/etc/ilogtail/conf/${your_region_config}/ilogtail_config.json"
            # Enable full drain mode to send all logs when the pod stops.
            - name: enable_full_drain_mode
              value: "true"
            # Append pod environment information as log tags.
            - name: "ALIYUN_LOG_ENV_TAGS"
              value: "_pod_name_|_pod_ip_|_namespace_|_node_name_|_node_ip_"
            # Get pod and node information.
            - name: "_pod_name_"
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: "_pod_ip_"
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: "_namespace_"
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: "_node_name_"
              valueFrom:
                fieldRef:
                  fieldPath: spec.nodeName
            - name: "_node_ip_"
              valueFrom:
                fieldRef:
                  fieldPath: status.hostIP
          # volume mounts
          volumeMounts:
            - name: nginx-logs
              mountPath: /var/log/nginx
              readOnly: true
            - name: tasksite
              mountPath: /tasksite
            - name: tz-config
              mountPath: /etc/localtime
              readOnly: true
      # Volume definitions
      volumes:
        - name: nginx-logs
          emptyDir: {}
        - name: tasksite
          emptyDir:
            medium: Memory
            sizeLimit: "50Mi"
        - name: tz-config
          hostPath:
            path: /usr/share/zoneinfo/Asia/Shanghai

Apéndice: Procesadores nativos

En la página Logtail Configuration, dentro del área Processor Configurations, puede agregar complementos de procesamiento para estructurar los registros sin procesar. Para añadir un complemento de procesamiento a una configuración de recopilación existente, siga estos pasos:

  1. En el panel de navegación izquierdo, seleccione image Logstores y localice el logstore de destino.

  2. Haga clic en image a la izquierda del nombre para expandir el logstore.

  3. Haga clic en Logtail Configuration. En la lista de configuraciones, busque la configuración de Logtail deseada y haga clic en Manage Logtail Configuration en la columna Actions.

  4. En la página de configuración de Logtail, haga clic en Edit.

Esta sección presenta únicamente los complementos de procesamiento más utilizados, que cubren los escenarios comunes de procesamiento de registros. Para conocer más funciones, consulte Extension processing plug-ins .
Importante

Reglas para combinar complementos (aplica a LoongCollector / Logtail 2.0 y versiones posteriores):

  • Los complementos de procesamiento nativos y de extensión se pueden usar de forma independiente o combinada según sea necesario.

  • Se recomienda utilizar primero los complementos de procesamiento nativos, ya que ofrecen mejor rendimiento y mayor estabilidad.

  • Cuando las funciones nativas no satisfacen los requisitos del negocio, puede agregar complementos de procesamiento de extensión después de los nativos configurados para realizar un procesamiento complementario.

Restricción de orden:

Todos los complementos se ejecutan secuencialmente en el orden en que se configuran, lo que forma una cadena de procesamiento. Nota: Todos los complementos de procesamiento nativos deben preceder a cualquier complemento de procesamiento de extensión. Después de agregar un complemento de procesamiento de extensión, no podrá añadir más complementos de procesamiento nativos.

Análisis con expresiones regulares

Utilice expresiones regulares para extraer campos de los registros como pares clave-valor, lo que permite su consulta y análisis de forma independiente.

Ejemplo:

Registro sin procesar sin ningún procesamiento

Uso del complemento de análisis con expresiones regulares

127.0.0.1 - - [16/Aug/2024:14:37:52 +0800] "GET /wp-admin/admin-ajax.php?action=rest-nonce HTTP/1.1" 200 41 "http://www.example.com/wp-admin/post-new.php?post_type=page" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0"
body_bytes_sent: 41
    http_referer: http://www.example.com/wp-admin/post-new.php?post_type=page
    http_user_agent: Mozilla/5.0 (Windows NT 10.0; Win64; ×64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0
    remote_addr: 127.0.0.1
    remote_user: -
    request_method: GET
    request_protocol: HTTP/1.1
    request_uri: /wp-admin/admin-ajax.php?action=rest-nonce
    status: 200
    time_local: 16/Aug/2024:14:37:52 +0800

Procedimiento: En la sección Processor Configurations de la página Logtail Configurations, haga clic en Add Processor y seleccione Native Processor > Data Parsing (Regex Mode).

  • Regular Expression: Expresión regular para coincidir con el contenido del registro. Puede generarla automáticamente o introducirla de forma manual.

    • Generación automática:

      • Haga clic en Generate.

      • En el cuadro Log Sample, seleccione el contenido del registro que desea extraer.

      • Haga clic en Generate Regular Expression.

        Por ejemplo, si pega un registro en formato Apache Combined en el cuadro Log Sample, este contendrá campos como la IP del cliente, la marca de tiempo, el método y la ruta de la solicitud, el código de estado, Referer y User-Agent.

    • Entrada manual: Introduzca manualmente la expresión regular en Manually Enter Regular Expression según el formato del registro.

    Después de introducir la expresión, haga clic en Validate para comprobar si analiza correctamente el contenido del registro.

  • Extracted Field: Establezca un nombre de campo (clave) para cada fragmento de contenido de registro extraído (valor).

  • Para obtener información sobre otros parámetros, consulte las descripciones generales de parámetros en Use case 2: Structured logs.

Análisis por delimitador

Utilice el análisis por delimitador para dividir el contenido del registro en pares clave-valor. Admite delimitadores de uno o varios caracteres.

Ejemplo:

Registro sin procesar sin ningún procesamiento

Campos divididos por el carácter especificado ,

05/May/2025:13:30:28,10.10.*.*,"POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1",200,18204,aliyun-sdk-java
ip:10.10.*.*
    request:POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1
    size:18204
    status:200
    time:05/May/2025:13:30:28
    user_agent:aliyun-sdk-java

Procedimiento: En la sección Processor Configurations de la página Logtail Configurations, haga clic en Add Processor y seleccione Native Processor > Data Parsing (Delimiter Mode).

  • Delimiter: Carácter utilizado para dividir el contenido del registro.

    Ejemplo: Para un archivo CSV, seleccione Custom e introduzca una coma (,).

  • Quote: Cuando el valor de un campo contiene el delimitador, debe especificar un carácter de comilla para envolver el campo y evitar una división incorrecta.

  • Extracted Field: Asigne un nombre de campo (clave) a cada columna en orden secuencial. Los nombres de campo deben cumplir las siguientes reglas:

    • Solo pueden contener letras, dígitos y guiones bajos (_).

    • Deben comenzar con una letra o un guion bajo (_).

    • Pueden tener una longitud máxima de 128 bytes.

  • Para obtener información sobre otros parámetros, consulte las descripciones generales de parámetros en Use case 2: Structured logs.

Análisis JSON

Analiza registros con formato de objetos JSON y los convierte en pares clave-valor.

Ejemplo:

Registro sin procesar sin ningún procesamiento

Extracción automática de pares clave-valor JSON estándar

{"url": "POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=U0Ujpek********&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=pD12XYLmGxKQ%2Bmkd6x7hAgQ7b1c%3D HTTP/1.1", "ip": "10.200.98.220", "user-agent": "aliyun-sdk-java", "request": {"status": "200", "latency": "18204"}, "time": "05/Jan/2025:13:30:28"}
ip: 10.200.98.220
    request: {"status": "200", "latency" : "18204" }
    time: 05/Jan/2025:13:30:28
    url: POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=U0Ujpek******&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=pD12XYLmGxKQ%2Bmkd6x7hAgQ7b1c%3D HTTP/1.1
    user-agent:aliyun-sdk-java

Procedimiento: En la sección Processor Configurations de la página Logtail Configurations, haga clic en Add Processor y seleccione Native Processor > Data Parsing (JSON Mode).

  • Original Field: El valor predeterminado es content. Este campo contiene el registro sin procesar que se va a analizar.

  • Para obtener información sobre otros parámetros, consulte las descripciones generales de parámetros en Use case 2: Structured logs.

Expansión de campos JSON

Expande un campo que contiene un objeto JSON anidado en múltiples pares clave-valor.

Ejemplo:

Registro sin procesar sin ningún procesamiento

Profundidad de expansión: 0, uso de la profundidad de expansión como prefijo

Profundidad de expansión: 1, uso de la profundidad de expansión como prefijo

{"s_key":{"k1":{"k2":{"k3":{"k4":{"k51":"51","k52":"52"},"k41":"41"}}}}}
0_s_key_k1_k2_k3_k41:41
    0_s_key_k1_k2_k3_k4_k51:51
    0_s_key_k1_k2_k3_k4_k52:52
1_s_key:{"k1":{"k2":{"k3":{"k4":{"k51":"51","k52":"52"},"k41":"41"}}}}

Procedimiento: En la sección Processor Configurations de la página Logtail Configurations, haga clic en Add Processor y seleccione Extended Processor > Expand JSON Field.

  • Original Field: Nombre del campo original que se va a expandir, por ejemplo, content.

  • JSON Expansion Depth: Nivel de expansión del objeto JSON. Un valor de 0 (predeterminado) expande completamente el objeto, 1 expande solo el nivel actual, y así sucesivamente.

  • Character to Concatenate Expanded Keys: Carácter utilizado para unir los nombres de campo durante la expansión JSON. El valor predeterminado es un guion bajo (_).

  • Name Prefix of Expanded Keys: Prefijo que se agrega a los nombres de campo después de la expansión JSON.

  • Expand Array: Active este interruptor para expandir matrices en pares clave-valor con índices.

    Ejemplo: {"k":["a","b"]} se expande a k[0]: "a", k[1]: "b".

    Para cambiar el nombre de un campo expandido (por ejemplo, de prefix_s_key_k1 a new_field_name ), agregue un procesador Rename Fields para completar la asignación.
  • Para obtener información sobre otros parámetros, consulte las descripciones generales de parámetros en Use case 2: Structured logs.

Análisis de matrices JSON

Utilice la función json_extract function para extraer objetos JSON de una matriz JSON.

Ejemplo:

Registro sin procesar sin ningún procesamiento

Extracción de estructura de matriz JSON

[{"key1":"value1"},{"key2":"value2"}]
json1:{"key1":"value1"}
    json2:{"key2":"value2"}

Procedimiento: En la página Logtail Configuration, dentro del área Processor Configurations, cambie el Processing Method a SPL, configure la SPL Statement y utilice la función json_extract para extraer objetos JSON de la matriz JSON.

Ejemplo: Extraiga elementos de la matriz JSON en el campo de registro content y almacene los resultados en los nuevos campos json1 y json2.

* | extend json1 = json_extract(content, '$[0]'), json2 = json_extract(content, '$[1]')

Análisis de registros Apache

Estructure el contenido del registro según las definiciones de su archivo de configuración de registros de Apache y analícelo en múltiples pares clave-valor.

Ejemplo:

Registro sin procesar sin ningún procesamiento

Análisis de formato de registro común de Apache combined

1 192,168.1.10 - - [08/May/2024:15:30:28 +0800] "GET /index.html HTTP/1.1" 200 1234 "https://www.example.com/referrer" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.X.X Safari/537.36"
http_referer:https://www.example.com/referrer
    http_user_agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.X.X Safari/537.36
    remote_addr:192,168.1.10
    remote_ident:-
    remote_user:-
    request_method:GET
    request_protocol:HTTP/1.1
    request_uri:/index.html
    response_size_bytes:1234
    status:200
    time_local:[08/May/2024:15:30:28 +0800]

Procedimiento: En la sección Processor Configurations de la página Logtail Configurations, haga clic en Add Processor y seleccione Native Processor > Data Parsing (Apache Mode).

  • Log Format: combined

  • APACHE LogFormat Configuration: El sistema rellena automáticamente este campo según el Log Format seleccionado.

    Importante

    Asegúrese de que el contenido generado automáticamente coincida exactamente con la definición LogFormat en el archivo de configuración de Apache de su servidor (generalmente /etc/apache2/apache2.conf).

  • Para obtener información sobre otros parámetros, consulte las descripciones generales de parámetros en Use case 2: Structured logs.

Enmascaramiento de datos

Enmascare datos confidenciales en los registros.

Ejemplo:

Registro sin procesar sin ningún procesamiento

Resultado del enmascaramiento

[{'account':'1812213231432969','password':'04a23f38'}, {'account':'1812213685634','password':'123a'}]
[{'account':'1812213231432969','password':'********'}, {'account':'1812213685634','password':'********'}]

Procedimiento: En la página Logtail Configuration, dentro del área Processor Configurations, haga clic en Add Processor y seleccione Native Processor > Data Masking:

  • Original Field: Campo de origen que contiene el contenido del registro antes del análisis.

  • Data Masking Method:

    • const: Reemplaza el contenido confidencial con la cadena especificada.

    • md5: Reemplaza el contenido confidencial con su hash MD5 correspondiente.

  • Replacement String: Si selecciona const en Data Masking Method, debe introducir una cadena para reemplazar el contenido confidencial.

  • Content Expression that Precedes Replaced Content: Se utiliza para encontrar contenido confidencial. Configure mediante sintaxis RE2.

  • Content Expression to Match Replaced Content: Expresión para el contenido confidencial. Configure mediante sintaxis RE2.

Análisis de tiempo

Analiza el campo de tiempo en el registro y establece el resultado del análisis como el campo __time__ del registro.

Ejemplo:

Registro sin procesar sin ningún procesamiento

Análisis de tiempo

{"level":"INFO","timestamp":"2025-09-23T19:11:47+0800","cluster":"yilu-cluster-0728","message":"User logged in successfully","userId":"user-123"}

En la vista de detalles de registros de SLS, el registro JSON se analiza correctamente en campos estructurados. Cada campo (cluster, level, message, time, userId) y su valor se muestran de forma independiente.

Procedimiento: En la página Logtail Configuration, dentro del área Processor Configurations, haga clic en Add Processor y seleccione Native Processor > Time Parsing:

  • Original Field: Campo de origen que contiene el contenido del registro antes del análisis.

  • Time Format: Establezca el formato de tiempo correspondiente según el contenido temporal del registro.

  • Time Zone: Seleccione la zona horaria del campo de tiempo del registro. De forma predeterminada, se utiliza la zona horaria de la máquina, que corresponde a la zona horaria del entorno donde se ejecuta el proceso de LoongCollector (Logtail).

Limitaciones de expresiones regulares para filtrado de contenedores

Las expresiones regulares para el filtrado de contenedores utilizan el motor Go RE2, el cual tiene limitaciones de sintaxis en comparación con PCRE.

1. Diferencias en la sintaxis de grupos con nombre

Go utiliza la sintaxis (?P<name>...) para definir un grupo con nombre y no admite la sintaxis (?<name>...) de PCRE.

  • Sintaxis correcta: (?P<year>\d{4})

  • Sintaxis incorrecta: (?<year>\d{4})

2. Funciones de expresiones regulares no admitidas

El motor RE2 no admite las siguientes funciones comunes pero complejas de expresiones regulares:

  • Aserciones: (?=...), (?!...), (?<=...) y (?<!...)

  • Expresiones condicionales: (?(condition)true|false)

  • Coincidencia recursiva: (?R) y (?0)

  • Referencias a subprogramas: (?&name) y (?P>name)

  • Grupos atómicos: (?>...)

3. Recomendaciones

Utilice herramientas como Regex101 para depurar expresiones regulares. Seleccione el modo Golang (RE2) para garantizar la compatibilidad. La sintaxis no admitida impide el análisis o la coincidencia correctos.