Reading Logs

You can read through logs with the LogReader class. This class follows some database conventions – you construct a query, which specifies time ranges and channels you are interested in, and then step through the results.

It is best to only ask for the data and time you need – this allows the log reader to efficiently request only the data you asked for on disk, rather than loading everything.

For example, if you have a large log with many image channels, and you only want to access one channel, just request that channel. It will be far faster then requesting all channels and doing the filtering yourself.

API Example

You can read a log by using this sample code:

ark::logging::LogReader reader("/path/to/manifest");

// Now instantiate a read cursor -- this reads over all data in the
// log, sorted by time.
auto cursor = reader.create_read_cursor();

while (auto object = cursor.step(object))
    // ... your work here ...

It is advisable to use the query interface to filter the log down to the channel you wish to read. This can speedup playback considerably.

As an example:

ark::logging::Query query;

query.minimum_time = std::chrono::steady_clock::time_point{5000ns};
query.maximum_time = std::chrono::steady_clock::time_point{10000ns};
query.message_allow_list = { "/pose" };

auto cursor = reader.create_read_cursor(query);

That will only read the /pose channel, and only between 5 and 10 microseconds.

Convenience methods exist to read only a handful of channels:

auto cursor = reader.create_read_cursor({"/pose"});

Only reads the /pose channel (it automatically creates a query for you).

You can either specify full channel names in the ark::logging::Query, or you can specify a regex:

ark::logging::Query query{.message_allow_list={"/cameras[0-2]/image"}};

In this case, this will return the channels /cameras0/image, /cameras1/image, and /cameras2/image (assuming they are in the log).

Accessing Logs via URLs

You can read logs directly via HTTP, S3, and from the Catalog. If you wish to access logs that are stored in the Catalog, simply provide the GUID. The software will automatically take care of determining where to download the files from.

A few examples:

./build/ark-logtool 4f8f8814-0579-48cb-b826-53efdff7d274 -l
./build/ark-logtool s3://my-bucket/manifests/4f8f8814-0579-48cb-b826-53efdff7d274
./build/ark-logtool /mnt/logs/manifests/4f8f8814-0579-48cb-b826-53efdff7d274

The ark::logging::LogReader constructor accepts a URL and will dispatch to the appropriate backend as necessary.

If you wish to download logs directly from S3 in your custom tool or pipeline, you do need to link against the ark::s3_log_registry. This is kept as a separate ‘plugin’ as it does bring in the AWS SDK into your binaries, which can inflate their sizes.