監聽器和記錄器

概觀

Apache Ant 有兩個相關功能,允許監控建置程序:監聽器和記錄器。

監聽器

監聽器會收到下列事件的警示

這些訊息會在內部用於各種記錄和管理作業,不過新的監聽器可以使用 -listener 參數在命令列中註冊。

記錄器

記錄器擴充了監聽器的功能,並新增下列功能

內建監聽器/記錄器

類別名稱 說明 類型
org.apache.tools.ant.DefaultLogger 除非使用 -logger 命令列開關覆寫,否則會隱含使用此記錄器。 BuildLogger
org.apache.tools.ant.NoBannerLogger 此記錄器會略過輸出空的目標輸出。 BuildLogger
org.apache.tools.ant.listener.MailLogger 擴充 DefaultLogger,因此輸出仍然會以相同方式產生,且在建置完成時可以傳送電子郵件。 BuildLogger
org.apache.tools.ant.listener.AnsiColorLogger 為建置輸出加上色彩。 BuildLogger
org.apache.tools.ant.listener.Log4jListener 將事件傳遞給 Apache Log4j,以進行高度自訂的記錄。
已棄用:Apache Log4j (1.x) 已不再開發。最後一次發布是 2012 年 5 月 26 日的 1.2.17,並包含漏洞問題。
BuildListener
org.apache.tools.ant.XmlLogger 將建置資訊寫入 XML 檔案。 BuildLogger
org.apache.tools.ant.TimestampedLogger 列印建置完成的時間 BuildLogger
org.apache.tools.ant.listener.BigProjectLogger 列印每個目標的專案名稱 BuildLogger
org.apache.tools.ant.listener.SimpleBigProjectLogger 僅列印子專案的專案名稱,否則與 NoBannerLogger 相同自 Ant 1.8.1 起 BuildLogger
org.apache.tools.ant.listener.ProfileLogger 預設記錄器,為每個任務和目標新增開始時間、結束時間和持續時間。 BuildLogger

DefaultLogger

正常執行 Ant,或

ant -logger org.apache.tools.ant.DefaultLogger

NoBannerLogger

移除空目標輸出的輸出。

ant -logger org.apache.tools.ant.NoBannerLogger

MailLogger

MailLogger 會擷取透過 DefaultLogger(標準 Ant 輸出)記錄的所有輸出,並會將成功和失敗訊息傳送至個別的電子郵件清單,並可個別控制是否關閉成功或失敗訊息。

控制 MailLogger 操作的屬性

屬性 說明 必要
MailLogger.mailhost 要使用的郵件伺服器 否;預設 localhost
MailLogger.port 郵件伺服器的 SMTP 埠 否;預設 25
MailLogger.user SMTP 驗證的使用者名稱 是,如果您的 SMTP 伺服器需要 SMTP 驗證
電子郵件訊息將使用 MIME 傳送,並需要 JavaMail
MailLogger.password SMTP 驗證的密碼 是,如果您的 SMTP 伺服器需要 SMTP 驗證
電子郵件訊息將使用 MIME 傳送,並需要 JavaMail
MailLogger.ssl 如果需要 SSL,則為 on 或 true
此功能需要 JavaMail
MailLogger.from 郵件 寄件人 地址 是,如果需要傳送郵件
MailLogger.replyto 郵件 回覆 地址(以逗號分隔)
MailLogger.failure.notify 傳送組建失敗電子郵件? 否;預設 true
MailLogger.success.notify 傳送組建成功電子郵件? 否;預設 true
MailLogger.failure.to 傳送失敗訊息的地址(以逗號分隔) 是,如果要傳送失敗郵件
MailLogger.success.to 傳送成功訊息的地址(以逗號分隔) 是,如果要傳送成功郵件
MailLogger.failure.cc 傳送失敗訊息的副本(cc)地址(以逗號分隔)
MailLogger.success.cc 傳送成功訊息的副本(cc)地址(以逗號分隔)
MailLogger.failure.bcc 傳送失敗訊息的密件副本(bcc)地址(以逗號分隔)
MailLogger.success.bcc 傳送成功訊息的密件副本(bcc)地址(以逗號分隔)
MailLogger.failure.subject 組建失敗的主旨 否;預設 組建失敗
MailLogger.success.subject 組建成功的標題 否;預設 組建成功
MailLogger.failure.body 組建失敗的電子郵件固定內文。自 Ant 1.8.0 起 否;預設是傳送完整的記錄輸出
MailLogger.success.body 成功建置的電子郵件固定主體。自 Ant 1.8.0 起 否;預設是傳送完整的記錄輸出
MailLogger.mimeType 訊息的 MIME 類型。自 Ant 1.8.0 起 否;預設為 text/plain
MailLogger.charset 訊息的字元集。自 Ant 1.8.0 起
MailLogger.starttls.enable 如果應支援 STARTTLS,則為 on 或 true(需要 JavaMail)。自 Ant 1.8.0 起 否;預設為 false
MailLogger.properties.file 將覆寫其他值的屬性檔檔名。
ant -logger org.apache.tools.ant.listener.MailLogger

AnsiColorLogger

AnsiColorLogger 會在標準 Ant 輸出加上顏色,方法是加上 ANSI 顏色碼跳脫序列作為字首和字尾。它只是 DefaultLogger 的延伸,因此提供 DefaultLogger 的所有功能。

AnsiColorLogger 會根據訊息類型指派不同的顏色,以區分輸出。

如果與 -logfile 選項一起使用,輸出檔將包含所有必要的跳脫碼,以便在使用 catmore 等應用程式在主控台中顯示時,以彩色模式顯示文字。

這項設計適用於支援 ANSI 顏色碼的終端機。它可以在 XTerm、ETerm、Win9x 主控台(已載入 ANSI.SYS)等終端機上執行。

注意:即使已載入載入 ANSI.SYSCOMMAND.COM 主控台,它也不適用於 WinNT 和後續版本。

如果使用者想要以自訂顏色覆寫預設顏色,則必須建立一個包含零個或多個自訂顏色金鑰值配對的檔案。已識別的金鑰及其預設值如下所示

AnsiColorLogger.ERROR_COLOR=2;31
AnsiColorLogger.WARNING_COLOR=2;35
AnsiColorLogger.INFO_COLOR=2;36
AnsiColorLogger.VERBOSE_COLOR=2;32
AnsiColorLogger.DEBUG_COLOR=2;34

每個金鑰都將值設為定義為 屬性;前景;背景 的顏色組合。在上述範例中,並未使用背景值。

此檔案必須指定為名為 ant.logger.defaults 的系統變數的值,並使用 -D 選項傳遞為引數給呼叫 Ant 應用程式的 java 命令。要輕鬆達成此目的,一個簡單的方法是將 -Dant.logger.defaults=/path/to/your/file 新增至 ANT_OPTS 環境變數。Ant 的啟動指令碼會識別此旗標,並適當地將其傳遞給 java 命令。

格式

AnsiColorLogger.*=Attribute;Foreground;Background

Attribute is one of the following:
0 → Reset All Attributes (return to normal mode)
1 → Bright (Usually turns on BOLD)
2 → Dim
3 → Underline
5 → link
7 → Reverse
8 → Hidden

Foreground is one of the following:
30 → Black
31 → Red
32 → Green
33 → Yellow
34 → Blue
35 → Magenta
36 → Cyan
37 → White

Background is one of the following:
40 → Black
41 → Red
42 → Green
43 → Yellow
44 → Blue
45 → Magenta
46 → Cyan
47 → White
ant -logger org.apache.tools.ant.listener.AnsiColorLogger

Log4jListener

已棄用:Apache Log4j (1) 已不再開發。最後一次發布是 2012 年 5 月 26 日的 1.2.17,且包含漏洞問題。

將建置事件傳遞給 Log4j,使用每個建置事件產生器的完整類別名稱作為類別

所有開始事件都記錄為 INFO。完成事件會記錄為 INFO 或 ERROR,視建置是否在該階段失敗而定。訊息事件會根據其 Ant 記錄層級記錄,直接對應到相應的 Log4j 層級。

ant -listener org.apache.tools.ant.listener.Log4jListener

要使用 Log4j,您需要 Log4j JAR 檔案和 log4j.properties 設定檔。兩者都應放置在 Ant 類別路徑中的某個位置。如果 log4j.properties 在您的專案根目錄中,您可以使用 -lib 選項新增它

ant -listener org.apache.tools.ant.listener.Log4jListener -lib .

例如,如果您想擷取 DefaultLogger 輸出的相同資訊到主控台,並將其傳送到名為 build.log 的檔案,您可以使用下列設定

log4j.rootLogger=ERROR, LogFile
log4j.logger.org.apache.tools.ant.Project=INFO
log4j.logger.org.apache.tools.ant.Target=INFO
log4j.logger.org.apache.tools.ant.taskdefs=INFO
log4j.logger.org.apache.tools.ant.taskdefs.Echo=WARN

log4j.appender.LogFile=org.apache.log4j.FileAppender
log4j.appender.LogFile.layout=org.apache.log4j.PatternLayout
log4j.appender.LogFile.layout.ConversionPattern=[%6r] %8c{1} : %m%n
log4j.appender.LogFile.file=build.log

有關設定 Log4J 的更多資訊,請參閱 其文件頁面

使用 Log4j 1.2 橋接器

如果您應用程式是針對 Log4j (1.x) API 編寫,但您想使用 Log4j 2.x 執行時期,您可以使用 Log4j 橋接器。要將橋接器與 Ant 一起使用,您必須新增

到您的類別路徑,例如透過 -lib 選項。(要使用橋接器,需要 Ant 1.9.10/1.10.2 或更高版本。)將 1.x 屬性檔轉換為 2.x XML 語法會產生

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <Appenders>
    <File name="file" fileName="build.log">
      <PatternLayout>
        <Pattern>[%6r] %8c{1} : %m%n</Pattern>
      </PatternLayout>
    </File>
  </Appenders>
  <Loggers>
    <Root level="ERROR">
      <AppenderRef ref="file" level="DEBUG"/>
    </Root>
    <Logger name="org.apache.tools.ant.Project" level="INFO"/>
    <Logger name="org.apache.tools.ant.Project" level="INFO"/>
    <Logger name="org.apache.tools.ant.taskdefs" level="INFO"/>
    <Logger name="org.apache.tools.ant.taskdefs.Echo" level="WARN"/>
  </Loggers>
</Configuration>

XmlLogger

當用作監聽器時,將所有建置資訊寫入名為 log.xml 的 XML 檔案,或如果存在,寫入 XmlLogger.file 屬性的值。當用作記錄器時,它會將所有輸出寫入主控台或 -logfile 的值。無論用作監聽器或記錄器,輸出都不會在建置完成之前產生,因為它會緩衝資訊以提供任務、目標和專案的計時資訊。

XML 檔案預設會建立對目前目錄中 XSLT 檔案 log.xsl 的參考;在 ANT_HOME/etc 中尋找其中一個。您可以設定屬性 ant.XmlLogger.stylesheet.uri 以提供樣式表的 URI。這可以是相對或絕對檔案路徑,或 HTTP URL。如果您將屬性設定為空字串,,則不會宣告任何 XSLT 轉換。

ant -listener org.apache.tools.ant.XmlLogger
ant -logger org.apache.tools.ant.XmlLogger -verbose -logfile build_log.xml

TimestampedLogger

作用類似於預設記錄器,但最後的成功/失敗訊息也包含建置完成的時間。例如

BUILD SUCCESSFUL - at 16/08/05 16:24

要使用這個監聽器,請使用指令

ant -logger org.apache.tools.ant.listener.TimestampedLogger

BigProjectLogger

這個記錄器旨在讓檢查大型建置的記錄變得更容易,特別是在持續整合工具下執行的那些記錄。它

  1. 在進入子專案時,列印其名稱和目錄
  2. 在離開子專案時,列印其名稱
  3. 列印目標時包含專案名稱
  4. 省略記錄所有沒有直接任務輸出的目標名稱
  5. 包含 TimeStamp 記錄器的建置完成時間戳記

當使用 <subant> 從許多較小的專案建置大型專案時,這項功能很有用,輸出會顯示正在建置的特定專案。以下是一個範例,其中會對所有子專案呼叫「清除」,其中只有部分專案會執行工作

======================================================================
Entering project "xunit"
In /home/ant/components/xunit
======================================================================

xunit.clean:
   [delete] Deleting directory /home/ant/components/xunit/build
   [delete] Deleting directory /home/ant/components/xunit/dist

======================================================================
Exiting project "xunit"
======================================================================

======================================================================
Entering project "junit"
In /home/ant/components/junit
======================================================================

======================================================================
Exiting project "junit"
======================================================================

在此範例中,進入和離開訊息非常詳細,但在編譯或測試許多子元件的大型專案中,訊息會簡化為清楚的區隔標記,表示不同專案負責的部分,或更重要的是,哪個專案失敗。

要使用這個監聽器,請使用指令

ant -logger org.apache.tools.ant.listener.BigProjectLogger

SimpleBigProjectLogger

自 Ant 1.8.1 起

BigProjectLogger 類似,會列印專案限定的目標名稱,這對具有子專案的大型建置很有用。否則,它會像 NoBannerLogger 一樣安靜

Buildfile: /sources/myapp/build.xml

myapp-lib.compile:
Created dir: /sources/myapp/lib/build/classes
Compiling 1 source file to /sources/myapp/lib/build/classes

myapp-lib.jar:
Building jar: /sources/myapp/lib/build/lib.jar

myapp.compile:
Created dir: /sources/myapp/build/classes
Compiling 2 source files to /sources/myapp/build/classes

myapp.jar:
Building jar: /sources/myapp/build/myapp.jar

BUILD SUCCESSFUL
Total time: 1 second

要使用這個監聽器,請使用指令

ant -logger org.apache.tools.ant.listener.SimpleBigProjectLogger

ProfileLogger

自 Ant 1.8.0 起

此記錄器會儲存執行任務、目標和整個建置所需的時間,並列印這些資訊。輸出包含進入建置、目標或任務時的時間戳記,以及離開時的時間戳記和所需時間。

範例

有該建置檔
<project>
    <target name="aTarget">
        <echo>echo-task</echo>
        <zip destfile="my.zip">
            <fileset dir="${ant.home}"/>
        </zip>
    </target>
    <target name="anotherTarget" depends="aTarget">
        <echo>another-echo-task</echo>
    </target>
</project>

並使用 ant -logger org.apache.tools.ant.listener.ProfileLogger anotherTarget 執行後,會產生該輸出(當然會有其他時間戳記和持續時間 ;-)

Buildfile: ...\build.xml

Target aTarget: started Thu Jan 22 09:01:00 CET 2009

echo: started Thu Jan 22 09:01:00 CET 2009
     [echo] echo-task

echo: finished Thu Jan 22 09:01:00 CET 2009 (250ms)

zip: started Thu Jan 22 09:01:00 CET 2009
      [zip] Building zip: ...\my.zip

zip: finished Thu Jan 22 09:01:01 CET 2009 (1313ms)

Target aTarget: finished Thu Jan 22 09:01:01 CET 2009 (1719ms)

Target anotherTarget: started Thu Jan 22 09:01:01 CET 2009

echo: started Thu Jan 22 09:01:01 CET 2009
     [echo] another-echo-task

echo: finished Thu Jan 22 09:01:01 CET 2009 (0ms)

Target anotherTarget: finished Thu Jan 22 09:01:01 CET 2009 (0ms)

BUILD SUCCESSFUL
Total time: 2 seconds

撰寫您自己的記錄器

請參閱開發人員的 建置事件區段。

注意事項