私はいくつかのプロセスを実行するビデオ処理デーモン (python) を持っています。そのうちのいくつかは GStreamer を使用して生のビデオ フレームをカスタム要素 (C) に取得します。一部のプロセスが「フリーズ」します ( Processis_alive() = True
ですが、Gstreamer パイプラインは何も実行せず、Python コールバックを呼び出しません) - 通常は 2 ~ 10 日後に、本番環境でのみ発生します。これを自分のコンピューターで複製できませんでした。
これで、python ロギング (メイン プログラム) と glib ロギング (C プラグイン) からのログ ファイルができましたが、ログ メッセージをどこにでも追加した後でも、何も役に立ちません。したがって、GStreamer のメッセージに何らかの手がかりがあることを願っています。
ビデオ処理専用のプロセスで glib の「メイン ループ」をmultiprocessing.Queue
実行し、別のプロセスにさらなる処理を行うために使用する結果を含むメッセージを送信します。これらの gst/video-processes は、Python とは少し異質です。gstreamer やその他の gstreamer の奇妙さからのコールバックが多数あります。そのため、それらを別々のプロセスに分離しました。
コールバックにいくつかの Python ロギングがあり、C プラグインに多くの glib ロギングがありますが、明らかに十分ではありません。python プログラムと C 要素の間で何かが失敗している可能性があります。そのため、GStreamer の内部で何が起こっているのかを確認する必要があります。
残念ながら、インターセプトする以外に Gstreamer をデバッグする方法はないように思えstderr
ます。
GST_DEBUG
デーモン化せずにプログラムを実行し、設定してgzipファイルに保存しようとしましたが、すべてのGStreamerメッセージが1つの巨大stderr
なファイルに混在しているため、あまり役に立ちません。
これを要約すると:
- 私はデーモンを持っています(したがって、stderrもstdoutもありません)
- デーモンには、多くの子プロセスがあります
- それらのいくつか (実際には 14 個) は GStreamer パイプラインを実行します
- 謎の失敗もある
- GStreamer デバッグ出力がどうしても必要です
- ただし、各プロセスからの GStreamer メッセージが別のファイルに書き込まれる必要があるため、メッセージで迷子になることはありません。
- これを行う方法がわかりません。
コメントで示唆されているように、GST_DEBUG_FILE
env.variable を使用できますが、それは GStreamer 0.10.31 以降で機能します。0.10.30なので使えません。
または、カスタム ログ ハンドラーを作成することもできますが、Python で作成する必要があり、Python バインディングからは「gst_debug_log_default」にアクセスできないため、これも機能しません (おそらく私が間違っている可能性があります)。