in SDK/AppCenter/Microsoft.AppCenter.Windows.Shared/Storage/Storage.cs [236:287]
public Task<string> GetLogsAsync(string channelName, int limit, List<Log> logs)
{
return AddTaskToQueue(() =>
{
logs?.Clear();
var retrievedLogs = new List<Log>();
AppCenterLog.Debug(AppCenterLog.LogTag,
$"Trying to get up to {limit} logs from storage for {channelName}");
var idPairs = new List<Tuple<Guid?, long>>();
var failedToDeserializeALog = false;
var objectEntries = _storageAdapter.Select(TableName, ColumnChannelName, channelName, ColumnIdName, _pendingDbIdentifiers.Cast<object>().ToArray(), limit);
var retrievedEntries = objectEntries.Select(entries =>
new LogEntry()
{
Id = (long)entries[0],
Channel = (string)entries[1],
Log = (string)entries[2]
}
).ToList();
foreach (var entry in retrievedEntries)
{
try
{
var log = LogSerializer.DeserializeLog(entry.Log);
retrievedLogs.Add(log);
idPairs.Add(Tuple.Create(log.Sid, Convert.ToInt64(entry.Id)));
}
catch (JsonException e)
{
AppCenterLog.Error(AppCenterLog.LogTag, "Cannot deserialize a log in storage", e);
failedToDeserializeALog = true;
_storageAdapter.Delete(TableName, ColumnIdName, entry.Id);
}
}
if (failedToDeserializeALog)
{
AppCenterLog.Warn(AppCenterLog.LogTag, "Deleted logs that could not be deserialized");
}
if (idPairs.Count == 0)
{
AppCenterLog.Debug(AppCenterLog.LogTag,
$"No available logs in storage for channel '{channelName}'");
return null;
}
// Process the results
var batchId = Guid.NewGuid().ToString();
ProcessLogIds(channelName, batchId, idPairs);
logs?.AddRange(retrievedLogs);
return batchId;
});
}