2016-04-26 16 views
2

私はgolangとfluentdの初心者です。私はgithub.com/fluent/fluent-logger-golang/fluentからfluentdのロガーライブラリを使用してロギングアプリケーションを構築しようとしています。 192.168.0.106でFluentd + golangログアプリケーションでエラーが発生しています

は、サービスが実行され、以下に24224

でリッスンしているfluentd golangにログインするためのプログラムです。

package main 

import (
    "github.com/fluent/fluent-logger-golang/fluent" 
    "fmt" 
) 

type Student struct { 
    name string 
    id_no int 
    age int 
} 

func main() { 
    logger,err :=fluent.New(fluent.Config{FluentHost:"192.168.0.106", FluentPort:24224}) 
    fmt.Println(logger.BufferLimit) 
    if err != nil{ 
     fmt.Println("error creating fluentd instance") 
     return 
    } 

    defer logger.Close() 
    tag := "fluentd-log-demo" 
    data := Student{"John",1234,25} 
    error := logger.Post(tag,data) 
    if error != nil{ 
     panic(error) 
    } 
} 

バイナリファイルを実行した後に大量のエラーが発生しています。

[email protected]:~/golang$ fluentd-log-demo 
8388608 
panic: reflect.Value.Interface: cannot return value obtained from unexported field or method 

goroutine 1 [running]: 
panic(0x5674e0, 0xc82000a6f0) 
    /home/mahesh/gotools/src/runtime/panic.go:464 +0x3e6 
reflect.valueInterface(0x5674e0, 0xc820010300, 0xb8, 0x1, 0x0, 0x0) 
    /home/mahesh/gotools/src/reflect/value.go:919 +0xe7 
reflect.Value.Interface(0x5674e0, 0xc820010300, 0xb8, 0x0, 0x0) 
    /home/mahesh/gotools/src/reflect/value.go:908 +0x48 
github.com/fluent/fluent-logger-golang/fluent.(*Fluent).PostWithTime(0xc82007a000, 0x603120, 0x10, 0xeceb11576, 0x28abb08c, 0x6d7bc0, 0x5b2060, 0xc820010300, 0x0, 0x0) 
    /home/mahesh/golib/src/github.com/fluent/fluent-logger-golang/fluent/fluent.go:139 +0x315 
github.com/fluent/fluent-logger-golang/fluent.(*Fluent).Post(0xc82007a000, 0x603120, 0x10, 0x5b2060, 0xc820010300, 0x0, 0x0) 
    /home/mahesh/golib/src/github.com/fluent/fluent-logger-golang/fluent/fluent.go:116 +0x96 
main.main() 
    /home/mahesh/golang/src/GoBasics/fluentd-log-demo/main.go:25 +0x39e 
[email protected]:~/golang$ 

問題のトラブルシューティングを手伝ってください。

error := logger.Post(tag,data) 

dataは、それはあなた自身の構造体型で、タイプStudentは次のとおりです。

はエラーがこの行によって引き起こされるあなた

答えて

2

ありがとうございます。これには、非公開フィールド(名前が小文字で始まるフィールド)が含まれます。非エクスポートフィールドは、その型が定義されているパッケージからのみアクセスできます。

したがって、fluentパッケージが(リフレクションを介して)パッケージにアクセスしようとすると、これは許可されないため、ランタイムパニックが発生します(fluentパッケージはお客様のmainパッケージではありません)。

解決策は単純です:Student型のフィールドをエクスポートします。

type Student struct { 
    Name string 
    IdNo int 
    Age int 
} 

もう一つの選択肢は、例えば、mapを使用することです:

data := map[string]interface{}{ 
    "name": "John", 
    "id_no": 1234, 
    "age": 25, 
} 

structソリューションをすることができますようにかかわらず、より柔軟です構造タグを使用してログにフィールドを表示する方法を変更または変更する。例:

type Student struct { 
    Name string `msg:"name"` 
    IdNo int `msg:"id_no"` 
    Age int  `msg:"age"` 
} 

この質問+構造体タグの詳細について答えを読む:

What are the use(s) for tags in Go?

またSpec: Struct typesで覆われています。

+0

これは機能します。あなたのコメントのためにiczaに感謝します。 –

0

構造体Studentのすべてのプロパティをエクスポートする必要があります。最初の文字を大文字に変更してください。

type Student struct { 
    Name string 
    Id_no int 
    Age int 
} 
+0

ご意見ありがとうございましたNoval –

関連する問題