Overview
CloudWatchLink connects Unreal Engine 4.27 and 5.8 to Amazon CloudWatch and CloudWatch Logs. Your game clients and dedicated servers send their log output and performance metrics to your AWS account, where you search them, chart them on dashboards and get alarms when something goes wrong. Requests run on background worker threads with automatic retries; every result arrives on the game thread.
- CloudWatchLink Logger (game-instance subsystem): UE_LOG forwarding with level, category and wildcard filters, structured JSON lines with context fields, background batching, flush on exit.
- CloudWatchLink Metrics (actor component): FPS, frame time, game / render / RHI thread time, GPU time, memory, player count, ping, plus counters, gauges and timings.
- CloudWatch Logs: groups, streams, retention, Put Log Events with automatic batching, Get Log Events, Filter Log Events.
- Logs Insights: Run Query And Wait returns a result table in one node; ten presets for game logs; CSV export.
- CloudWatch metrics: Put Metric(s), Get Metric Data (metric math), Get Metric Statistics (percentiles), List Metrics, Embedded Metric Format.
- Alarms and dashboards for live-ops tools, with widget and body builders.
Requirements
| Requirement | Details |
|---|---|
| Unreal Engine | 4.27 and 5.8 |
| Platforms | Win64, Linux and Android |
| Modules | CloudWatchLink (Runtime), CloudWatchLinkSdk (prebuilt AWS SDK for C++ 1.11.916 in Source/ThirdParty) |
| Dependencies | No other plugins. On Linux and Android the SDK uses the engine's libcurl, OpenSSL and certificate store. |
| AWS | An AWS account. CloudWatch, CloudWatch Logs and Cognito usage is billed by AWS (see Costs). |
Installation
- Install CloudWatchLink from Fab into your engine, or copy the
CloudWatchLinkfolder into your project'sPluginsfolder. - Enable CloudWatchLink in Edit > Plugins and restart the editor.
- Open Project Settings > Plugins > CloudWatchLink and set Region, Identity Pool Id, Log Group Name and Default Namespace.
- C++ only: add
PublicDependencyModuleNames.Add("CloudWatchLink");to yourBuild.cs.
Setting up AWS
- In Amazon Cognito create an identity pool with guest access (game clients send logs before players sign in).
- Create the log group, for example
/mygame/client, with a retention period (or let CloudWatchLink create it — that needslogs:CreateLogGroupandlogs:PutRetentionPolicy). - Give the player role of the pool only what the game client needs — writing to its own log group and putting metrics in its own namespace:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["logs:CreateLogStream", "logs:PutLogEvents"],
"Resource": "arn:aws:logs:us-east-1:123456789012:log-group:/mygame/client:*"
},
{
"Effect": "Allow",
"Action": "cloudwatch:PutMetricData",
"Resource": "*",
"Condition": { "StringEquals": { "cloudwatch:namespace": "Game/MyGame" } }
}
]
}
If the role may not create the group, create it in the console first: the logger's first CreateLogGroup then fails with AccessDeniedException, but the group exists and forwarding continues (the stream is created with logs:CreateLogStream). To let the plugin create the group too, add logs:CreateLogGroup and logs:PutRetentionPolicy on arn:aws:logs:us-east-1:123456789012:log-group:/mygame/client.
logs:GetLogEvents, logs:FilterLogEvents, logs:Describe*, logs:StartQuery, logs:GetQueryResults, logs:StopQuery), reading metrics (cloudwatch:GetMetricData, cloudwatch:GetMetricStatistics, cloudwatch:ListMetrics), deleting log groups / streams, alarms (cloudwatch:PutMetricAlarm, DescribeAlarms, SetAlarmState, DeleteAlarms, EnableAlarmActions, DisableAlarmActions) and dashboards (cloudwatch:PutDashboard, GetDashboard, ListDashboards, DeleteDashboards) belong in live-ops tools, editor utilities and dedicated servers using Static Keys or the Default Credential Chain — never give them to the player role: players could read each other's logs.DefaultGame.ini and in packaged games. Shipping builds refuse settings keys unless Allow Static Keys In Shipping is enabled (dedicated servers).Quick start
Forward the Output Log
- Enable Auto Start Forwarding in the settings — or, in your Game Instance's Init event, get CloudWatchLink Logger and call Start Forwarding.
- After login call Set Context Field with Name
playerand the player id. - Play. Lines appear in CloudWatch Logs under
/mygame/client, streamMyGame/Windows/<session id>, as JSON such as{"timestamp":"2026-10-29T12:00:00.123Z","level":"Warning","category":"LogNet","message":"...","session":"...","platform":"Windows","build":"...","project":"MyGame","player":"p-42"}.
Send game metrics
- Add a CloudWatchLink Metrics component to your GameState (or player controller). It starts at BeginPlay.
- Call Increment Counter (
Kills), Set Gauge (EnemiesAlive) or Record Timing (LoadTime) from gameplay. - Every 60 seconds the component sends FPS, FrameTime, GameThreadTime, RenderThreadTime, RHIThreadTime, GPUTime, MemoryUsed, MemoryAvailable, PlayerCount, Ping and your metrics with the dimensions Map and Platform.
Read the latest errors back (tool)
- Run Query And Wait with Query = Make Logs Insights Query (Recent Errors), Log Groups empty (= the settings' group).
- On Success, show Results > Rows (each row a map:
@timestamp,level,category,message,session) or save Query Results To CSV.
Logger (UE_LOG forwarding)
The forwarder is an output device registered with GLog plus one background sender thread, shared by the whole process.
- Thread-safe: UE_LOG may be called from any thread. The capture step only checks level and category, copies the line into a bounded in-memory queue and returns; formatting, wildcard filtering and the network requests happen on the sender thread.
- Never blocks the game thread: no request is ever made on the logging thread. Stop Forwarding and the end of Play In Editor return immediately; the rest is sent in the background.
- No recursion: the category
LogCloudWatchLink(the plugin's own messages and AWS SDK warnings) is never forwarded, nor is anything logged on the sender thread itself. - Batching: lines are sent every Flush Interval Seconds (5) or as soon as Max Batch Lines (1000) are waiting, sorted by time and split by the PutLogEvents limits (10,000 events, 1 MB, 24 hours per request, 256 KB per event).
- Bounded memory: at most Max Buffered Lines (20,000) are kept while CloudWatch is unreachable; newer lines are counted in Get Dropped Count. Failed sends with retryable errors keep their lines for the next attempt.
- Shutdown: on engine exit the forwarder detaches from GLog, sends what is left within Shutdown Flush Seconds (3), aborts the request in flight if it takes longer and stops its thread before the module unloads.
- Destination: the log group from the settings (or Start Forwarding), stream
<Log Stream Prefix>/<platform>/<session>; both are created when missing.
Metrics component
Frame metrics are sampled every frame, memory / players / ping every Sample Interval (5 s); everything is aggregated per Flush Interval (60 s) into statistic sets (sample count, sum, minimum, maximum), so one minute of frame times costs one data point. Counters are summed, gauges and timings become statistic sets. Thread and GPU times are measured only where frames are drawn (they are left out on dedicated servers); ping is sent on clients only. Retryable failures (throttling, network) keep the data for the next flush, up to Max Pending Datums.
| Metric | Unit | Source |
|---|---|---|
| FPS / FrameTime | Count / Milliseconds | Real frame time (not time-dilated) |
| GameThreadTime / RenderThreadTime / RHIThreadTime | Milliseconds | Engine thread timers |
| GPUTime | Milliseconds | RHI GPU frame time |
| MemoryUsed / MemoryAvailable | Megabytes | Platform memory statistics |
| PlayerCount / Ping | Count / Milliseconds | Game state player array / local player state |
Node reference
All 90 nodes, grouped by Blueprint category. Latent nodes run in the background, fire exactly one final pin on the game thread and can be stopped with Cancel. Nodes marked (admin) need admin IAM permissions. Unset times on read nodes mean "the last hour" unless stated otherwise.
Config and identity
| Node | Kind | Inputs | Outputs | Purpose |
|---|---|---|---|---|
| Set Region | Callable | Region | - | Switches the AWS region for every following request. |
| Set Credential Mode | Callable | Mode | - | Overrides the credential mode from the settings. |
| Set Login Token | Callable | Provider, Token | - | Signs the player in to the identity pool with a provider token. |
| Clear Login Tokens | Callable | - | - | Forgets all tokens; the player becomes a guest. |
| Set Static Credentials | Callable | Access Key Id, Secret Access Key, Session Token | - | Uses these keys from now on (Static Keys mode). |
| Get Identity Id | Pure | - | Identity Id | The player's Cognito identity id (empty until resolved). |
| Make User Pool Provider Name | Pure | Region, User Pool Id | Provider | Login key of a Cognito user pool. |
| Is Configured | Pure | - | bool, Problem | False plus a reason when the settings are incomplete. |
| Resolve Identity | Latent | Force Refresh | On Success / On Failure (Identity Id, Error) | Fetches Cognito credentials now so errors show up early. |
| Cancel | Callable | (latent node) | - | None of the node's pins fire any more; Run Query And Wait also stops its query. |
| Is Finished | Pure | (latent node) | bool | True after the node finished or was cancelled. |
Logger (CloudWatchLink Logger subsystem)
| Node | Kind | Inputs | Outputs | Purpose |
|---|---|---|---|---|
| Start Forwarding | Callable | Log Group, Log Stream (both optional) | bool, Problem | Starts capturing UE_LOG lines with the settings' filters. |
| Stop Forwarding | Callable | Send Remaining | - | Stops capturing; buffered lines are sent in the background or discarded. |
| Is Forwarding | Pure | - | bool | True while lines are captured. |
| Flush Now | Callable | - | - | Sends the buffer now (returns immediately). |
| Get Buffered Count | Pure | - | int | Lines waiting to be sent. |
| Get Dropped Count | Pure | - | int64 | Lines lost (buffer full, rejected, permanent errors). |
| Log Message | Callable | Level, Category, Message, Fields, Also Print To Output Log | bool | Writes your own line with extra JSON fields (no filters apply). |
| Log Metrics EMF | Callable | Metrics, Dimensions, Namespace | bool | Writes metrics as an Embedded Metric Format line (no PutMetricData cost). |
| Set Context Field | Callable | Name, Value | - | Adds a field to every following JSON line (player, match, server...). |
| Remove Context Field | Callable | Name | - | Removes one context field. |
| Clear Context | Callable | - | - | Removes all your context fields (standard fields stay). |
| Set Minimum Level | Callable | Level | - | Forwards this level and more severe ones. |
| Set Category Filters | Callable | Allow, Deny | - | Category allow list (empty = all) and deny list. |
| Set Message Filters | Callable | Include, Exclude | - | Message wildcards (* and ?). |
| Set Flush Settings | Callable | Interval Seconds, Max Batch Lines | - | Send interval and early-send threshold. |
| Get Session Id | Pure | - | Session Id | Random id of this process (stream name, "session" field). |
| Get Log Destination | Pure | - | Log Group, Log Stream | Where lines are sent. |
| Get Forwarder Stats | Pure | - | Stats | Forwarding, buffered, sent, dropped, requests, failures, last error, last flush. |
Metrics component (CloudWatchLink Metrics)
| Node | Kind | Inputs | Outputs | Purpose |
|---|---|---|---|---|
| Start Collecting | Callable | - | - | Starts sampling and periodic sending (automatic with Auto Start). |
| Stop Collecting | Callable | Send Remaining | - | Stops sampling; optionally sends what was collected. |
| Is Collecting | Pure | - | bool | True while collecting. |
| Increment Counter | Callable | Metric Name, Delta | - | Counter summed per interval (unit Count). |
| Set Gauge | Callable | Metric Name, Value, Unit | - | Gauge value; min / max / average per interval. |
| Record Timing | Callable | Metric Name, Milliseconds | - | One duration, sent as a statistic set. |
| Flush Metrics | Callable | - | bool | Sends everything collected now. |
| Set Metric Dimension | Callable | Name, Value | - | Sets a dimension of every following datum. |
| Remove Metric Dimension | Callable | Name | - | Removes a dimension. |
| Get Pending Datum Count | Pure | - | int | Data points the next flush would send. |
| Get Last Snapshot | Pure | - | Snapshot | FPS, frame / thread / GPU ms, memory, players, ping, map of the last sample. |
| Set Intervals | Callable | Flush Interval, Sample Interval | - | Changes the intervals at runtime. |
Events: On Flushed (Datum Count) and On Failed (Error).
Logs
| Node | Kind | Inputs | Outputs | Purpose |
|---|---|---|---|---|
| Create Log Group | Latent | Log Group, Retention Days (-1 = settings), Ignore Existing | On Success / On Failure (Error) | Creates a group and sets its retention (admin). |
| Create Log Stream | Latent | Log Group, Log Stream, Ignore Existing | On Success / On Failure (Error) | Creates a stream. |
| Put Log Events | Latent | Log Group, Log Stream, Events, Create If Missing | On Success / On Failure (Result, Error) | Writes events: sorted, split by the API limits; accepted / rejected / requests. |
| Get Log Events | Latent | Log Group, Log Stream, Start / End Time (unset = no bound), Limit, Start From Head, Next Token | On Success / On Failure (Page, Error) | Reads a stream page by page. |
| Filter Log Events | Latent | Log Group, Filter Pattern, Start / End Time, Log Streams, Stream Prefix, Limit, Next Token | On Success / On Failure (Page, Error) | Searches a group with a filter pattern. |
| Describe Log Groups | Latent | Prefix, Limit, Next Token | On Success / On Failure (Result, Error) | Lists log groups with retention and size. |
| Describe Log Streams | Latent | Log Group, Prefix, Newest First, Limit, Next Token | On Success / On Failure (Result, Error) | Lists streams by last event time or name. |
| Delete Log Stream | Latent | Log Group, Log Stream | On Success / On Failure (Error) | Deletes a stream (admin). |
| Delete Log Group | Latent | Log Group | On Success / On Failure (Error) | Deletes a group and all its data (admin). |
| Put Retention Policy | Latent | Log Group, Retention Days (0 = never expire) | On Success / On Failure (Error) | Sets how long events are kept (admin). |
| Make JSON Filter Pattern | Pure | Field, Operator, Value, Numeric | Pattern | Builds { $.level = "Error" } style patterns. |
| Make Log Stream Name | Pure | Prefix, Session | Name | <prefix>/<platform>/<session>, cleaned for CloudWatch. |
Logs Insights
| Node | Kind | Inputs | Outputs | Purpose |
|---|---|---|---|---|
| Start Query | Latent | Log Groups (empty = settings), Query, Start / End Time, Limit | On Success / On Failure (Results with Query Id, Error) | Starts a query. |
| Get Query Results | Latent | Query Id | On Success / On Failure (Results, Error) | Status, columns, rows and statistics. |
| Stop Query | Latent | Query Id | On Success / On Failure (Error) | Stops a running query. |
| Run Query And Wait | Latent | Log Groups, Query, Start / End Time, Limit, Timeout Seconds | On Success / On Failure (Results, Error) | Start, poll with back-off (1-5 s), return the table; Cancel / timeout stop the query. |
| Make Logs Insights Query | Pure | Preset, Filter, Limit | Query | Ten ready-made queries for logger lines (see presets). |
| Get Query Result Value | Pure | Row, Field | bool, Value | One cell of a result row. |
| Query Results To CSV | Pure | Results | CSV | Result table as RFC 4180 CSV. |
Metrics
| Node | Kind | Inputs | Outputs | Purpose |
|---|---|---|---|---|
| Put Metric | Latent | Metric Name, Value, Unit, Dimensions, Namespace, High Resolution | On Success / On Failure (Error) | Sends one value. |
| Put Metrics | Latent | Data, Namespace | On Success / On Failure (Error) | Sends any number of data points (1000 per request, below 1 MB). |
| Get Metric Data | Latent | Queries, Start / End Time, Max Datapoints, Ascending, Next Token | On Success / On Failure (Result, Error) | Time series for metrics and metric math. |
| Get Metric Statistics | Latent | Metric Name, Dimensions, Start / End Time, Period, Statistics, Percentiles, Namespace, Unit | On Success / On Failure (Datapoints, Error) | Statistics per period, sorted by time. |
| List Metrics | Latent | Namespace, Metric Name, Dimension Filters, Recently Active, Next Token | On Success / On Failure (Result, Error) | Finds metrics. |
| Make Dimension | Pure | Name, Value | Dimension | Dimension filter for List Metrics (empty value = any). |
| Make Metric Datum | Pure | Metric Name, Value, Unit, Dimensions, High Resolution, Timestamp | Datum | A single-value data point. |
| Make Statistic Set Datum | Pure | Metric Name, Sample Count, Sum, Minimum, Maximum, Unit, Dimensions | Datum | A pre-aggregated data point. |
| Make Distribution Datum | Pure | Metric Name, Values, Counts, Unit, Dimensions | Datum | Values with counts (percentiles work on it). |
| Add Datum Dimension | Pure | Datum, Name, Value | Datum | Adds a dimension (max 30). |
| Unit To Text | Pure | Unit | Text | CloudWatch unit name such as Bytes/Second. |
| Make Metric Query | Pure | Id, Metric Name, Dimensions, Stat, Period, Namespace, Label | Query | A Get Metric Data query. |
| Make Metric Math Query | Pure | Id, Expression, Label, Period | Query | A metric math expression. |
| Summarize Series | Pure | Values, Timestamps | Summary | Count, min, max, average, sum, latest. |
| Build EMF Line | Pure | Namespace, Metrics, Dimensions, Properties | JSON line | Embedded Metric Format document. |
Alarms
| Node | Kind | Inputs | Outputs | Purpose |
|---|---|---|---|---|
| Make Metric Alarm | Pure | Alarm Name, Metric Name, Dimensions, Statistic, Comparison, Threshold, Period, Evaluation Periods, Alarm Actions | Alarm | Builds an alarm (all other fields are editable on the struct). |
| Put Metric Alarm | Latent | Alarm | On Success / On Failure (Error) | Creates or updates an alarm (admin). |
| Describe Alarms | Latent | Alarm Names, Prefix, State, Max Records, Next Token | On Success / On Failure (Result, Error) | Metric alarms with state and reason. |
| Set Alarm State | Latent | Alarm Name, State, Reason, Reason Data Json | On Success / On Failure (Error) | Temporarily sets a state (test notifications). |
| Delete Alarms | Latent | Alarm Names | On Success / On Failure (Error) | Deletes alarms (admin). |
| Enable Alarm Actions | Latent | Alarm Names | On Success / On Failure (Error) | Turns actions back on (admin). |
| Disable Alarm Actions | Latent | Alarm Names | On Success / On Failure (Error) | Mutes actions, e.g. during maintenance (admin). |
Dashboards
| Node | Kind | Inputs | Outputs | Purpose |
|---|---|---|---|---|
| Put Dashboard | Latent | Dashboard Name, Body | On Success / On Failure (Dashboard with Validation Messages, Error) | Creates or replaces a dashboard (admin). |
| Get Dashboard | Latent | Dashboard Name | On Success / On Failure (Dashboard, Error) | Reads the body JSON. |
| List Dashboards | Latent | Prefix, Next Token | On Success / On Failure (Result, Error) | Lists dashboards. |
| Delete Dashboards | Latent | Dashboard Names | On Success / On Failure (Error) | Deletes dashboards (admin). |
| Make Dashboard Metric Widget | Pure | Title, Metrics, Single Value, Region, X, Y, Width, Height | Widget JSON | Graph or number widget. |
| Make Dashboard Log Widget | Pure | Title, Log Group, Query, Region, X, Y, Width, Height | Widget JSON | Logs Insights table widget. |
| Make Dashboard Body | Pure | Widgets | Body JSON | Joins widgets for Put Dashboard. |
JSON
| Node | Kind | Inputs | Outputs | Purpose |
|---|---|---|---|---|
| Get JSON Field | Pure | Json, Path | bool, Value | Reads a.b[2].c from a JSON document (log lines, EMF, dashboard bodies). |
Logs Insights presets
| Preset | Query (Limit = rows) |
|---|---|
| Recent Errors | fields @timestamp, level, category, message, session | filter level in ["Error", "Fatal"] | sort @timestamp desc |
| Errors By Category | filter level in ["Error", "Fatal"] | stats count(*) as errors by category | sort errors desc |
| Warnings By Category | filter level = "Warning" | stats count(*) as warnings by category |
| Top Messages | stats count(*) as occurrences by message | sort occurrences desc |
| Log Volume Over Time | stats count(*) as lines by bin(5m), level |
| Session Timeline | every line of the session given as Filter |
| Player Timeline | every line whose player context field equals Filter |
| Search Text | lines whose message contains Filter |
| Sessions Per Platform | stats count_distinct(session) as sessions by platform, build |
| Fatal Errors / Crashes | Fatal lines with session, platform and build |
The presets need Structured JSON on (the default): Logs Insights discovers the JSON fields of each line automatically.
C++ API
#include "CloudWatchLinkLibrary.h"
#include "CloudWatchLinkLogger.h"
// Metrics with a game-thread callback.
TArray<FCloudWatchLinkMetricDatum> Data;
Data.Add(UCloudWatchLinkLibrary::MakeMetricDatum(TEXT("MatchLength"), 312.f, ECloudWatchLinkUnit::Seconds,
TMap<FString, FString>(), false, FDateTime(0)));
UCloudWatchLinkLibrary::PutMetricsNative(FString(), Data,
FCloudWatchLinkNativeDelegate::CreateLambda([](const FCloudWatchLinkError& Error) { /* ... */ }));
// The logger is a game-instance subsystem.
if (UCloudWatchLinkLogger* Logger = GetGameInstance()->GetSubsystem<UCloudWatchLinkLogger>())
{
FString Problem;
Logger->StartForwarding(FString(), FString(), Problem);
Logger->SetContextField(TEXT("match"), MatchId);
}
All latent node classes (UCloudWatchLinkSimpleAction, UCloudWatchLinkQueryAction and the others) can be created from C++ through their static factory functions; bind the delegates, then call Activate().
Types
| Type | Kind | Members |
|---|---|---|
| FCloudWatchLinkMetricDatum | Struct | Metric Name, Value, Unit, Dimensions, High Resolution, Timestamp, Is Statistic Set, Sample Count, Sum, Minimum, Maximum, Values, Counts |
| FCloudWatchLinkDimension | Struct | Name, Value |
| FCloudWatchLinkMetricQuery | Struct | Id, Namespace, Metric Name, Dimensions, Stat, Period, Expression, Label, Return Data |
| FCloudWatchLinkMetricDataResult / Series | Struct | Series (Id, Label, Status Code, Timestamps, Values), Messages, Next Token |
| FCloudWatchLinkDatapoint | Struct | Timestamp, Sample Count, Average, Sum, Minimum, Maximum, Unit, Extended Statistics |
| FCloudWatchLinkMetricInfo / List | Struct | Namespace, Metric Name, Dimensions; Metrics, Next Token |
| FCloudWatchLinkAlarmSpec | Struct | Alarm Name, Description, Namespace, Metric Name, Dimensions, Statistic, Extended Statistic, Period, Evaluation Periods, Datapoints To Alarm, Threshold, Comparison, Treat Missing Data, Unit, Alarm / OK / Insufficient Data Actions, Actions Enabled |
| FCloudWatchLinkAlarm / List | Struct | Name, Arn, Description, State, State Reason, State Updated, Namespace, Metric Name, Dimensions, Statistic, Period, Evaluation Periods, Threshold, Comparison Operator, Actions Enabled, Alarm Actions |
| FCloudWatchLinkDashboard / List | Struct | Name, Arn, Body, Last Modified, Size Bytes, Validation Messages |
| FCloudWatchLinkLogEvent / Page | Struct | Timestamp, Message, Ingestion Time, Log Stream Name, Event Id; Events, Next Token, Backward Token |
| FCloudWatchLinkPutLogsResult | Struct | Accepted, Rejected, Requests, Created Destination |
| FCloudWatchLinkLogGroup / Stream / Lists | Struct | Name, Arn, Creation Time, Retention In Days, Stored Bytes, Metric Filter Count; First / Last Event Time, Last Ingestion Time |
| FCloudWatchLinkQueryResults / Row | Struct | Query Id, Status, Columns, Rows (Fields map), Records Matched / Scanned, Bytes Scanned |
| FCloudWatchLinkForwarderStats | Struct | Forwarding, Buffered, Sent, Dropped, Requests, Failed Requests, Last Error, Last Flush Time, Log Group, Log Stream |
| FCloudWatchLinkGameSnapshot | Struct | Fps, Frame Time Ms, Game / Render / RHI Thread Ms, Gpu Ms, Memory Used / Available MB, Player Count, Ping Ms, Map Name, Time |
| FCloudWatchLinkSeriesSummary | Struct | Count, Minimum, Maximum, Average, Sum, Latest |
| FCloudWatchLinkError | Struct | Code, Message, Http Status, Retryable |
| Enums | Enum | ECloudWatchLinkCredentialMode, ECloudWatchLinkUnit, ECloudWatchLinkLogLevel, ECloudWatchLinkQueryStatus, ECloudWatchLinkStatistic, ECloudWatchLinkComparison, ECloudWatchLinkAlarmState, ECloudWatchLinkMissingData, ECloudWatchLinkInsightsPreset |
Settings
Project Settings > Plugins > CloudWatchLink (saved to DefaultGame.ini). Connection changes apply to the next request; forwarding filters apply at the next Start Forwarding (or use the Set ... nodes at runtime).
| Setting | Default | Description |
|---|---|---|
| Region | us-east-1 | Region of your logs, metrics and identity pool. |
| Credential Mode | Cognito Identity Pool | Cognito Identity Pool, Static Keys or Default Credential Chain. |
| Identity Pool Id / Allow Guest Access | (empty) / On | Cognito identity pool and guest identities. |
| Access Key Id / Secret Access Key | (empty) | Static Keys mode - development and servers only. |
| Allow Static Keys In Shipping | Off | Settings keys are refused in Shipping builds unless enabled. |
| Endpoint Override | (empty) | Custom endpoint such as a local emulator. |
| Request / Connect Timeout Ms, Max Retries, Worker Threads | 30000 / 5000, 3, 4 | Request limits and background threads. |
| Verify SSL / Log Sdk Warnings | On / On | TLS verification; SDK warnings to LogCloudWatchLink (never forwarded). |
| Default Namespace | (empty = Game/<project>) | Metric namespace when a node leaves Namespace empty. |
| Log Group Name | /game/client | Group of the logger and of log nodes that leave Log Group empty. |
| Log Stream Prefix | (empty = project name) | First part of the logger's stream name. |
| Log Retention Days | 30 | Retention when CloudWatchLink creates a group (0 = never expire). |
| Auto Start Forwarding / Stop With Game Instance | Off / On | Start with the game instance; stop at the end of Play In Editor. |
| Minimum Level | Log | Forward this level and more severe ones. |
| Allow / Deny Categories | (empty) | Category filters. |
| Include / Exclude Patterns | (empty) | Message wildcards. |
| Structured Json | On | JSON lines (off = "[Level] Category: message"). |
| Flush Interval Seconds / Max Batch Lines | 5 / 1000 | Send interval and early-send threshold. |
| Max Buffered Lines / Shutdown Flush Seconds | 20000 / 3 | Memory bound; time allowed for the last send on exit. |
Costs
CloudWatch is billed per GB of ingested and stored log data, per custom metric (each unique combination of name and dimensions), per API request (reads, PutMetricData), per alarm, per dashboard and per GB scanned by Logs Insights. For large player bases keep Minimum Level at Warning in Shipping builds, use few dimensions (Map and Platform are low-cardinality; never use player ids as dimensions), keep the metrics component's Flush Interval at 60 s, and set a retention period on every log group. Log Metrics EMF is a cheap way to get metrics from servers that already forward logs.
Troubleshooting
| Error code | Cause and fix |
|---|---|
NotConfigured | Identity Pool Id or static keys missing in Project Settings > Plugins > CloudWatchLink. |
AccessDeniedException | The role lacks the permission (logs:PutLogEvents on the group, cloudwatch:PutMetricData with the namespace condition). See Setting up AWS. |
ResourceNotFoundException | Wrong log group / stream / dashboard name, or a different region. Put Log Events with Create If Missing creates group and stream. |
InvalidParameterException | Invalid name, retention value (allowed: 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1096, 1827, 2192, 2557, 2922, 3288, 3653) or query. |
MalformedQueryException | Logs Insights query syntax error. |
Cancelled / Timeout / QueryNotComplete | Run Query And Wait was cancelled, ran longer than Timeout Seconds, or the query failed on AWS. |
Unavailable | The SDK library could not be loaded or the engine is shutting down. See the Output Log (LogCloudWatchLink). |
| Nothing arrives | Check Get Forwarder Stats: Last Error, Dropped. Lines older than 14 days or more than 2 hours in the future are rejected by CloudWatch (Rejected count of Put Log Events). |
Credits
© 2026 Alpha XP — alphaxp.net · Support: support@alphaxp.net. Includes the AWS SDK for C++ and the AWS Common Runtime (Apache License 2.0). Built for Unreal Engine 4.27 and 5.8.