public void Run() { var options = new KafkaOptions(new Uri(ConfigurationManager.AppSettings["KAFKA_HOST"].ToString())) { Log = new ConsoleLog() }; // kafka에서 데이터를 받아온다. Task.Factory.StartNew(() => { var consumer = new Consumer(new ConsumerOptions(_topicName, new BrokerRouter(options)) { Log = new ConsoleLog() }); int count = 0; _loger.Info(DateTime.Now.ToString(), ""); foreach (var data in consumer.Consume()) { try { // kafka에서 가져온 메시지를 가공하여 가져온다. //bulk 미사용 var model = dataUtil.DataModeling(data.Value, "one"); ElsticSerachSend((ElasticDataModel)model); // bulk 사용 //dataList.Add((ElasticDataModel)dataUtil.DataModeling(data.Value, "bulk")); if (dataList.Count >= 100) { } count++; //Console.WriteLine("Response: P{0},O{1} : {2}", data.Meta.PartitionId, data.Meta.Offset, data.Value.ToUtf8String()); } catch (Exception ex) { _loger.Error(ex); } } _loger.Info(DateTime.Now.ToString() + " / " + count.ToString(), ""); }); Console.ReadLine(); }
// TODO : 데이터 가공 public object DataModeling(byte[] dataValue, string status) { string logType = ""; string filePath = ""; string host = ""; string logTime = ""; string realMessage = ""; //char[] separator = "".ToCharArray(); ElasticDataModel model = null; string message = ConvertEncoding(dataValue); try { // rubydebug로 입력되면 무조건 있으나 혹시몰라 예외처리. if (message.Contains("=>")) { string[] convertMessage = Regex.Split(message, ",\n"); //Replace("\"", "").Split(separator, StringSplitOptions.RemoveEmptyEntries); // TODO : Kafka에서 가져온 메시지를 가공하여 ElasticSerach에 저장 할 수 있는 DATA로 변형한다. if (convertMessage.Length > 0) { int count = 0; int indexNum = 0; foreach (var data in convertMessage) { if (data.Length > 1) { indexNum = data.IndexOf("=>") + 2; convertMessage[count] = data.Substring(indexNum, data.Length - indexNum); } count++; } } // logtype을 알아낸다. MatchCollection match = _reg.Matches(convertMessage[4]); if (match.Count != 0) { logType = match[0].ToString(); } else { logType = "INFO"; } // Log 저장 시간을 가져온다. //reg = new Regex(@"\d{4,4}[-/]\d{2,2}[-/]\d{2,2}..........."); //match = reg.Matches(convertMessage[4]); logTime = convertMessage[1]; // 가공된 데이터 저장 // 파일경로 filePath = convertMessage[0]; // host name host = convertMessage[3].Replace("\"", ""); // 가공된 메시지 realMessage = convertMessage[4].Replace("\\\\", "/"); // 데이터 가공을 완료한 뒤 가공한 데이터를 ElasticSerach에 전송 model = new ElasticDataModel(filePath, logType, host, realMessage, ConvertLogDate(logTime)); //ElsticSerachSend(model); } if (status == "bulk") { return(model); } else { return(model); } } catch (Exception ex) { _loger.Error(ex); return(ex.Message); } }