2

ロギング ストリーム サービスを作成するには、ofstream クラスを拡張する必要があります。

目標は、各行をインターセプトして、各行の先頭にカスタマイズされたテキスト (日付/時刻、重大度など) を追加することです。

さて、私が C++ の第一人者ではないことは明らかなので、このタスクに関する多くのドキュメントを読みました。

http://www.angelikalanger.com/Articles/Topics.html#CPP http://asmodehn.wordpress.com/2010/06/20/busy-c-coding-and-testing
http://gabisoft.free. fr/articles-en.html

上記の記事では、カスタム ストリーム バッファを作成することを提案していますが、この概念をファイル ストリームに移植する際に、多くの問題に遭遇しました。

この目標を達成するためのより簡単な方法はありますか?

4

1 に答える 1

1

カスタム ストリーム バッファを記述する必要はありません。最も単純で直接的な方法は、テンプレート化された単一の引数 operator<<() を指定して、出力を送信できるクラスを作成することです。

template <typename T>
std::ostream& operator<<(const T& data_)
{
    m_outstream << m_severity << "\t" << getTimeStamp() << "\t" << data_;

    return m_outstream;
}

m_outstream は、何らかのタイプの std::ostream (std::ofstream など) です。m_severity と getTimeStamp() は、挿入できるものの例です (そして、重大度の種類をフォーマットして ostream に出力するために、bog 標準の 2 つの引数 operator<<() を作成できます)。

これにより、次のようなことができます。

myLogger << "failingFunction(" << argument <<
            "): Could not do something." << std::endl;

m_outstream で次のような出力が得られます。

WARNING 2012-01-03 19:32 failingFunction("引数値"): 何かを実行できませんでした。

これを超えて、重大度を設定する方法が必要になります。これは、テンプレート化された operator<<() を追加したロガー クラスで呼び出されるメソッドと同じくらい簡単です。本当に凝ったものにしたい場合は、setw() が std::ostream で行うのと同じように動作する独自のマニピュレータを作成できます。マニピュレータの作成に関する入門書については、http://www.math.hkbu.edu.hk/parallel/pgi/doc/pgC++_lib/stdlibug/man_6665.htmを参照してください。

于 2013-01-09T22:36:47.317 に答える