---
title: "Logs"
description: "Structured logs allow you to send, view and query logs sent from your applications within Sentry."
url: https://docs.sentry.io/platforms/dotnet/guides/winui/logs/
---

# Set Up Logs | Sentry for WinUI

With Sentry Structured Logs, you can send text-based log information from your applications to Sentry. Once in Sentry, these logs can be viewed alongside relevant errors, searched by text-string, or searched using their individual attributes.

## [Requirements](https://docs.sentry.io/platforms/dotnet/guides/winui/logs.md#requirements)

Logs for <!-- -->WinUI <!-- -->are supported in Sentry <!-- -->WinUI <!-- -->SDK version `5.14.0` and above.

## [Setup](https://docs.sentry.io/platforms/dotnet/guides/winui/logs.md#setup)

To enable logging, you need to initialize the SDK with the `EnableLogs` option set to `true`.

```csharp
SentrySdk.Init(options =>
{
    options.Dsn = "___PUBLIC_DSN___";
    // Enable logs to be sent to Sentry
    options.EnableLogs = true;
});
```

## [Usage](https://docs.sentry.io/platforms/dotnet/guides/winui/logs.md#usage)

Once the feature is enabled on the SDK and the SDK is initialized, you can send logs using the `SentrySdk.Logger` APIs.

The `SentryStructuredLogger` type exposes six method groups that you can use to log messages at different log levels: `Trace`, `Debug`, `Info`, `Warning`, `Error`, and `Fatal`.

These properties will be sent to Sentry, and can be searched from within the Logs UI, and even added to the Logs views as a dedicated column.

```csharp
SentrySdk.Logger.LogInfo("A simple log message");
SentrySdk.Logger.LogError("A {0} log message", "formatted");
```

The SDK automatically provides a set of default attributes attached to your logs. Additionally, you can attach custom attributes via a delegate.

```csharp
SentrySdk.Logger.LogWarning(static log =>
{
    log.SetAttribute("my.attribute", "value");
}, "A log message with additional attributes.");
```

Supported attribute types are:

* Textual: `string` and `char`
* Logical: `bool`
* Integral: `sbyte`, `byte`, `short`, `ushort`, `int`, `uint`, `long` and `nint`
* Floating-point: `float` and `double`

Unsupported numeric types such as `ulong`, `nuint`, `decimal`, as well as all other types including `object`, are treated as `string` via `ToString()`.

## [Options](https://docs.sentry.io/platforms/dotnet/guides/winui/logs.md#options)

#### [EnableLogs](https://docs.sentry.io/platforms/dotnet/guides/winui/logs.md#enablelogs)

Set to `true` in order to enable the `SentrySdk.Logger` APIs.

#### [SetBeforeSendLog](https://docs.sentry.io/platforms/dotnet/guides/winui/logs.md#setbeforesendlog)

To filter logs, or update them before they are sent to Sentry, you can use the `SetBeforeSendLog(Func<SentryLog, SentryLog?>)` option.

```csharp
options =>
{
    options.Dsn = "___PUBLIC_DSN___";
    options.EnableLogs = true;
    // a callback that is invoked before sending a log to Sentry
    options.SetBeforeSendLog(static log =>
    {
        // filter out all info logs
        if (log.Level is SentryLogLevel.Info)
        {
            return null;
        }

        // filter out logs based on some attribute they have
        if (log.TryGetAttribute("suppress", out var attribute) && attribute is true)
        {
            return null;
        }

        // set a custom attribute for all other logs sent to Sentry
        log.SetAttribute("my.attribute", "value");

        return log;
    });
});
```

The `beforeSendLog` delegate receives a log object, and should return the log object if you want it to be sent to Sentry, or `null` if you want to discard it.

The log object of type `SentryLog` has the following members:

| Member                                          | Type                                           | Description                                                                                                                                                                         |
| ----------------------------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Timestamp`                                     | `DateTimeOffset`                               | The timestamp of the log.                                                                                                                                                           |
| `TraceId`                                       | `SentryId`                                     | The trace id of the log.                                                                                                                                                            |
| `Level`                                         | `SentryLogLevel`                               | The severity level of the log. Either `Trace`, `Debug`, `Info`, `Warning`, `Error`, or `Fatal`.                                                                                     |
| `Message`                                       | `string`                                       | The formatted log message.                                                                                                                                                          |
| `Template`                                      | `string?`                                      | The parameterized template string.                                                                                                                                                  |
| `Parameters`                                    | `ImmutableArray<KeyValuePair<string, object>>` | The parameters to the template string.                                                                                                                                              |
| `SpanId`                                        | `SpanId?`                                      | The span id of the span that was active when the log was collected.                                                                                                                 |
| `TryGetAttribute(string key, out object value)` | Method                                         | Gets the attribute value associated with the specified key. Returns `true` if the log contains an attribute with the specified key and it's value is not `null`, otherwise `false`. |
| `SetAttribute(string key, object value)`        | Method                                         | Sets a key-value pair of data attached to the log. Supported types are `string`, `bool`, integers up to a size of 64-bit signed, and floating-point numbers up to a size of 64-bit. |

## [Default Attributes](https://docs.sentry.io/platforms/dotnet/guides/winui/logs.md#default-attributes)

The .NET SDK automatically sets several default attributes on all log entries to provide context and improve debugging:

### [Core Attributes](https://docs.sentry.io/platforms/dotnet/guides/winui/logs.md#core-attributes)

* `environment`: The environment set in the SDK if defined. This is sent from the SDK as `sentry.environment`.
* `release`: The release set in the SDK if defined. This is sent from the SDK as `sentry.release`.
* `sdk.name`: The name of the SDK that sent the log. This is sent from the SDK as `sentry.sdk.name`.
* `sdk.version`: The version of the SDK that sent the log. This is sent from the SDK as `sentry.sdk.version`.

### [Message Template Attributes](https://docs.sentry.io/platforms/dotnet/guides/winui/logs.md#message-template-attributes)

If the log was parameterized, Sentry adds the message template and parameters as log attributes.

* `message.template`: The parameterized template string. This is sent from the SDK as `sentry.message.template`.
* `message.parameter.X`: The parameters to fill the template string. X can either be the number that represent the parameter's position in the template string (`sentry.message.parameter.0`, `sentry.message.parameter.1`, etc) or the parameter's name (`sentry.message.parameter.item_id`, `sentry.message.parameter.user_id`, etc). This is sent from the SDK as `sentry.message.parameter.X`.

### [Server Attributes](https://docs.sentry.io/platforms/dotnet/guides/winui/logs.md#server-attributes)

* `server.address`: The address of the server that sent the log. Equivalent to `server_name` that gets attached to Sentry errors.

### [User Attributes](https://docs.sentry.io/platforms/dotnet/guides/winui/logs.md#user-attributes)

If user information is available in the current scope, the following attributes are added to the log:

* `user.id`: The user ID.
* `user.name`: The username.
* `user.email`: The email address.

### [Integration Attributes](https://docs.sentry.io/platforms/dotnet/guides/winui/logs.md#integration-attributes)

If a log is generated by an SDK integration, the SDK will set additional attributes to help you identify the source of the log.

* `origin`: The origin of the log. This is sent from the SDK as `sentry.origin`.

## [Other Logging Integrations](https://docs.sentry.io/platforms/dotnet/guides/winui/logs.md#other-logging-integrations)

Available integrations:

* [ASP.NET Core](https://docs.sentry.io/platforms/dotnet/guides/aspnetcore/logs.md)
* [.NET Multi-platform App UI (.NET MAUI)](https://docs.sentry.io/platforms/dotnet/guides/maui/logs.md)
* [Microsoft.Extensions.Logging](https://docs.sentry.io/platforms/dotnet/guides/extensions-logging/logs.md)
* [Serilog](https://docs.sentry.io/platforms/dotnet/guides/serilog/logs.md)

If there's an integration you would like to see, open a [new issue on GitHub](https://github.com/getsentry/sentry-dotnet/issues/new/choose).
