in src/PortingAssistant.Client.Telemetry/Uploader.cs [22:120]
public static bool Upload(TelemetryConfiguration teleConfig, string profile, string prefix)
{
try
{
var fileEntries = new List<string> {
teleConfig.LogFilePath,
teleConfig.MetricsFilePath
}.Where(x => !string.IsNullOrEmpty(x) && File.Exists(x)).ToList();
var lastReadTokenFile = Path.Combine(teleConfig.LogsPath, "lastToken.json");
var fileLineNumberMap = new Dictionary<string, int>();
if (File.Exists(lastReadTokenFile))
{
fileLineNumberMap = JsonConvert.DeserializeObject<Dictionary<string, int>>(File.ReadAllText(lastReadTokenFile));
}
foreach (var file in fileEntries)
{
var logName = Path.GetFileNameWithoutExtension(file);
var fileExtension = Path.GetExtension(file);
if (fileExtension == ".log")
{
logName = $"{logName}-logs";
}
else if (fileExtension == ".metrics")
{
logName = $"{logName}-metrics";
}
// Add new files to fileLineNumberMap
if (!fileLineNumberMap.ContainsKey(file))
{
fileLineNumberMap[file] = 0;
}
var initLineNumber = fileLineNumberMap[file];
FileInfo fileInfo = new FileInfo(file);
var success = false;
using (FileStream fs = fileInfo.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (StreamReader reader = new StreamReader(fs))
{
// If put-log api works keep sending logs else wait and do it next time
var logs = new ArrayList();
int currLineNumber = 0;
for (; currLineNumber < initLineNumber; currLineNumber++)
{
string line = reader.ReadLine();
if (line == null)
{
return true;
}
}
while (!reader.EndOfStream)
{
currLineNumber++;
logs.Add(reader.ReadLine());
// send 1000 lines of logs each time when there are large files
if (logs.Count >= 1000)
{
// logs.TrimToSize();
success = PutLogData(logName, JsonConvert.SerializeObject(logs), profile, teleConfig).Result;
if (success) { logs = new ArrayList(); }
else
{
return false;
}
}
}
if (logs.Count != 0)
{
success = PutLogData(logName, JsonConvert.SerializeObject(logs), profile, teleConfig).Result;
if (!success)
{
return false;
}
}
if (success)
{
fileLineNumberMap[file] = currLineNumber;
string jsonString = JsonConvert.SerializeObject(fileLineNumberMap);
File.WriteAllText(lastReadTokenFile, jsonString);
}
}
}
}
return true;
}
catch (Exception ex)
{
Log.Logger.Error(ex.Message);
return false;
}
}