2009-08-07 21 views
10

Antのロガー(デフォルトまたはその他)に各メッセージにタイムスタンプ を追加する簡単な方法はありますか?Antログのタイムスタンプ?

私が考えることができる唯一の方法は、 Log4jListenerを使用し、その設定にタイムスタンプを含めることです。または、DefaultLoggerをサブクラス化してタイムスタンプを書き込む カスタムロガーを作成します。 もっと良い方法や簡単な方法がある場合は、 ユーザーが新しいjarファイルをAnt libディレクトリにインストールする必要はありません。

私はそれについて聞いてみたいと思います。

答えて

6

あなたは(あなたが追加することができ、次のmacrodefは、プロパティにタイムスタンプを設定しますあなたのbuild.xml全体macrodefを呼び出し、その後、

をあなたはそれを参照する必要があるたびに、現在のタイムスタンプを設定するためのAnt macrodefを定義することができますmacrodefに属性あなたはそれがセットプロパティをカスタマイズする場合):

<macrodef name="set.timestamp"> 
    <sequential> 
    <tstamp> 
     <format property="current.time" pattern="MM/dd/yyyy hh:mm"/> 
    </tstamp> 
    </sequential> 
</macrodef> 

そして、それを使用する、あなたが必要としてだけmacrodefによって設定されたプロパティにアクセス:

<target name="doFoo" depends="dir.check" if="dir.exists"> 
    <set.timestamp/> 
    <!--in this example, just echo the timestamp --> 
    <echo message="${current.time}"/> 
</target> 

antマクロ定義の詳細については、documentationを参照してください。

+3

これは、タイムスタンプをプロパティに格納するため、すべてのメッセージが同じ時刻に共有されます。いくつかのケースでは良いが、例えば役に立たない。ビルドのどの部分が時間がかかりすぎるかを確認します。OPが "各メッセージのタイムスタンプ"について言及しているので、私は実際にはこれがインテンデットの質問に対する正しい答えだとは思わない。 –

+1

私はそのラスマスについてはあまりよく分かりません。 set timestampマクロを繰り返し呼び出すと、その時間のダンプの直後に、適切にダンプする必要があります。 – corsiKa

10

与えられたプロパティはantで不変ですが、ここで少しファンキーなことをする必要があります。そうしないと、何度も同じタイムスタンプを記録することになります。

antcallを使用すると、新鮮なセッションが得られます。これは、少し不器用ですが、プロパティを再利用できることを意味します。あなたはAntの1.8を使用している場合

<macrodef name="timestamp.echo"> 
    <attribute name="message"/>  
    <sequential> 
    <antcall target="_timestamp.echo"> 
     <param name="message" value="@{message}" /> 
    </antcall> 
    </sequential> 
</macrodef> 


<target name="_timestamp.echo"> 
    <tstamp> 
    <format property="current.time" pattern="dd/MM/yyyy hh:mm:ss"/> 
    </tstamp>   
    <echo message="${current.time} ${message}"/> 
</target> 

あなたは

<macrodef name="timestamp.echo"> 
    <attribute name="message"/>  
    <sequential> 
    <local name="current.time" /> 
    <tstamp> 
    <format property="current.time" pattern="dd/MM/yyyy hh:mm:ss"/> 
    </tstamp>   
    <echo message="${current.time} @{message}" /> 
    </sequential> 
</macrodef> 

そして、ここで非常にクリーンであるローカル使用することができますが、この

を試してみてください

<target name="testTsEcho" depends="init" description="blah"> 
    <timestamp.echo message="test" /> 
    <sleep seconds="10" /> 
    <timestamp.echo message="test2" /> 
</target> 
7

それを使用することができる方法ですアリロガーorg.apache.tools.ant.listener.ProfileLogger

各ターゲットの入力時刻と終了時刻を、各ターゲットの所要時間とともにミリ秒単位で出力します。

1

これらのロガーを見てください:http://ant.apache.org/manual/listeners.html(これも1つ - org.apache.tools.ant.listener.ProfileLogger - 私の前の答えに記載されています)。しかし、これは新しいバージョンのAntを必要とするようです。

3

確かにそれはターゲット1よりも効率的であるならば、私はmacrodefソリューションを好きですが、私はのように、変数のリセットを強制する「真=未設定のVAR」を使用します。

<macrodef name="echoTimestamp"> 
    <sequential> 
     <var name="current.time" unset="true"/> 
     <tstamp> 
      <format property="current.time" pattern="yyyy-MM-dd HH:mm:ss" /> 
     </tstamp> 
     <echo message="${current.time}" /> 
    </sequential> 
</macrodef> <!-- end echoTimestamp --> 

使い方

<echoTimestamp /> 
<sleep seconds="3"/> 
<echoTimestamp /> 
関連する問題