2016-03-21 11 views
0

私が見てきたように、各開発者は同じニーズ/ニーズを解決するための独自のニーズとアプローチを持っています。一例として、ロギング。さまざまな方法で動作する多くのロギングパッケージがあり、各開発者はニーズや好みに最も適したものを選択します。それを考えると、私は、呼び出し元のログパッケージを使用するパッケージを作成したいと考えています。出来ますか?誰かがそれをする方法がありますか?golangの "caller"プログラムに応じて、ロガーを使用するパッケージを作成する方法は?

このような何か:logrusパッケージを使用して

メインコード:

package main 

import (
    "os" 

    "github.com/Sirupsen/logrus" 

    "gitlab.com/tutume/_testing/globallogs/mypack" 
) 

var Log = logrus.New() 

var myPack pack.Pack 

func main() { 
    isDebug := os.Getenv("MYAPP_LOGLEVEL") 
    switch isDebug { 
    case "Debug": 
     Log.Level = logrus.DebugLevel 
    case "Info": 
     Log.Level = logrus.InfoLevel 
    default: 
     Log.Level = logrus.ErrorLevel 
    } 
    Log.Formatter = &logrus.TextFormatter{ 
     ForceColors: true, 
    } 

    Log.Debug("Debugging...") 
    Log.Info("Informing...") 
    Log.Error("Normal...") 

    myPack.Logger = Log 
    myPack.DoSomething() 

} 

MYPACKコード:

package pack 

type Pack struct { 
    Logger interface{} 
} 

func (mp *Pack) DoSomething() { 
    // Logger.Debug("Debugging...") 
    // Logger.Info("Informing...") 
    // Logger.Error("Normal...") 
} 

答えて

1

私はあなたが何をしようとして理解していれば、あなたが定義する必要がありますロギングパッケージが実装するインターフェイス。 Loggerを空のインターフェースとして定義すると、それらのメソッドを呼び出すことはできません。代わりに、使用するメソッド(デバッグ、情報、エラーなど)を含むインタフェースを定義する必要があります。どんなロギングパッケージでも、それらのメソッドを実装する必要があります。特定のロギングパッケージに適切なメソッドセットがない場合は、定義したときにインターフェイスを実装するためのラッパーコードを記述する必要があります。

+0

ありがとうございました。私は何かを試し、その結果をあなたに知らせます。 – Tuts

0

私は検索を続けて、this postを見つけました。とても興味深い。 インフラストラクチャマネージャ/技術者として、私が使用している(そして使用していた)多くのソフトウェアから逃してきたことの1つは、問題を特定し修正するためにできるだけ深い情報を持っているか、セキュリティ提案。多くの場合、デバッグモードでも問題の正確な原因を見つけることができないといういくつかの問題に直面して、「可能性のある」原因を突き止めるだけでした。開発の世界に戻り、開発者がログやライブラリをどのように扱っているかを見ると、これは一つの理由(メインプログラムとそのライブラリ間の相互運用性の欠如)かもしれないと考えています。 "ロギング(まったくロギングしない)と何度も、ライブラリ内で何が起こっているのかを完全に制御することはできません。ほとんどの場合、メインプログラムを開発している開発者は、もちろん、私はオープンソースの世界では、オープンソースのように、あなたが使用しているライブラリなどのより詳細な情報を望むならば、変更を簡単に行うことができますしかし、これはライブラリの使用を可能にすることができます(他の世界の再利用可能性の中で、主に時間を費やさずにライブラリを使用して "ホイールを再作成"することの利点を考えて)。としてそれを処理する1つの方法は、常に、処理されるべき「必要な」情報を発信者に送ることである。しかし、通常、それはエラー、致命的、多分情報レベルのイベントのために働く。しかし、例えばデバッグとトレースの場合、ライブラリを開発するとき(多くの理由で)は "素朴"ではなく、開発者がライブラリを開発しているときには、すべてのデバッグとトレースが必要になるという大きな理由があると思いますテスト用ですが、必ずしも発信者に返信する必要はありません。ポストで詳述されている別の方法は、ハンドラを使用することですが、これを行うことによって、図書館の開発者はもっと多くの作業を行うことになります。 Andyが答えたように(また記事でも議論されているように)、別の方法として、メインのプログラムロガーを受け取って使用するインターフェースを作成し、このオプションが正しく機能するようにするには、stdlibログ呼び出し元プログラムがロギングを行わない場合に備えて、最も多くのコミットログレベルを実装します)。 今私の "願い事"のために(私は再びプログラミングでベーイングしていて、Goで完全に立ち向かう)、私は自分のニーズを処理し、 "完璧なロギングシステム"を達成するための学習と努力を続けるために "醜いコード" Andyが提案したようにIMHOはインターフェースを使用しています。

関連する問題