轉載:http://cryolite.iteye.com/blog/1663436
Erlang/OTP中將完成特定功能的一組模組組織起來,稱之為application 。這不是個好名字,它與我們約定俗成的application有著不同的含義,例如在JEE這樣的開發中,整個應用系統被稱為一個application;在iOS中一個獨立遊戲、一個小工具都被稱為一個應用。
erlang/OTP的application是一種最基本的behavior,是Erlang代碼和功能組織的形式(見Erlang
OTP設計原則)
我們可以為application設定各種參數,以調整運行時的行為,例如lager應用有多個記錄層級(debug/info/warning/error),設定不同層級的日誌會影響日誌的輸出,此外記錄檔的名字/存放位置都是可以配置的,這些都可以作為lager的運行時參數在lager啟動時配置。
application的參數可以在很多地方配置(包括設定檔和erlang運行參數),因此搞清這些不同地方進行配置關係(比如配置的預設位置和如何覆蓋override參數)是進行erlang OTP開發的基本功。
application的運行參數可視為一種環境變數,可以在三個層次進行配置,
上層的配置可以覆蓋下層的配置:
最底層(橙色),每個application都要自己的資源檔(.app檔案),這些檔案都有統一的格式,其中有個env屬性,在此為應用配置環境參數,詳細資料。因為最底層配置的參數總能被上層的參數覆蓋,而且資源檔中的參數只限於本應用,所以application的預設參數在此配置最好。
第二層(綠色),當多個application連同erlang運行時(包括lib庫)打包發布時,整個發布包(紅色虛線框)會有一個sys.config,在sys.config檔案中配置可以對所有的application進行配置,同名的參數將被覆蓋。這個檔案可以同時對多個application進行參數配置。不一定都叫sys.config這個名字,可以在erl命令的選項-config中指定其它名字。
最高層(藍色),直接在erl命令中直接為某個application配置參數,詳細資料,例如如果打算將lager的記錄層級為debug:
Bash代碼
- erl -lager handlers '[{lager_console_backend, debug}]'
顯然,參數的值可以是比較複雜的erlang term,記得要用引號引起來。
這一層級顯然適合做應用開發調試時臨時修改參數。
此外,配置參數實際上在application啟動之前就已生效。