(c ++)ゲームのロギングライブラリ[終了]


15

私は多くのロギングライブラリを知っていますが、それらの多くをテストしませんでした。(GoogleLog、Pantheios、来るべきboost :: logライブラリ...)

ゲーム、特にリモートマルチプレイヤーゲームやマルチスレッドゲームでは、最後にすべてのログを削除しても、ログはデバッグに不可欠です。

ログ(マルチプレイヤーおよびマルチスレッドおよび/またはマルチプロセス)を必要とするPCゲーム(コンソールではない)を作成していて、ロギング用のライブラリを探す十分な理由があるとしましょう(時間がない、または私の場合、正しく書く能力に自信がありません)。

私が必要だと仮定すると:

  1. 性能
  2. 使いやすさ(ストリーミングやフォーマットなどが可能)
  3. 信頼できる(漏れたりクラッシュしたりしないでください!)
  4. クロスプラットフォーム(少なくともWindows、MacOSX、Linux / Ubuntu)

Wichロギングライブラリを使用することをお勧めしますか?

現在、私はそのブースト::ログは最も柔軟なもの(!あなたも、リモートでにログインすることができます)だと思います、ではなく良好なパフォーマンスを持っているアップデートは、高パフォーマンスのためであるが、まだリリースされていません。Pantheiosはよく引用されますが、パフォーマンスと使用法の比較ポイントはありません。私は長い間自分のライブラリを使ってきましたが、マルチスレッドを管理していないので、十分に高速であっても大きな問題です。Google Logは興味深いようです。ただテストする必要がありますが、これらのライブラリなどをすでに比較している場合は、アドバイスが役に立つかもしれません。

ゲームは多くの場合、パフォーマンスが要求されますが、デバッグが複雑であるため、特定のケースでは明確な利点があるロギングライブラリを知っておくと便利です。


3
言及しなかった重要な要件の1つは、ログの使用目的です。たとえば、デバッグメッセージ、デザイナーのメトリック、カスタマーサポートのキャラクターの状態、クレジットカードトランザクションなどのログ記録の要件は異なります。一般に、状況に応じて、パフォーマンス、プログラマーの使いやすさ、オフライン解析の容易さ/速度、および耐久性をトレードオフします。

その通りですが、「完全な」ロギングソリューションにより、ユーザーが説明したように異なる種類のログをセットアップできると想定していました。質問でこの精度が重要であると思われる場合は、私のゲストになって質問に追加してください。
クライム

回答:


8

ソケットを使用したログ(任意のソケットラッパーで十分です)+ Webブラウザーwebsocket =>最も汎用性が高く、目立たないロギングツール。

  • 非同期(ブラウザ上のすべてのジョブを遅らせる速度)
  • フォーマット済み(色、サイズなど)
  • 信頼できる(ソケット...)
  • クロスプラットフォーム(ブラウザ)

今、ボーナス:

  • 動的フィルタリングは非常に簡単に実行できます(必要に応じてJavaScript正規表現を使用)
  • ログ履歴、メモリ、および比較(「ブラウザ内」データベースのHTML5仕様)
  • メモリメモリの断片化などの任意のデータのグラフを作成する簡単な方法(SVGまたはキャンバスなどを使用)
  • 任意のデータの2Dグラフを作成する簡単な方法(kdツリーの細分化?潜在的なフィールド?あるいは単に変数値の変動?など)
  • 遠隔ログ記録を許可します(他のコンピューターのブラウザーを使用)
  • ブラウザーストレージでhtml5を使用すると、ログセッションパラメーター(現在のログフィルターなど、さらには各ノートまで)を保存できます。
  • クリックするだけで非常に簡単にバグレポートを作成したり、tracチケットをリンクしたりできます
  • タイムラインGUIを使用して、ロギングを簡単に巻き戻す機能

ロギング以外の多くのタスク:

  • プロファイラ情報を許可します(グラフ...)
  • コンソール(ブラウザからコマンドを送信)として機能することも、HTMLまたはFlash UIを使用してクイックGUIで機能することもできます。
  • ブラウザの画像差分(ソケットを使用して画像を送信し、キャンバスの画像ピクセル機能を使用してブラウザで比較します)
  • 等...

(上記のほぼすべては、フラッシュソケットを使用して実行でき、データベース機能を保存できます)

今、私はそれをセットアップするのに少し長いように思えます。しかし、実際には長いプロジェクトでは時間がかかり、ハードデバッグの状況(ゲームなど)があります。これは、デバッガー以来使用した最も強力なものです...

注1:ゲームネットワーキングコードをデバッグする場合の唯一のマイナス面=>ダブルチェックの副作用(ソケットバッファーサイズ、レイテンシ、帯域幅などに影響)

注2:セキュリティ上の理由により、一部のブラウザはデフォルトのwebsocketで無効になっています。about:configの項目をチェックして、有効になっていることを確認してください。


1
私が間違っている場合は修正しますが、これはログ出力をどこに向けるかを示唆しているだけです、いいえ?実際のロギングライブラリは、コンパイル時のフィルタリング(パフォーマンスが問題になる場合に重要)、フォーマット、およびログメッセージを作成するための使いやすい構文を提供します。
-sbi

@sbiアプリケーション側でのグローバルなオンまたはオフのことです。「ブラウザログクライアント」はフィルタリング、構文を実行しますが、常にすべてのログを取得します。それは急進的ですが、開発中はつまづいたバグを簡単にキャッチ/再現できるように、常にすべてを記録する必要があるという経験に基づいています。最適化する必要がある場合は、ブラウザ側に再度あります:文字列を使用してログにバインドされていないソケットを使用すると、バイナリデータ(Id + floats)を直接記録できます。これは、他の文字列ベースのログライブラリよりも太字です...( IDを文字列ブラウザ側に一致させる...)
Tuan Kuranes

1
これは非常に実用的であることがわかりますが、実際には単なるロガーのバックエンド(templogが「ログシンク」と呼ぶIIRC)です。パフォーマンスは、リストされている要件の1つです。デバッグ中にコードにログステートメントを追加する必要があることがわかりましたが、一度実行すると、このコードの部分はあまりにもおしゃべりになり、ノイズの中で作業しているものをdrれさせ、コストもかかりますパフォーマンスが高すぎます。そのため、数行のコードを変更するだけで、コード全体のログレベルを調整できます。それが、ログライブラリの中間層があなたのためにすることです。
-sbi

@sbi:ベンチマークが必要な場合がありますが、最高のロギングライブラリは、たとえ最低のロギングレベルであっても、すべてをログに記録するバイナリロガー以上のコストがかかる可能性があります。単一の「バイナリから文字」のCPUサイクルの無駄さえありません...したがって、実際にはより多くの機能とパフォーマンスがあります。
トゥアンクラネス

実際にtemplogを使用することを決定する前に、いくつかのテストを行いました。特定のログメッセージの重大度、発生元、その他についてログ記録がオフになっており、コンパイラーがパラメーターの評価に副作用がないことを検出できる場合、VCは実際に本格的な最適化を行うことができます。文を空虚に記録します。そして、スピードに関して言えば、そもそも実行されるべきではないコードに勝るものはありません。
sbi

8

パフォーマンスに関して言えば、templogはほとんど無敵であることがわかりました。式テンプレートを使用して、情報がまったくログに記録されることが確立されるまで、ログステートメントの評価を延期します。ロギングを部分的に無効にすることもできるため(ログメッセージの重大度、発生源、対象とするユーザーによって異なります)、これらのロギングステートメントの一部は、リリースビルド用のコンパイラーによってゼロコードに削除できます。(私は実際にVCでこれが起こるのを見ました。)

最近は図書館にあまり何もしていませんでしたが、SOの他の人はトランクがいくつかの点で不足していることを発見しましたが、私が働いていた会社では、彼は非常に反応がよく、私の当時の牛労働者の1人でもコミットアクセスを取得し、それにコードを追加したので、一見の価値があります。

要件を列挙するには:

性能

私が見つけた最高。特に、コンパイル時にログメッセージを除外し、コンパイラにそれらを完全に削除させる機能は非常に魅力的でした。

使いやすさ(ストリーミングやフォーマットなどが可能)

あなたが何か間違ったことをしたときのテンプレートメタの古典的な恐ろしいコンパイラエラーメッセージがありますが、使いやすさに関しては、これは

TEMPLOG_LOG(my_logger,sev_error,aud_support) << "logged in as " << user_name;

打ちにくいです。
ただし、事前にパッケージ化されたもの(stderr、ファイル、Windowsロギングなど)はそれほど洗練されていないため、独自のログシンクを作成する必要があります(ログメッセージの送信先です)。パフォーマンスが主な目標であるため、全体の本質はやや複雑です(ログメッセージフォーマッタがログシンクにかなり絡み合っているように)が、私たちはそれをマスターしました(それを支援するデバッガでステップスルーしたことを覚えています)独自のメッセージフォーマッタやログシンクを書くのはそれほど難しくないことを理解していました。

信頼できる(漏れたりクラッシュしたりしないでください!)

このような深刻な問題を発見することなく使用しました。そこには動的なメモリ割り当てが事実上ないので、何か間違っていると想像することさえ難しいです。もちろん、1つの製品で実際のテストにのみ使用しました。

クロスプラットフォーム(少なくともWindows、MacOSX、Linux / Ubuntu)

使用したときは、Win32、OSX、およびいくつかの異なるLinuxディストリビューション(Ubuntuなど)で使用しました。

マルチスレッドに関しては、これを使用していませんが、libのアーキテクチャについて覚えていることから、ログシンクでこれを処理するだけでよいようです。ICBWT。


おかげで、私はこれを知りませんでした。少なくとも元のアイデアでは、boost :: logの単純化された(かつパフォーマンスの高い)バージョンのように見えます。
クライム

@Klaim:C ++ロギングライブラリを最後に調べたときに、boostが提供するものはないと思うので、boost :: logについては知りません。
sbi

1
@ジョー:「式テンプレート」という用語を理解していますか?
sbi

1
私はやったと思っていましたが、今ではtemplogのソースコードをダウンロードして読み始めたので、C ++が再び私を裏切りました。

1
@sbi:私の混乱の一部は、「一度にいくつかのレイヤーを通過する」というあなたの声明でした-英語は、すぐにまたは一緒に、この場合は反対です。私はそれを最初のものとして読みましたが、あなた(今では明らかに私にとって)は2番目のものを意味しました。時間をかけて説明してくれてありがとう。


0

あなたはBaicalツールセットに興味があるかもしれません:

  • ログ、トレース、テレメトリ用のオープンソースおよびクロスプラットフォーム(Win、Linux、x86 / x64)ライブラリ-P7
  • 信じられないほど高速(組み込みデバイス向けに設計)-ネットワークに毎秒300万ログ、最新のCPUに500万ログを記録します。私は、すべてのログメッセージにこのような速度と非常に詳細な情報を提供する、ロギング用の他のライブラリを知りません。
  • スレッドセーフ
  • すべてのトレースメッセージには以下が含まれます。
    • メール
    • レベル
    • 正確な時間(100ns)
    • ソースファイル、関数名と行
    • モジュールIDとモジュール名
    • スレッドIDとスレッド名
    • プロセッサコアインデックス
  • ログとテレメトリを受信および表示するサーバーアプリケーション
  • 複数のソースからログをリアルタイムで収集、分析、検索、フィルタリングできます

2017年6月現在、文字列の書式設定の%sはまだサポートされていません。
Romenoの
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.