全体的なアイデアは、各フォルダを記録、リアルタイムのアクセスログは、一度書かれ、カフカキューを作成している、キューが高い同時実行でカフカキューを書き、デ結合ロジックの目的を達成することができ、システムログの統計情報を監視することです。そして、データがキューカフカから読み込まれ、Webページに表示したり、コンソールの実際のニーズに応じてのように。
主婦
私たちは、下記の対象に仕上がっ
1つのコンフィギュレーション・カフカ、およびメッセージキューを開始します。
2メッセージエントリにカフカコーディング、およびカフカからメッセージを読み取ります。
このセクションターゲット
メッセージから1つのカフカ書き込みコードは、読み取り正しいカフカメッセージを確実にするために、読み取りと書き込み機能。
正しくファイルとファイルバックアップ機能を記述するときtailfで2は、文書管理を実装し、シミュレーション実験事実。
3シリーズゴー開発言語使用
カフカからのメッセージを読みます
メインFUNC(){ fmt.Println( "消費者始まる...") 設定:= sarama.NewConfig() config.Consumer.Return.Errors = TRUE WG:= sync.WaitGroup {} //创建消费者 消費者、ERR := sarama.NewConsumer([]ストリング{ "はlocalhost:9092"}、設定) !ERR =ゼロ{もし fmt.Println( "コンシューマを作成できませんでした、エラーがある"、err.Error()) リターン } 延期consumer.Close () //パーティション(トピック):该方法返回了该トピック的所有分区ID partitionList、ERR:= consumer.Partitions( "テスト") ERR = nilの{もし! fmt.Println( "消費者のパーティションが失敗します") FMT .Printlnは(ERR、 "エラーです"。エラー()) リターン } パーティションの:=範囲partitionList { // ConsumePartition方法の主題によれば、 //パーティションと作成し、適切なパーティションコンシューマを作成するために、オフセット与えられた 消費者は、パーティション情報を返すエラー消費している//場合 // OffsetNewest最新の消費データ ERR、PCを:= consumer.ConsumePartition( "試験」のInt32(パーティション)、sarama.OffsetNewest) ERR!=ゼロ{IF パニック(ERR) } //近い非同期で、ディスクからデータをことを確実にするために 延期pc.AsyncClose() wg.Add(1) 移動FUNC(sarama.PartitionConsumer ){ 延期wg.Done() //メッセージ()メソッドは、読み取り専用メッセージエージェントによって生成されたチャネル消費の種類戻り =レンジpc.Messages(){:MSGため fmt.Printf(「%S ---パーティション:%のD、オフセット:%のD、キー:%S、値:%S \ N-」、 msg.Topic、msg.Partition、msg.Offset、文字列(msg.Key)、文字列( msg.Value)) } }(PC) } wg.Wait() consumer.Close() }
私たちは、カフカコードデータを達成するために書かれたテキストを実行する前に、それぞれ、飼育係とカフカを開始し、カフカの消費量から現在のコード、次のような結果が表示されたら
実装ファイルを監視
ファイル監視を実施し、メインのコンテンツがファイルに書き込まれると、ファイルのLinuxのコマンドtailf -f関数に似タイムリー書かれた内容を、取得することができます。
次のようにgolangが尾ライブラリを提供し、我々は指定されたファイルの監視を完了するために、このライブラリを使用して、私のファイルが編成されています
LOGDIRフォルダのlog.txtレコードがログファイルを増加している
tailfフォルダlogtailf.go log.txtと監視を実現します。
WRITEFILEフォルダwritefile.go達成するために、ログlog.txtファイルとバックアップ機能を記述することです。
メインFUNC(){ logrelative:= '../ LOGDIR / log.txt` _、ファイル名、_、_:= runtime.Caller(0) fmt.Println(ファイル名) データパス:= path.Join(path.Dir(ファイル名)、logrelative) fmt.Println(データパス) tailFile、ERR:= tail.TailFile(データパス、tail.Config { //ファイルが削除またはパックされ、再オープンする必要があり 再度開く:真、に //リアルタイム追跡 フォローを:真、 //プログラムに異常がある場合は、最後の読み取り位置の保存、回避するために、再読み込み 場所:&tail.SeekInfo {オフセット:0、WHENCE:2}、 //サポートファイルが存在しない MustExistを:偽、 投票:trueに、 } ) IF ERR = nilの{! fmt.Println( "ERR尾ファイル:"、ERR) リターン } {trueにため MSG、OK:= <-tailFile.Lines もしOK!{ :( "テールファイルがクローズ再度開く、ファイル名%sの\ n"は、tailFile.Filename)fmt.Printf time.Sleep(100 * time.Millisecond)が 継続 } //fmt.Println("msgを:」、MSG ) //只打印テキスト fmt.Println( "MSG:"、msg.Text) } }
監視の機能をテストします。私たちはライン「こんにちは+タイムスタンプは、」すべての0.1秒で、ログのlog.txtに書き込まれている実感します。私たちは20コンテンツを書くとき、バックアップの名前が変更LOG.TXTます。
そして、書き込みを続ける新しいlog.txtとを作成します。
書き込みwritefile.goのタイミング、およびバックアップ機能で機能を実装
FUNC WRITELOG(データパス文字列){ filew、ERR:= os.OpenFile(データパス、os.O_APPEND | os.O_CREATE | os.O_RDWR、0644) の場合、ERR = nilの{! fmt.Println( "オープンファイルエラー"、ERR。エラー()) リターン } W:= bufio.NewWriter(filew) iについて:= 0; I <20; I ++ { timeStr:= time.Now()フォーマット( "2006年1月2日午後三時04分05秒") fmt.Fprintln(+ timeStr "こんにちは、現在の時間がある"、ワット) time.Sleep(time.Millisecond * 100 ) w.Flush() } logBak:= time.Now()フォーマット( "20060102150405")+ ".txtファイル" logBak = path.Join(path.Dir(データパス)、logBak) filew.Close() ERR = OS .Rename(データパス、logBak) ERR!= nilの場合{ fmt.Println( "名前の変更エラー"、ERR。 } }
その後、我々は3つのバックアップファイルが生成されます3回WRITELOGと呼ばれる主な機能を、実現します
FUNCメイン(){ logrelative:= '../ LOGDIR / log.txt` _、ファイル名、_、_:= runtime.Caller(0) fmt.Println(ファイル名) データパス:= path.Join(path.Dir(ファイル名)、logrelative) 私のために:= 0; I <3。I ++ { WRITELOG(データパス) } }
私たちは、スタートアップファイル、プログラム・ファイルが書き込まれる監視、次のような効果がある動的監視を実現logtailf.go、コンテンツがlog.txtを書かされたときに、見ることができる、とするとき、ファイルのバックアップ、プロンプトファイルをlogtailf.goの名前が変更されましたバックアップ。最終的に、我々は3つのバックアップファイルに結果を見ます
概要
現在、我々は、我々は、プロジェクトの構成や全体的なコードを実現し、カフカのニュースリーダー、ファイル監視、動的な書き込みとバックアップ機能が完了しました。
ソースのダウンロード
https://github.com/secondtonone1/golang-は
私の社会的関心号に感謝します