アプリケーションを開発するとき、例外スタックトレース出力を(ログで、またはデバッグ中に)表示する必要があることがよくあります。 ブラウザまたはターミナルでスタックトレースの出力の行をクリックすることで、コードの適切な場所に自動的に移動できるようにしたいと思います。
最新のJetBrains製品(特にPhpStorm)のいずれかのユーザーである場合、これらの目的で内部REST API(ブラウザーからの移動用)およびコマンドラインランチャー(ターミナル内の移動用)を使用できます。
ブラウザナビゲーション
JetBrains REST API IDEメソッドの部分的な説明はここにあります:
» Http://develar.org/idea-rest-api/
このAPIのメソッドの1つは、プロジェクトファイルを開き、IDE内のこのファイル内の任意の位置に移動する機能です。
APIメソッド呼び出しは、 http://localhost:63342/
呼び出しを介してアクセスされます
ファイルを開くためのAPI呼び出しの例は次のようになります。
http://localhost:63342/api/file?file=src/path/to/file.php&line=100&column=34
ここで:
file-相対または絶対ファイルパス
line-カーソルを移動するファイル内の行
column-指定された行の位置
IDEでAPIが呼び出されるたびに表示されるメッセージを削除するには、設定で「署名されていない要求を許可する」をチェックします: Build, Execution, Deployment → Debugger
(またはダイアログの[OK]ボタンをクリックするたびに)。
PHPで標準のgetTraceAsString()の出力を処理する例
以下は、 getTraceAsString()を介した例外からの標準スタックトレース出力を処理する正規表現を示しています。
try { // some code }(\Exception $e){ $traceAsString = preg_replace('/#(\d+) (.+?\.php)\((\d+)\):/', '#$1 <a href="#" onclick="_goToEditorCodeLine(\'$2\', \'$3\'); return false;">$2($3):</a>', $e->getTraceAsString() ); // some code }
例外の各行はリンクになり、クリックすると目的の行のIDEファイルが開きます。
APIメソッドを直接「プル」するJS関数を接続する必要もあります。
function _goToEditorCodeLine(file, line){ var xmlhttp = new XMLHttpRequest(); xmlhttp.open("GET", "http://localhost:63342/api/file?file=" + file + "&line=" + line, true); xmlhttp.send(); }
Symfony 3での例外処理の実装例
現在Symfonyで作業しているので、IDEファイルで開くことを実装するために標準の例外でページを修正する方法を具体的な例で示します。
例外ページの出力を担当するテンプレートの一部をオーバーライドするには、 app/Resources/TwigBundle/views/Exception/
folderに2つのファイルを作成する必要があります
- exception.html.twig
- trace.html.twig
exception.html.twigファイルに、最も単純な関数_goToEditorCodeLine()
追加します。このコードについては上記で説明しています。
ファイルtrace.html.twigで、行が表示されている場所を見つけ、最後に矢印を追加します。矢印をクリックすると、IDEでファイルが開きます。
in {{ trace.file|format_file(trace.line) }} <a href="#" onclick="_goToEditorCodeLine('{{ trace.file }}', '{{ trace.line }}'); return false;">→</a>
その後、スタックトレース行に矢印が表示されます。矢印をクリックすると、IDEでファイルが開き、カーソルが目的の位置に移動します。
Symfony 3の2つのファイルの最終バージョンは、 こちらにあります 。
iTerm2のコマンドライン統合
MacOSで作業しており、iTerm2を使用している場合、iTerm2およびコマンドラインランチャーを対応するIDEに統合できます。これにより、ターミナルから直接IDEのファイルを開くことができます。
ランチャーをインストールするには、IDEでメニューの[ Tool → Create Command-line Launcher...
] Tool → Create Command-line Launcher...
]を呼び出し、ダイアログボックスでランチャーのインストール先のパスを確認します。 私の場合、これは/usr/local/bin/phpstorm
(または以前のバージョンの場合は/usr/local/bin/phpstorm
)で、IntelliJ IDEAは/usr/local/bin/idea
です。
このランチャーを使用すると、コマンドラインから呼び出されたときにファイルを開き、目的の行に移動できます。
呼び出し例:
/usr/local/bin/phpstorm --line 40 /path/to/file
または
/usr/local/bin/phpstorm /path/to/file:40
どちらの場合も、ファイル/path/to/file
は40行目で開かれ/path/to/file
。
次に、コマンドラインランチャーとiTerm2を統合します。 セッションの編集→詳細設定に移動します。
[ Semantic History
セクションのドロップダウンリストから、[ run command...
をrun command...
を選択し、次のように入力します。
/usr/local/bin/phpstorm --line \2 \1
これで、Cmdを押して、ターミナル内の任意のファイルにカーソルを合わせると、リンクになり、クリックするとIDEで開きます。
ログの形式が/path/to/file/:40
場合、つまり ファイルの後のコロンの後に行番号が示されます-IDEはこの行でファイルを直接開きます。
php-exceptionログの問題は、出力が/path/to/file/(40)
の形式、つまり ファイル内の行は括弧で囲まれています。 この結果、ファイルは開かれますが、目的の行には移動しません。
この問題を解決するには、sedストリームエディターを使用して、ログ出力を必要な形式に変換します。
sed -E 's/#([0-9]+) (.+\.php)\(([0-9]+)\):/#\1 \2:\3/g'
テール関数の出力処理の例
tail test.log | sed -E 's/#([0-9]+) (.+\.php)\(([0-9]+)\):/#\1 \2:\3/g'
結論として、このスキームがほぼすべての言語とJetBrains IDEで機能することをもう一度強調したいと思います。