Changing The Verbosity Of Timebase Logging
When you need to diagnose a problem, you can increase the verbosity for specific components without touching anything else.
Overview
All four Timebase products — Historian, Collector, Explorer, and Pulse — use the same logging system. Logs are written to a rolling daily file and to the console (or Windows service output). A live log viewer is also available inside each product's web interface. By default, only informational and higher-severity messages from Timebase itself are shown; third-party library output is limited to warnings and errors. When you need to diagnose a problem, you can increase the verbosity for specific components without touching anything else.
Where Logs Are Written
Each product writes to the same three destinations simultaneously:
| Destination | Details |
|---|---|
| Rolling log file | One file per day, kept for 7 days. Older files are deleted automatically. |
| Console / service output | Visible when running in a terminal, or in service console output. |
| In-browser log viewer | Live view inside each product's web interface. Shows the last 1,000 log entries from the current session only — not persisted. |
Log file locations
| Product | Windows path | Docker path |
|---|---|---|
| Historian | C:\ProgramData\Flow Software\Timebase\Historian\Logs\ |
/logs/ |
| Collector | C:\ProgramData\Flow Software\Timebase\Collector\Logs\ |
/logs/ |
| Explorer | C:\ProgramData\Flow Software\Timebase\Explorer\Logs\ |
/logs/ |
| Pulse | C:\ProgramData\Flow Software\Timebase\Pulse\Logs\ |
/logs/ |
Log filenames include the date, e.g. 20260503.txt. The path can be changed by setting the Logs key in settings.config or via environment variable.
How to Change the Log Level
Each product reads its log level from a settings.config file. Edit the Serilog section directly — the change takes effect immediately without restarting the service.
Settings file locations
| Product | Windows path |
|---|---|
| Historian | C:\ProgramData\Flow Software\Timebase\Historian\Settings\settings.config |
| Collector | C:\ProgramData\Flow Software\Timebase\Collector\Settings\settings.config |
| Explorer | C:\ProgramData\Flow Software\Timebase\Explorer\Settings\settings.config |
| Pulse | C:\ProgramData\Flow Software\Timebase\Pulse\Settings\settings.config |
Docker: /settings/settings.config (mapped from the product's settings volume)
The Serilog section
The Serilog section in settings.config controls which messages are shown:
"Serilog": {
"MinimumLevel": {
"Default": "Warning",
"Override": {
"Timebase.Historian": "Information",
"Timebase.Dataset": "Information"
}
}
}
Default— the minimum level for everything not listed inOverride. Keep this atWarningto suppress noise from ASP.NET Core and other libraries.Override— per-namespace level settings. The product's own namespace is listed here so its messages appear atInformationby default.
Available log levels
Levels in order from least to most severe:
| Level | When to use |
|---|---|
Verbose |
Maximum detail — individual data points, internal loop iterations. Very high volume. |
Debug |
Detailed data flow — chunk sizes, batch results, connection events. Use for active diagnosis. |
Information |
Normal operation milestones. This is the default for Timebase code. |
Warning |
Recoverable problems — connection retries, token refresh, buffer activation. |
Error |
Failures that need attention but did not stop the service. |
Fatal / Critical |
Startup failures that caused the service to exit. |
Namespace overrides for each product
Use these namespace values in the Override section of settings.config:
| Product | Namespace | What it covers |
|---|---|---|
| Historian | Timebase.Historian |
Historian service, datasets, API |
| Historian | Timebase.Dataset |
Individual dataset operations |
| Collector | Timebase.Collector |
Collector service and all plugins (OPC UA, MQTT, SparkplugB, etc.) |
| Collector — OPC UA only | Timebase.Collector.OPCUA |
OPC UA plugin exclusively |
| Collector — MQTT only | Timebase.Collector.MQTT |
MQTT plugin exclusively |
| Collector — SparkplugB only | Timebase.Collector.SparkplugB |
SparkplugB plugin exclusively |
| Explorer | Timebase.Explorer |
Explorer service, proxy, historian client |
| Pulse | Timebase.Pulse |
Pulse service, authentication, certificates |
To set a level for all Timebase code across every namespace at once, use the parent namespace:
"Override": {
"Timebase": "Debug"
}
Alternate methods
You can also change the log level without editing settings.config:
Environment variable (takes effect on next restart):
Serilog__MinimumLevel__Default=Debug
Serilog__MinimumLevel__Override__Timebase.Historian=Debug
Docker compose:
environment:
- Serilog__MinimumLevel__Override__Timebase.Historian=Debug
Command-line argument (highest precedence, overrides everything):
--Serilog:MinimumLevel:Default=Debug
What Each Level Shows
Historian
Information (default)
| Message | What it means |
|---|---|
Historian starting ... |
Service is starting |
Historian 'Auth' configured as {Url} for '{ClientId}' |
OAuth2 authentication is active |
Historian 'Auth' disabled |
Running without authentication |
Historian started |
Fully initialized, all datasets loaded |
Process listening on {Urls} |
API is accepting requests |
Historian tags: {Count} |
Daily diagnostic summary |
Historian size: {Size} GB |
Storage summary |
Historian space available: {Space} GB ({Percent}%) |
Disk space check |
Historian removed dataset {DatasetName} |
Dataset deleted |
Warning
| Message | What it means |
|---|---|
Historian dataset {Dataset} collector has timed out, entering "store forward" state |
Collector disconnected — data will buffer |
Historian dataset {Dataset} collector has lost communication |
Extended collector disconnect |
Dataset directory for {DatasetName} not found at {Path} |
Dataset directory missing on disk |
Debug — Data flow messages: HTTP request details, chunk dispatch timing.
Collector
Information (default)
| Message | What it means |
|---|---|
Collector starting ... |
Service is starting |
Collector plugin {Plugin} starting ... / started |
Plugin lifecycle |
Collector started |
All plugins running |
OPCUA plugin successfully created session |
OPC UA connected |
OPCUA plugin subscription cycle finished in {Elapsed}ms, {Matched} nodes matched, {Subscribed} total subscribed |
Node browsing complete |
OPCUA plugin Subscription[{Index}] now monitoring {Count} nodes |
Active subscriptions |
Client {name} store and forward deactivated for dataset {Dataset} |
Historian reconnected, buffer drained |
Client {name} tag cache successfully populated for dataset {Dataset} with {Count} tags |
Tag cache ready |
Warning
| Message | What it means |
|---|---|
Collector is running, but 'Active' setting is set to false, data collection is paused |
Collection intentionally paused |
OPCUA plugin failed to create session: {Exception} |
OPC UA connection failed — retrying every 10 seconds |
OPCUA plugin failed to read DataType for node {NodeId} |
Node skipped — check OPC UA server |
OPCUA plugin keep alive status: {KeepAlive} |
Keep-alive issue detected |
Client {name} hub connection to {BaseAddress} has disconnected |
Lost connection to Historian |
Client {name} store and forward activated for dataset {Dataset}. Buffered {Buffer} points |
Historian unreachable — buffering data |
MQTT plugin connection to {Broker}:{Port} failed: {Reason} |
MQTT connection error |
SparkplugB plugin Data Received before birth |
SparkplugB sequence issue |
Critical (plugin startup failures)
| Message | What it means |
|---|---|
Collector plugin {Plugin} failed to start: {Exception} |
Plugin failed — check configuration |
Collector '{Setting}' is not configured |
Required setting is missing |
Debug — Chunk-level write detail: sending chunk for dataset {Dataset}: {Chunk} points for {Tags} tags, write timing, buffering rate.
Verbose — Individual data point trace: buffered {Tag} value {Value}: Message {SequenceNumber}. Very high volume — use only for a single tag.
Explorer
Information (default)
| Message | What it means |
|---|---|
Explorer starting ... |
Service is starting |
Explorer initialized |
Configuration loaded |
Process listening on {Urls} |
UI is accepting requests |
Source proxy service configuration reloaded |
Historian proxy updated |
Client {name} hub reconnected to {BaseAddress}: {ConnectionId} |
Reconnected to Historian |
Warning
| Message | What it means |
|---|---|
Client {name} hub connection to {BaseAddress} has disconnected |
Lost connection to Historian |
Client {name} store and forward activated for dataset {Dataset} |
Historian unreachable |
Client {name} failed to send status data to {BaseAddress} |
Status update failed |
Critical (startup failures)
| Message | What it means |
|---|---|
Explorer 'Historians' is not configured |
No historian defined in config |
Explorer Historian[{Index}] 'Host' is not configured |
Historian host missing |
Explorer configuration could not be loaded |
Config file unreadable |
Debug — Historian client connection detail, SignalR reconnect events, HTTP proxy request/response timing.
Pulse
Information (default)
| Message | What it means |
|---|---|
Pulse starting ... |
Service is starting |
Pulse created {Count} default clients in {Object} |
Default OAuth2 clients seeded |
Pulse started |
Ready to handle authentication requests |
Process listening on {Urls} |
Accepting requests |
Certificates generated certificate: {Subject}, expires {Expiry} |
TLS certificate created or renewed |
RootCA Root CA generated and saved: {Subject}, expires {Expiry} |
Root CA created |
RootCA installed Root CA to OS trust store: {Subject} |
Root CA trusted by OS |
Warning
| Message | What it means |
|---|---|
JWT Challenge triggered. Authentication scheme: {AuthScheme}, Error: {Error} |
A request failed authentication |
RootCA failed to install Root CA to OS trust store |
Manual trust store installation may be needed |
Skipping key due to missing private key material or ID |
A signing key is malformed |
Error
| Message | What it means |
|---|---|
JWT Authentication Failed |
Token validation failed — check client credentials and Pulse URL |
No signing keys found in storage. JWT validation will fail |
Key store is empty — restart Pulse to regenerate keys |
No validation keys provided by IKeyProvider |
Key provider returned nothing |
Debug — JWT validation detail per request, OAuth2 authorization code flow steps, configuration reload notifications.
Common Diagnostic Scenarios
Collector not delivering data to Historian
- Set
Timebase.CollectortoDebugin the Collector'ssettings.config. - Look for
sending chunk for dataset ...— if absent, data is not reaching the write client. - Look for
store and forward activated— this means the Historian is unreachable from the Collector. - Verify the Historian URL and port in the Collector configuration.
Historian shows gaps in tag data
- Check the Historian's log for
dataset {Dataset} collector has timed out— this marks when the Collector disconnected. - Check the Collector's log for
hub connection to {BaseAddress} has disconnectedaround the same time. - If Store and Forward was active, look for
store and forward deactivatedto confirm data was recovered on reconnection.
OPC UA tags not appearing or not updating
- Set
Timebase.Collector.OPCUAtoDebugin the Collector'ssettings.config. - Look for
subscription cycle finished in {Elapsed}ms, {Matched} nodes matched— ifMatchedis 0, no configured tags matched any OPC UA nodes. Check the tag filter configuration. - Look for
failed to read DataType for nodewarnings — these nodes are skipped and will not collect data. - If the connection itself is failing, look for
failed to create sessionand check the OPC UA server address and security settings.
Pulse authentication errors
- Set
Timebase.PulsetoDebugin the Pulsesettings.config. - Look for
JWT Authentication Failed— this means the token presented was invalid. - Look for
No signing keys found in storage— if present, restart Pulse to regenerate the key store. - Look for
JWT Token Validated successfullyto confirm a successful validation is occurring for the expected principal.
Explorer cannot connect to Historian
- Check Explorer logs for
Explorer Historian[{Index}] 'Host' is not configuredat startup. - Look for
Client {name} hub connection to ... has disconnectedto find when the disconnection occurred. - Verify the Historian address in the Explorer
settings.configunder theHistorianssection.