Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/core/compatibility/10.0.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ If you're migrating an app to .NET 10, the breaking changes listed here might af
| [`dotnet package list` performs restore](sdk/10.0/dotnet-package-list-restore.md) | Behavioral change | Preview 4 |
| [`dotnet restore` audits transitive packages](sdk/10.0/nugetaudit-transitive-packages.md) | Behavioral change | Preview 3 |
| [`dotnet tool install --local` creates manifest by default](sdk/10.0/dotnet-tool-install-local-manifest.md) | Behavioral change | Preview 7 |
| [`dotnet watch` logs to stderr instead of stdout](sdk/10.0/dotnet-watch-stderr.md) | Behavioral change | RC 2 |
| [project.json not supported in `dotnet restore`](sdk/10.0/dotnet-restore-project-json-unsupported.md) | Source incompatible | Preview 7 |
| [SHA-1 fingerprint support deprecated in `dotnet nuget sign`](sdk/10.0/dotnet-nuget-sign-sha1-deprecated.md) | Behavioral change | Preview 1 |
| [MSBUILDCUSTOMBUILDEVENTWARNING escape hatch removed](sdk/10.0/custom-build-event-warning.md) | Behavioral change | Preview 1 |
Expand Down
38 changes: 38 additions & 0 deletions docs/core/compatibility/sdk/10.0/dotnet-watch-stderr.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---
title: "Breaking change: 'dotnet watch' logs to stderr instead of stdout"
description: "Learn about the breaking change in .NET 10 where 'dotnet watch' emits its internal-facing log messages to stderr instead of stdout."
ms.date: 10/08/2025
ai-usage: ai-generated
ms.custom: https://github.com/dotnet/docs/issues/45871
---
# 'dotnet watch' logs to stderr instead of stdout

Starting in .NET 10, [`dotnet watch`](../../../tools/dotnet-watch.md) emits its internal-facing log messages to the `stderr` channel instead of `stdout`. This change is part of a general trend towards `dotnet` CLI commands not obscuring the `stdout` channel. That channel is often reserved for special semantics when running certain kinds of applications, like LSP or MCP servers.

## Version introduced

.NET 10 RC 2

## Previous behavior

Previously, [`dotnet watch`](../../../tools/dotnet-watch.md) emitted log messages to `stdout`.

## New behavior

Starting in .NET 10, [`dotnet watch`](../../../tools/dotnet-watch.md) emits log messages to `stderr`.

## Type of breaking change

This change is a [behavioral change](../../categories.md#behavioral-change).

## Reason for change

This change is part of a general trend towards `dotnet` CLI commands not obscuring the `stdout` channel, which is often reserved or assumed to have special semantics when running certain kinds of applications, like LSP or MCP servers. In general, the .NET CLI should get out of the way of your applications.

## Recommended action

Most users shouldn't need to take any action. If you need the `dotnet watch` messages on `stdout`, you can redirect the `stderr` stream to `stdout`. For example, use `2>&1` to redirect the `2` file descriptor for `stderr` to the `1` file descriptor for `stdout`.

## Affected APIs

None.
14 changes: 8 additions & 6 deletions docs/core/compatibility/toc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,10 @@ items:
href: sdk/10.0/dotnet-package-list-restore.md
- name: "`dotnet tool install --local` creates manifest by default"
href: sdk/10.0/dotnet-tool-install-local-manifest.md
- name: "`dotnet watch` logs to stderr instead of stdout"
href: sdk/10.0/dotnet-watch-stderr.md
- name: HTTP warnings promoted to errors in package list and search
href: sdk/10.0/http-warnings-to-errors.md
- name: MSBUILDCUSTOMBUILDEVENTWARNING escape hatch removed
href: sdk/10.0/custom-build-event-warning.md
- name: MSBuild custom culture resource handling
Expand All @@ -136,16 +140,14 @@ items:
href: sdk/10.0/nu1510-pruned-references.md
- name: NuGet packages with no runtime assets aren't included in deps.json
href: sdk/10.0/deps-json-trimmed-packages.md
- name: PackageReference without a version raises error
href: sdk/10.0/nu1015-packagereference-version.md
- name: PrunePackageReference privatizes direct prunable references
href: sdk/10.0/prune-packagereference-privateassets.md
- name: HTTP warnings promoted to errors in package list and search
href: sdk/10.0/http-warnings-to-errors.md
- name: NUGET_ENABLE_ENHANCED_HTTP_RETRY environment variable removed
href: sdk/10.0/nuget-enhanced-http-retry-removed.md
- name: NuGet logs an error for invalid package IDs
href: sdk/10.0/nuget-packageid-validation.md
- name: PackageReference without a version raises error
href: sdk/10.0/nu1015-packagereference-version.md
- name: PrunePackageReference privatizes direct prunable references
href: sdk/10.0/prune-packagereference-privateassets.md
- name: Windows Forms
items:
- name: API obsoletions
Expand Down