in packages/csharp/PortingAssistant/PortingAssistant.Telemetry/Utils/LogUploadUtils.cs [111:237]
public static void OnTimedEvent(
Object source,
System.Timers.ElapsedEventArgs e,
TelemetryConfiguration teleConfig,
string lastReadTokenFile,
string profile,
string prefix)
{
try
{
// Get files in directory and filter based on Suffix
string[] fileEntries = Directory.GetFiles(teleConfig.LogsPath).Where(f => (
teleConfig.Suffix.ToArray().Any(x => f.EndsWith(x))
)).ToArray();
// Get or Create fileLineNumberMap
var fileLineNumberMap = new Dictionary<string, int>();
if (File.Exists(lastReadTokenFile))
{
fileLineNumberMap = JsonConvert.DeserializeObject<Dictionary<string, int>>(File.ReadAllText(lastReadTokenFile));
}
var initLineNumber = 0;
foreach (var file in fileEntries)
{
var fName = Path.GetFileNameWithoutExtension(file);
var fileExtension = Path.GetExtension(file);
var logName = prefix;
// Check which type of log file and set the prefix
if (fName == "main")
{
continue;
}
else
{
string typeOfLog = fName.Split('-')[1];
if (typeOfLog == "assessment")
{
continue;
}
else if (typeOfLog == "telemetry")
{
logName = "portingAssistant-metrics";
}
else if (typeOfLog == "backend")
{
logName = "portingAssistant-backend-logs";
}
else if (typeOfLog == "electron")
{
logName = "electron-logs";
}
else if (typeOfLog == "react")
{
logName = "react-errors";
}
else if (typeOfLog == "client")
{
var suffix = Path.GetExtension(file);
logName = suffix == ".log" ? "portingAssistant-client-cli-logs" : "portingAssistant-client-cli-metrics";
}
}
var logs = new ArrayList();
// Add new files to fileLineNumberMap
if (!fileLineNumberMap.ContainsKey(file))
{
fileLineNumberMap[file] = 0;
}
initLineNumber = fileLineNumberMap[file];
FileInfo fileInfo = new FileInfo(file);
var success = false;
if (!IsFileLocked(fileInfo))
{
using (FileStream fs = fileInfo.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (StreamReader reader = new StreamReader(fs))
{
string line = null;
int currLineNumber = 0;
for (; currLineNumber < initLineNumber; currLineNumber++)
{
line = reader.ReadLine();
if (line == null)
{
return;
}
}
line = reader.ReadLine();
// If put-log api works keep sending logs else wait and do it next time
while (line != null && logs.Count <= 1000)
{
currLineNumber++;
logs.Add(line);
line = 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(); };
}
}
if (logs.Count != 0)
{
success = PutLogData(logName, JsonConvert.SerializeObject(logs), profile, teleConfig).Result;
}
if (success)
{
fileLineNumberMap[file] = currLineNumber;
string jsonString = JsonConvert.SerializeObject(fileLineNumberMap);
File.WriteAllText(lastReadTokenFile, jsonString);
}
}
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}