public override void Process() { foreach (Resource resource in ResourceListMessage.Resources) { if (resource.Length == 0) { continue; } if (resource.ResourceName == ResourceType.NodeCommanderLog) { string lines = Encoding.Default.GetString(resource.Data); foreach (string line in lines.Split(new string[] { "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries)) { string[] fields = line.Split(new string[] { "||" }, StringSplitOptions.None); NodeLogMessage logMessage = new NodeLogMessage() { FullNodeName = resource.FullNodeName, Timestamp = DateTime.ParseExact(fields[0], "yyyy-MM-dd HH:mm:ss.ffff", null), Thread = int.Parse(fields[1]), Level = fields[2], CallSite = fields[3], Message = fields[4], Exception = fields[5], Stacktrace = fields[6] }; Agent.Session.Database.Persist(logMessage); if (fields.Length == 5 && fields[3] == "Stratis.Bitcoin.Features.Miner.PowMining.GenerateBlocks") { Regex miningRegex = new Regex("([0-9]+)-([0-9a-f]+)"); Match match = miningRegex.Match(fields[4]); BlockchainMining miningEntry = new BlockchainMining(); miningEntry.Timestamp = logMessage.Timestamp; miningEntry.FullNodeName = resource.FullNodeName; miningEntry.BlockNumber = int.Parse(match.Groups[1].Value); miningEntry.BlockHash = match.Groups[2].Value; Agent.Session.Database.Persist(miningEntry); } else if (fields.Length == 5 && fields[3] == "Stratis.Bitcoin.Features.Consensus.ConsensusLoop.RewindCoinViewLockedAsync") { Regex reorgRegex = new Regex("([0-9]+)-([0-9a-f]+)' to '([0-9]+)-([0-9a-f]+)"); Match match = reorgRegex.Match(fields[4]); BlockchainReorg reorgEntry = new BlockchainReorg(); reorgEntry.Timestamp = logMessage.Timestamp; reorgEntry.FullNodeName = resource.FullNodeName; reorgEntry.FromBlockNumber = int.Parse(match.Groups[1].Value); reorgEntry.FromBlockHash = match.Groups[2].Value; reorgEntry.ToBlockNumber = int.Parse(match.Groups[3].Value); reorgEntry.ToBlockHash = match.Groups[4].Value; Agent.Session.Database.Persist(reorgEntry); } } } } }
public void AddRow(NodeLogMessage logMessage) { DataRow rowData = DataTable.NewRow(); CreateColumnIfNotExist("Timestamp", "Timestamp", typeof(DateTime), 30); rowData["Timestamp"] = logMessage.Timestamp; CreateColumnIfNotExist("Level", "Level", typeof(String), 30); rowData["Level"] = logMessage.Level; CreateColumnIfNotExist("Message", "Message", typeof(NodeLogMessage), 130); rowData["Message"] = logMessage; DataTable.Rows.Add(rowData); }
public void Persist(NodeLogMessage logMessage) { try { using (var t = Engine.GetTransaction()) { t.SynchronizeTables("LogMessage"); bool newEntity = logMessage.Id == 0; if (newEntity) { logMessage.Id = t.ObjectGetNewIdentity <long>("Mining"); } t.ObjectInsert("LogMessage", new DBreezeObject <NodeLogMessage> { NewEntity = newEntity, Entity = logMessage, Indexes = new List <DBreezeIndex> { new DBreezeIndex(1, logMessage.Id) { PrimaryIndex = true }, new DBreezeIndex(2, logMessage.Timestamp), new DBreezeIndex(3, logMessage.FullNodeName), } }, false); t.TextInsert("TS_LogMessage", logMessage.Id.ToBytes(), logMessage.FullNodeName); t.Commit(); } } catch (Exception ex) { throw ex; } }