ログファイルをC++で書きたいと思っています。 私は特定のことを処理しているので、私が処理するもののプロパティのログを維持する必要があります。このログファイルに戻って、特に興味のあるもののプロパティを表示することができます。 誰かが助けてくれますか私はこれを達成するには?c/C++でログファイルを書き込む
答えて
すべての回答をいただきありがとうございます...私が探していた答えは、UTF8のログファイルの形式であっても、txtファイルと同じように、これらの種類のそれが提供する単純なファイル書き込みを伴うファイル。
Apache log4cxxのような利用可能なログフレームワークを使用しないのはなぜですか?私はあなた自身をロールバックしようとするのではなく、これを提案します - なぜホイールを再発明するのですか?
(私の経験では)標準的なログ記録方法は、stdoutまたはstderrストリームのどちらかを使用することです。 C++ではこれらを使用するには、入出力ストリームを含める必要があるだろう、と以下のように使用します。
#include <iostream>
int main(int argc, char* argv[])
{
using std::cout;
using std::cerr;
using std::endl;
cout << "Output message" << endl;
cerr << "Error message" << endl;
}
これは、しかし、唯一の通常の端末で終わるこれらの出力に印刷を実現します。これらの標準ストリームメソッド(かなり読みやすい)を使用してファイルに出力する場合は、出力を何とかリダイレクトする必要があります。これを行う1つの方法は、cstdioによって提供されるfreopen
関数を使用することです。これはファイルを開き、与えられたストリームをそのファイルに移動することです。詳細については、hereを参照してください。例は次のようになります。
#include <iostream>
#include <cstdio>
int main(int argc, char* argv[])
{
using namespace std;
freopen("output.txt", "w", stdout);
freopen("error.txt", "w", stderr);
cout << "Output message" << endl;
cerr << "Error message" << endl;
}
(私は簡潔にするためにそこusing namespace std;
に変更しました。)
あなたが(OUTPUT.TXTする(cout
で使用されている)は、標準出力ストリームstdout
を移動しています書き込みモードではstderr
(cerr
によって使用されます)をerror.txtに移動しています。
うまくいけば、これはトリックです。
std :: coutとstd :: cerrよりstd :: clogをお勧めします。 –
あなたがそれを言及する前に、私は実際に詰まりを聞いたことはありませんでした。なぜ私はstderrのバッファリングされたバージョンが有用かもしれないかを知ることができます - しかし、それをなぜ吹き出しの代わりに使うのですか?両方とも何が問題なの? – VolatileStorm
技術的には?何もない。しかし、それは通常のロギングを行う標準的な方法です。エラーログにはcerrを、コンソール出力にはcoutを使用するのと同じように。 正直なところ、私は一週間前にそれについて聞いただけです。 –
あなたがしようとしていることは、このサイトで強制的に解決策を提供するにはあまりにも綿密です。あなたができることは、選択したロギングライブラリのドキュメントをチェックすることです。私の場合、、Boost C++ librariesのゆっくりとしたライブラリhereがあります。
それは私がちょうどこのライブラリは、ブーストの公式な一部ではないこと
にリンクしたページの下部に指摘していますが、それは審査を通過したと暫定的に受け入れているが、コレクション ライブラリ。 のレビュー結果はhereです。
だから、それはあなたのものです。
また、http://www.logog.orgとしてみることもできます。パフォーマンス指向のC++ロギングシステムです。しかし、それがあなたのプロジェクトにはあまりにも強すぎるのなら、良い古いcerrとcoutはこれでうまく動作します。
これは非常に便利です。プログラム内の任意の場所から呼び出されるいくつかの一般的なヘッダファイル(より良いアプローチは、これらの機能を持つクラスを形成するであろう)
inline string getCurrentDateTime(string s){
time_t now = time(0);
struct tm tstruct;
char buf[80];
tstruct = *localtime(&now);
if(s=="now")
strftime(buf, sizeof(buf), "%Y-%m-%d %X", &tstruct);
else if(s=="date")
strftime(buf, sizeof(buf), "%Y-%m-%d", &tstruct);
return string(buf);
};
inline void Logger(string logMsg){
string filePath = "/somedir/log_"+getCurrentDateTime("date")+".txt";
string now = getCurrentDateTime("now");
ofstream ofs(filePath.c_str(), std::ios_base::out | std::ios_base::app);
ofs << now << '\t' << logMsg << '\n';
ofs.close();
}
用法:ロガー(「これはログメッセージです」)。 は、ファイルを書き込みます(または既存のファイルを追加します)コンテンツと
/somedir/log_2017-10-20.txt
:
2017-10-20 09:50:59 This is log message
あなたはアンドゥ/リドゥシステムのいくつかの種類を参照していますか? – cyco130
これを見てください(http://stackoverflow.com/questions/696321/best-logging-framework-for-native-c) – StevieG
@ cyco130私はOPが "戻って参照する"ことを意味すると思います。元に戻す "、何らかの種類の元に戻す/やり直しシステムです。 (単語 "復帰"はおそらくgitで過度に時間を費やしてしまいました!) – RoG