예제 #1
0
        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();
        }
예제 #2
0
        // 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);
            }
        }