0

一連のモーターを実行するプログラムを作成しています。これらのモーターは、私のプログラムも同様に通信するモーター コントローラーに接続します。モーター コントローラーに、その状態と、各モーターの状態と位置に関するデータを定期的に提供するように指示できます。私は、このデータをライブ ビューで表示して、オペレーターが何か問題があるかどうかを簡単に確認できるようにすることを計画しています。さらに、このデータのログを作成して、誰かが後で戻って何が問題なのか、そしておそらくその理由を確認できるようにします。

ここで質問があります。このログを作成する際に考慮すべきことは何ですか? 私は大学を出たばかりで、このような状況に実際に遭遇したことはありません。もちろん、ファイルを作成し、そこにデータを入れ、ファイルを閉じる方法は知っていますが、データ ログには他に何かありますか?

私がすでに検討したことは次のとおりです。

  1. 各データ レコードにタイム スタンプを付けるとよいでしょう。
  2. データをバイナリのままにしておくよりも、データを詳細にすることが理想的かもしれません。セットアップ時間が長くなり、最終結果が向上します。
  3. プログラムの終了方法に関係なく、ファイルを閉じるように注意する必要があります。
  4. 私は C++/CLI を使用しています。MSFT にはこれを簡単にするためのフレームワークがあるのだろうか...
  5. エントリを受信するたびに書き込む方がよいか、またはいくつかのエントリができるまで待って一度に書き込む方がよいかをテストして、CPU/ディスクの使用を最小限に抑えます。

他に何を考慮する必要がありますか?

4

1 に答える 1

0

このような場合、頭に浮かぶのはカンマ区切りまたはタブ区切りのファイルです。これらはメモ帳で人間が読めるようにするか、Excel に取り込んでデータのグラフを作成することができます。(CSV や tab-SV は「ベスト プラクティス」とはかけ離れていると考える人もいると思いますが、実装が簡単で、読み取りも簡単で、何百ものアプリで読み取り可能です。これは非常に良い方法です。私の本で。)

これに似たことができます:

FileStream^ textFileStream = gcnew FileStream(logFileName, FileMode::Append, FileAccess::Write, FileShare::Read);
StreamWriter^ textFileWriter = gcnew StreamWriter(textFileStream, Encoding::Unicode);
textFileWriter->AutoFlush = true;
  1. タイムスタンプについては、単にダンプしDateTime::Now->ToString()ます。
  2. 使用できるオブジェクトについては、上記を参照してください。String::Format を使用して、出力を StreamWriter に送信します。これにより、人間が読める詳細なログが得られます。
  3. プログラムがクラッシュした場合に何が起こるか心配している場合でも、あまり心配する必要はありません。上記で初期化された StreamWriter は、使用時に FileStream に書き込み、ファイルシステムに書き込みます。これはファイルシステムレベルのフラッシュではなく、ファイルシステムレベルの書き込みのみを行います (データは OS のライトバックキャッシュにあり、次の数秒のある時点でディスクにフラッシュされます)。 、ログ ファイルは不完全になりますが、プログラム クラッシュは処理済みファイルになります。
  4. C++/CLI から使用できる .Net 用のさまざまなロギング フレームワークがありますが、私はそれらにあまり詳しくありません。
  5. 毎秒データをログに記録している場合でも、データのバッチ処理について心配する必要があるかどうかは疑問です。データを書き込むモーターが何百もあるとしましょう。1 秒あたり 1 キロバイトですか? たぶん2?必要に応じてデータを書き出すだけです。(ディスク/CPU の使用を最小限に抑えたい場合は、データのログ記録の頻度を減らし、10 秒に 1 回または 1 分に 1 回にすることを検討してください。)
于 2012-10-10T17:41:57.967 に答える