> 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/da/udvikling/logging.md).

# Logning

Konfigurer logføring i PowerShell Universal med Serilog, herunder system- og brugerlogføringsmål, Write-PSULog, logniveauer og streaming af logge til en ELK-stak.

## Om

PowerShell Universal bruger et struktureret logføringsframework kaldet Serilog. Serilog giver mulighed for flere logføringsmål (sinks), egenskaber for loghændelser og lagring af data for loghændelser. Som standard logger PowerShell Universal to forskellige logfiler. Den første er systemloggen. Den indeholder logoplysninger om PowerShell Universal-serveren og er angivet til verbose som standard. Den anden er brugerloggen. Brugerloggen registrerer oplysninger om alle de scripts, der køres i PowerShell Universal, og som er oprettet af brugeren.

Begge logfiler findes i `%ProgramData%\PowerShellUniversal`.

## Systemlogning

Systemlogføring konfigureres via programindstillingerne (appsettings.json) eller miljøvariabler. Systemlogge indeholder typisk intern logføring, der er nyttig til at afgøre, hvad der sker i PowerShell Universal-serveren, og ikke nødvendigvis i Deres scripts.

Indstillingerne for systemloggen findes i roden af appsettings.json.

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

Systemlogstien kan indeholde miljøvariabler. Gyldige logniveauer omfatter:

* Verbose
* Debug
* Information
* Warning
* Error

Vi anbefaler at køre på Information eller derover i produktionsmiljøer og kun gå under disse niveauer, når De fejlfinder problemer.

## Konfiguration

Logningskonfigurationen kan ændres under **Observe > Logging > Logging Targets**.

### Mål

PowerShell Universal tilbyder fem indbyggede logføringsmål.

* Fil
* Database
* TCP
* HTTP
* PowerShell

Hvert mål har sit eget sæt egenskaber. Filer har f.eks. en egenskab for filsti.

#### Omfang

Hvert mål kan konfigureres til at registrere et bestemt sæt loghændelser baseret på, hvad der genererer dem. Disse omfatter:

* Omfang - system- eller brugerlogmeddelelser
* Feature - Funktionen, der genererer logmeddelelsen (f.eks. API)
* Resource - En bestemt ressource, der genererer loggen (f.eks. Script1.ps1)

Hvis funktion eller ressource ikke er angivet, modtager logmålet alle meddelelser for omfanget. Hvis De f.eks. har defineret et mål med omfanget User og funktionen API, ville det logge alle API-anmodninger.

#### Niveau

Logniveauer definerer, hvilke meddelelser der skal logges, ud fra niveauet for logmeddelelserne. Et logføringsmål, der f.eks. er konfigureret til niveauet Information, modtager logmeddelelser fra Information til og med Error, men logger ikke debug- eller verbose-meddelelser.

### PowerShell-mål

PowerShell-logføringsmålet kan bruges til at oprette en brugerdefineret logger med en PowerShell-scriptblok, der modtager meddelelserne. Scriptblokken bør have to parametre. Den første er loghændelsesobjektet, som Serilog producerer, og den anden er den gengivne meddelelsesstreng.

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

Overvej ydeevnen, når De bruger PowerShell-målet, da PowerShell køres for hver logmeddelelse. En runspace-pulje til logføring bruges til at levere flertrådet logføring for PowerShell-mål.

Log ikke i Deres PowerShell-mål ved hjælp af Write-PSULog.

## Write-PSULog

De kan bruge cmdlet'en `Write-PSULog` til at skrive til logge inde fra Deres scripts. Cmdlet'en angiver automatisk omfanget User, og De kan vælge at angive en funktion, en ressource og en meddelelse.

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

### Konsol

De kan lade `Write-PSULog` skrive til strømmene i den aktuelle PowerShell-session ved hjælp af switch-parameteren `-Console`. Afhængigt af det niveau, De vælger, vises logmeddelelserne på disse strømme.

{% 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 %}

### Indlejrede runspaces

Hvis Deres løsning opretter sine egne runspaces, enten direkte eller via jobs, kan De fortsætte med at bruge `Write-PSULog`, men De skal levere den globale variabel `$UniversalClient` til runspacet.

{% 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 %}

## Visning af logge

De kan se live-logfiler under **Observe > Logging > Live Logs**. Logviseren viser alle logmeddelelser som standard. De kan bruge sorterings- og filtreringsindstillingerne til at vælge bestemte niveauer, funktioner og ressourcer, som loggene skal vises for.

Søgelinjen vil søge efter logmeddelelser, der indeholder søgestrengen.

## Eksempel: ELK Stack

De kan bruge TCP-logningsmålet til at gemme og analysere logmeddelelser i ELK-stakken. Med henblik på dette eksempel vil vi bruge [docker-elk-lageret](https://github.com/deviantony/docker-elk).

Klon docker-elk-lageret, og kør følgende kommandoer i lageret.

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

Når det er kørt, har De ELK-stakken kørende. De kan besøge webkonsollen ved at navigere til `http://localhost:5601`.

Standardbrugernavnet er elastic, og adgangskoden er changeme.

I PowerShell Universal vil De gerne oprette et logføringsmål og sende TCP-hændelser til `tcp://localhost:50000`.

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

Ovenstående konfiguration sender alle logmeddelelser med omfanget User til Logstack. Gå til **Observe > Logging > Live Logs**.

Herfra vil De kunne søge efter og få vist logmeddelelser fra 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 by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.devolutions.net/powershell-universal/da/udvikling/logging.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
