转载: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:
- erl -lager handlers '[{lager_console_backend, debug}]'
显然,参数的值可以是比较复杂的erlang term,记得要用引号引起来。
这一级别显然适合做应用开发调试时临时修改参数。
此外,配置参数实际上在application启动之前就已生效。