> For the complete documentation index, see [llms.txt](https://docs.devolutions.net/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.devolutions.net/powershell-universal/es/desarrollo/logging.md).

# Registro

Configure el registro de PowerShell Universal con Serilog, abarcando destinos de registro del sistema y de usuario, Write-PSULog, niveles de registro y el envío en streaming de registros a una pila EL

## Acerca de

PowerShell Universal utiliza un marco de registro estructurado llamado Serilog. Serilog permite múltiples destinos de registro (sinks), propiedades de eventos de registro y el almacenamiento de datos de eventos de registro. De forma predeterminada, PowerShell Universal registra dos ficheros de registro diferentes. El primero es el registro del sistema. Este contiene detalles de registro sobre el servidor de PowerShell Universal y está establecido en verbose de forma predeterminada. El segundo es el registro de usuario. El registro de usuario captura información sobre todos los scripts ejecutados dentro de PowerShell Universal que son creados por el usuario.

Ambos ficheros de registro se encontrarán en `%ProgramData%\PowerShellUniversal`.

## Registro del sistema

El registro del sistema se configura mediante la configuración de la aplicación (appsettings.json) o variables de entorno. Los registros del sistema normalmente contienen registros internos que resultan útiles para determinar qué está ocurriendo dentro del servidor de PowerShell Universal y no necesariamente en sus scripts.

La configuración del registro del sistema se encuentra en la raíz de appsettings.json.

```json
{
    "SystemLogPath": "%ProgramData%\\PowerShellUniversal",
    "SystemLogLevel": "Information"
}
```

La ruta del registro del sistema puede contener variables de entorno. Los niveles de registro válidos incluyen:

* Verbose
* Debug
* Information
* Warning
* Error

Recomendamos ejecutar en Information o superior en entornos de producción y bajar de esos niveles solo al depurar problemas.

## Configuración

La configuración del registro se puede cambiar en **Observar > Registro > Destinos de registro**.

### Destinos

PowerShell Universal ofrece cinco destinos de registro integrados.

* Fichero
* Base de datos
* TCP
* HTTP
* PowerShell

Cada destino tiene su propio conjunto de propiedades. Por ejemplo, los ficheros tendrán una propiedad de ruta de fichero.

#### Ámbito

Cada destino se puede configurar para capturar un conjunto específico de eventos de registro según lo que los genere. Estos incluyen:

* Ámbito - Mensajes de registro del sistema o de usuario
* Función - La función que genera el mensaje de registro (p. ej., API)
* Recurso - Un recurso específico que genera el registro (p. ej., Script1.ps1)

Si no se especifica la función o el recurso, el destino de registro recibirá todos los mensajes del ámbito. Por ejemplo, si definió un destino con un ámbito de usuario y una función API, registraría todas las solicitudes de API.

#### Nivel

Los niveles de registro definen qué mensajes registrar según el nivel de los mensajes de registro. Por ejemplo, un destino de registro configurado en el nivel Information recibirá mensajes de registro desde Information hasta Error, pero no registrará mensajes debug ni verbose.

### Destino de PowerShell

El destino de registro de PowerShell se puede usar para crear un registrador personalizado con un bloque de script de PowerShell que reciba los mensajes. El bloque de script debe tener dos parámetros. El primero es el objeto de evento de registro generado por Serilog y el segundo es la cadena del mensaje renderizado.

```powershell
New-PSULoggingTarget -Type 'PowerShell' -Level 'Information' -Scope User -Feature API -ScriptBlock {
    param($LogEvent, $Message) 
    
    $Message | Out-File C:\logs\log.txt
}
```

Tenga en cuenta el rendimiento al usar el destino de PowerShell, ya que PowerShell se ejecutará para cada mensaje de registro. Se utiliza un grupo de runspaces de registro para proporcionar registro multihilo para los destinos de PowerShell.

No registre dentro de su destino de PowerShell usando Write-PSULog.

## Write-PSULog

Puede usar el cmdlet `Write-PSULog` para escribir en los registros desde dentro de sus scripts. El cmdlet establece automáticamente el ámbito de usuario y puede elegir proporcionar una función, un recurso y un mensaje.

```powershell
Write-PSULog -Feature 'MyFeature' -Message 'MyMessage'
```

### Consola

Puede permitir que `Write-PSULog` muestre la salida en los flujos de la sesión actual de PowerShell usando el parámetro de conmutador `-Console`. Según el nivel que seleccione, los mensajes de registro aparecerán en esos flujos.

{% code overflow="wrap" %}

```powershell
# Information Stream
Write-PSULog -Console -Message "MyInfoMessage" -Level Information
# Error Stream
Write-PSULog -Console -Message "MyErrorMessage" -Level Error
# Warning Stream
Write-PSULog -Console -Message "MyWarningMessage" -Level Warning
```

{% endcode %}

### Runspaces anidados

Si su solución crea sus propios runspaces, ya sea directamente o mediante trabajos, puede seguir usando `Write-PSULog`, pero deberá proporcionar la variable global `$UniversalClient` al runspace.

{% code overflow="wrap" %}

```powershell
$iss= [InitialSessionState]::CreateDefault()
$var1 = [SessionStateVariableEntry]::new("UniversalClient",
                                      $UniversalClient,
                                      "The PSU Client")
$iss.Variables.Add($var1)
$runspace = [runspacefactory]::CreateRunspace($iss)
$runspace.Open()
$script = { Write-PSULog -Message 'Hello from a runspace!' }
$pipeline = $runspace.CreatePipeline()
$pipeline.Commands.AddScript($script)
$pipeline.Invoke()
$runspace.Close()
```

{% endcode %}

## Visualización de registros

Puede ver los registros en directo en **Observar > Registro > Registros en directo**. El visor de registros mostrará todos los mensajes de registro de forma predeterminada. Puede usar las opciones de ordenación y filtrado para seleccionar niveles, funciones y recursos concretos para los que ver los registros.

La barra de búsqueda buscará mensajes de registro que contengan la cadena de búsqueda.

## Ejemplo: ELK Stack

Puede usar el destino de registro TCP para almacenar y analizar mensajes de registro en ELK Stack. Para los fines de este ejemplo, utilizaremos el [repositorio docker-elk](https://github.com/deviantony/docker-elk).

Clone el repositorio docker-elk y ejecute los siguientes comandos en el repositorio.

```
docker-compose up setup
docker-compose up
```

Una vez ejecutado, tendrá ELK Stack en funcionamiento. Puede visitar la consola web navegando a `http://localhost:5601`.

El nombre de usuario predeterminado es elastic y la contraseña es changeme.

En PowerShell Universal, querrá crear un destino de registro y enviar eventos TCP a `tcp://localhost:50000`.

```powershell
New-PSULoggingTarget -Type "TCP" -Level "Verbose" -Properties @{
    hostName = 'tcp://localhost'
    port     = '50000'
} -Scope "User"
```

La configuración anterior enviará todos los mensajes de registro del ámbito de usuario a Logstack. Navegue a **Observar > Registro > Registros en directo**.

Desde aquí podrá buscar y ver los mensajes de registro de Universal.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.devolutions.net/powershell-universal/es/desarrollo/logging.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
