## Summary of the Pull Request Accumulated information from internal transition about the modules development, and reworked it to be added in dev docs. Also the dev docs intself was restructured to be more organized. New pages was verified by transition team. ## PR Checklist - [x] **Dev docs:** Added/updated --------- Co-authored-by: Zhaopeng Wang (from Dev Box) <zhaopengwang@microsoft.com> Co-authored-by: Hao Liu <liuhao3418@gmail.com> Co-authored-by: Peiyao Zhao <105847726+zhaopy536@users.noreply.github.com> Co-authored-by: Mengyuan <162882040+chenmy77@users.noreply.github.com> Co-authored-by: zhaopeng wang <33367956+wang563681252@users.noreply.github.com> Co-authored-by: Jaylyn Barbee <51131738+Jaylyn-Barbee@users.noreply.github.com>
5.2 KiB
Logging and Telemetry in PowerToys
Logging Types in PowerToys
PowerToys has several types of logging mechanisms:
- Text file logs (application writes logs to files)
- Telemetry/diagnostic data (sent to Microsoft servers)
- Event Viewer logs (used by some utilities like Mouse Without Borders)
- Watson reports (crash reports sent to Microsoft)
Log File Locations
Regular Logs
- Located at:
%LOCALAPPDATA%\Microsoft\PowerToys\Logs
- Organized by utility and sometimes by version
- Examples: PowerToys Run logs, module interface logs
- C# and C++ components both write logs to these locations
Low-Privilege Logs
- Some components (like preview handlers and thumbnail providers) are started by Explorer and have low privileges
- These components write logs to:
%USERPROFILE%/AppData/LocalLow/Microsoft/PowerToys
- Example: Monaco preview handler logs
Module Logs
- Logs always stored in user's AppData regardless of installation type
- Each module creates its own log
- Even with machine-wide installation, logs are per-user
- Different users can have different logs even with a machine-wide installation
Log Implementation
C++ Logging
In C++ projects we use the awesome spdlog library for logging as a git submodule under the deps
directory. To use it in your project, just include spdlog.props in a .vcxproj like this:
<Import Project="..\..\..\deps\spdlog.props" />
It'll add the required include dirs and link the library binary itself.
- Projects need to include the logging project as a dependency
- Uses a git submodule for the actual logging library
- Logs are initialized in the main file:
init_logger();
- After initialization, any file can use the logger
- Logger settings contain constants like log file locations
C# Logging
For C# projects there is a static logger class in Managed Common called Logger
.
To use it, add a project reference to ManagedCommon
and add the following line of code to all the files using the logger:
using ManagedCommon;
In the Main
function (or a function with a similar meaning (like App
in a App.xaml.cs
file)) you have to call InitializeLogger
and specify the location where the logs will be saved (always use a path scheme similar to this example):
Logger.InitializeLogger("\\FancyZones\\Editor\\Logs");
For a low-privilege process you have to set the optional second parameter to true
:
Logger.InitializeLogger("\\FileExplorer\\Monaco\\Logs", true);
The Logger
class contains the following logging functions:
// Logs an error that the utility encountered
Logger.LogError(string message);
Logger.LogError(string message, Exception ex);
// Logs an error that isn't that grave
Logger.LogWarning(string message);
// Logs what the app is doing at the moment
Logger.LogInfo(string message);
// Like LogInfo just with infos important for debugging
Logger.LogDebug(string message);
// Logs the current state of the utility.
Logger.LogTrace();
Log File Management
- Currently, most logs are not automatically cleaned up
- Some modules have community contributions to clean old logs, but not universally implemented
- By default, all info-level logs are written
- Debug and trace logs may not be written by default
- Log settings can be found in settings.json, but not all APIs honor these settings
Telemetry
Implementation
- Uses Event Tracing for Windows (ETW) for telemetry
- Different from the text file logging system
- Keys required to send telemetry to the right server
- Keys are not stored in the repository
- Obfuscated in public code
- Replaced during the release process
- Stored in private NuGet packages for release builds
C++ Telemetry
- Managed through trace_base.h which:
- Registers the provider
- Checks if user has disabled diagnostics
- Defines events
- Example from Always On Top:
Trace::AlwaysOnTop::Enable(true);
C# Telemetry
- Uses PowerToysTelemetry class
- WriteEvent method sends telemetry
- Projects add a reference to the PowerToys.Telemetry project
- Example:
PowerToysTelemetry.Log.WriteEvent(new LauncherShowEvent(hotKey));
User Controls
- Settings page allows users to:
- Turn off/on sending telemetry
- Enable viewing of telemetry data
Viewing Telemetry Data
- When "Enable viewing" is turned on, PowerToys starts ETW tracing
- Saves ETL files for 28 days
- Located at:
%LOCALAPPDATA%\Microsoft\PowerToys\ETL
(for most utilities) - Low-privilege components save to a different location
- Button in settings converts ETL to XML for user readability
- XML format chosen to follow approved compliance pattern from Windows Subsystem for Android
- Files older than 28 days are automatically deleted
Bug Report Tool
The BugReportTool can be triggered via:
- Right-click on PowerToys tray icon → Report Bug
- Left-click on tray icon → Open Settings → Bug Report Tool
It creates a zip file on desktop named "PowerToys_Report_[date]_[time].zip" containing logs and system information.
See Bug Report Tool for more detailed information about the tool.