3

http://docs.codehaus.org/display/GROOVY/Groovy+1.8+release+notes#Groovy18releasenotes-Logに従って、groovy は isDebugEnabled() などのチェックでログ ステートメントを囲みます。

grails は生成されたコードに対してそれを行いますか?

grails サービスでのこのログ呼び出しの場合:

log.debug("competitors errors stage 1: ${failedCarrierRequests}")

逆コンパイルされた .class ファイルには、これだけが表示されます。

arrayOfCallSite[85].call(log, new GStringImpl(new Object[] { allCompetitorDepartmentsRows.get() }, new String[] { "All competitors: ", "" }));

バックグラウンドでログ レベルのチェックがあるかどうかは不明です。

4

2 に答える 2

5

2.2.2 以降: いいえ。

Grails は apache commons Log フィールドをアーティファクト クラスに挿入し、log4j プラグインはそれを log4j Logger に結合します。

ただし、あなたの例では、 aGStringを唯一のパラメーターとして渡します。これらは Java に遅延変換されるためStrings、log4j ロガーは独自の内部デバッグ有効チェックにヒットし、toString()呼び出しをスキップします。

ただし、パラメータ構築のようなコストのかかることを行い、無駄なサイクルが心配な場合は、次のようにisDebugEnabled()自分自身を呼び出す必要があります。

if (log.isDebugEnabled()) {
    log.debug("Some string concatenation with a slow method: " + slowMethod())
}

GStringこの不自然な例は、デバッグ チェックを保存するために使用するように変換できることを指摘しておく必要があります。

log.debug "GString with lazily initialized slow method call: ${slowMethod()}"

チェックを追加するために AST 変換を追加することについて、grails-user メーリング リストで少し前に議論がありましたが、どこにも行きませんでした。

于 2013-06-20T18:47:13.830 に答える