Logger¶
SDK logging API â access via BackgroundGeolocation.logger.
The SDK writes structured log entries to an internal SQLite database for
up to LoggerConfig.logMaxDays days (default 3). Log volume is
controlled by LoggerConfig.logLevel (default LogLevel.Off). Logs
can be fetched as a string, emailed from the device, or uploaded to a URL.
Contents¶
Overview¶
| Method | Description |
|---|---|
getLog |
Fetch all log entries as a string. |
emailLog |
Send logs via the device mail client. |
uploadLog |
Upload logs to a URL as a gzipped multipart file. |
destroyLog |
Clear the log database. |
debug, info, warn, error, notice |
Write custom log entries. |
Retrieving logs¶
All three retrieval methods accept an optional SQLQuery to constrain results by date range, sort order, and record count. Without a query, all records up to LoggerConfig.logMaxDays days old are returned.
Sample log output:
09-19 11:12:18.716 ââââââââââââââââââââââââââââââââââââââââââââââ
09-19 11:12:18.716 â BackgroundGeolocation Service started
09-19 11:12:18.716 â âââââââââââââââââââââââââââââââââââââââââââââ
09-19 11:12:18.723 â
Started in foreground
09-19 11:12:18.737 đž Start activity updates: 10000
09-19 11:12:21.405 â
INSERT: bca5acc8-e358-4d8f-827f-b8c0d556b7bb
09-19 11:12:21.454 đĩ HTTP POST: bca5acc8-e358-4d8f-827f-b8c0d556b7bb
09-19 11:12:22.083 đĩ Response: 200
09-19 11:12:22.100 â
DESTROY: bca5acc8-e358-4d8f-827f-b8c0d556b7bb
Analyzing a log¶
A multi-day capture runs to hundreds of thousands of lines.
loganalyzer reads one and
produces a triage digest â what the SDK did and what went wrong â plus an
interactive map of where it did it:
It accepts the exports produced by getLog, emailLog and
uploadLog â .log or .log.gz, one file or several.
digest.md is pseudonymized (coordinates become COORD-A, geofences GF-1),
which makes it the artifact to attach to a support issue. map.html plots
full-precision coordinates and is a local instrument â do not share it.
See Debugging â Log Analyzer for the full walkthrough.
Writing log entries¶
Insert custom messages into the SDK's log database at any severity level. Custom entries appear inline with SDK entries, making it easy to correlate your app's actions with location events.
| Method | Level | Icon |
|---|---|---|
error |
ERROR |
âī¸ |
warn |
WARNING |
â ī¸ |
debug |
DEBUG |
đ |
info |
INFO |
âšī¸ |
notice |
INFO |
đĩ |
BackgroundGeolocation.onLocation((Location location) {
Logger.debug("Location received: " + location.uuid);
});
Examples¶
Fetch and display the full log¶
Upload log to your server¶
Email log with a date range¶
Members¶
debug¶
Insert a debug-level message into the SDK's log database.
destroyLog¶
Delete all records from the SDK's log database.
See also
- LoggerConfig.logLevel
- getLog
- emailLog
- uploadLog
- đDebugging Guide
emailLog¶
static Future<bool> emailLog(String email, [SQLQuery? query])
Send the SDK's log database to an email address via the device mail client.
Provide an optional SQLQuery to constrain which records are included.
See also
- LoggerConfig.logLevel
- getLog
- uploadLog
- đDebugging Guide
- đAnalyzing a log
Logger.emailLog('foo@bar.com').then((bool success) {
print('[emailLog] success');
}).catchError((error) {
print('[emailLog] FAILURE: ${error}');
});
// Or constrain results by providing a [SQLQuery]:
Logger.emailLog('foo@bar.com', SQLQuery(
start: DateTime.parse('2019-10-20 09:00'),
end: DateTime.parse('2019-10-20 11:59')
)).then((bool success) {
print('[emailLog] success');
}).catchError((error) {
print('[emailLog] FAILURE: ${error}');
});
error¶
Insert an error-level message into the SDK's log database.
getLog¶
static Future<String> getLog([SQLQuery? query])
Fetch the SDK's log database as a string.
Provide an optional SQLQuery to constrain results by date range, sort order, and record count. Depending on LoggerConfig.logLevel, the result may be several megabytes.
See also
- LoggerConfig.logMaxDays
- LoggerConfig.logLevel
- emailLog
- uploadLog
- đDebugging Guide
// Fetch entire contents of log.
String log = await Logger.getLog();
// Warning: this string could be several megabytes.
print('[log] success: ${log}');
// Or constrain results between optionl start/end dates using a SQLQuery
String log = await Logger.getLog(SQLQuery(
start: DateTime.parse('2019-10-21 13:00'), // <-- optional HH:mm:ss
end: DateTime.parse('2019-10-22')
));
// Or just a start date
String log = await Logger.getLog(SQLQuery(
start: DateTime.parse('2019-10-21 13:00')
));
// Or just an end date
String log = await Logger.getLog(SQLQuery(
end: DateTime.parse('2019-10-21')
));
info¶
Insert an info-level message into the SDK's log database.
notice¶
Insert a notice-level message into the SDK's log database.
uploadLog¶
static Future<bool> uploadLog(String url, [SQLQuery? query])
Upload the SDK's log database to a URL as a gzipped multipart file.
Provide an optional SQLQuery to constrain which records are included. The upload includes your configured HttpConfig.headers for authentication.
Multipart upload¶
The log is posted as a gzipped multipart file â the same file produced by
emailLog. The request body also includes a form with the following
fields:
| Key | Value |
|---|---|
state |
JSON-encoded result of getState |
model |
Device model |
manufacturer |
Device manufacturer |
platform |
iOS or Android |
version |
OS version |
See also
- LoggerConfig.logLevel
- getLog
- emailLog
- destroyLog
- đDebugging Guide
Logger.uploadLog('https://my.server.com/users/123/logs').then((bool success) {
print('[uploadLog] success');
}).catchError((error) {
print('[uploadLog] FAILURE: ${error}');
});
// Or constrain results by providing a [SQLQuery]:
Logger.uploadLog('https://my.server.com/users/123/logs', SQLQuery(
start: DateTime.parse('2019-10-20 09:00'),
end: DateTime.parse('2019-10-20 11:59')
)).then((bool success) {
print('[uploadLog] success');
}).catchError((error) {
print('[uploadLog] FAILURE: ${error}');
});
warn¶
Insert a warning-level message into the SDK's log database.