25.1. 理解日志服务子系统

Apusic应用服务器日志子系统由以下三个部分组成:

日志子系统进行日志处理的过程概述如下:

1. 日志子系统初始化,初始化一个全局的日志管理器(LogManager)对象,日志管理器对象(LogManager)从域主目录中的config目录下的logging.xml 文件中读取初始化配置。生成全局匿名日志记录器(Global Anonymous Logger)对象,根据配置文件中对日志记录器(Logger)的定义生成相应的日志记录器(Logger)对象; 根据配置文件中对日志输出(Handler)的定义生成相应的全局日志输出(Handler)对象;

[注意]注意

缺省初始化配置中包扩一个匿名的全局日志记录器(Logger),一个全局的控制台日志输出对象(ConsoleHandler)和一个全局的文件日志输出对象(FileHandler)

2. 其它子系统向特定的日志记录器(Logger)对象输出日志信息; 客户应用向应用指定的日志记录器(Logger)对象输出日志信息,如未指定,则输出到全局匿名日志记录器(Global Anonymous Logger)对象;

3. 日志记录器(Logger)对象将为接受到的每个日志信息分配一个描述它的日志记录对象(LogRecord),然后将此日志记录对象发送给所有的全局日志输出对象(Handler);

4. 日志输出(Handler)对象将日志记录(LogRecord)格式化输出到控制台,文件,发送到网络日志服务或发送到操作系统日志;

Apusic应用服务器日志子系统的重要组成部分有:

日志管理器(LogManager)

日志级别

日志记录器(Logger)

日志输出(Handler)

25.1.1. 日志管理器(LogManager)

在启动时,Apusic应用服务器初始化一个全局的日志管理器(LogManager)对象, 此全局日志管理器(LogManager)对象用于维护日志记录器(Logger)和日志服务所共享的状态,并且在整个服务器的运行过程中是唯一且固定的:

  • 管理日志记录器(Logger)对象的分级命名空间,所有已命名的日志记录器(Logger)对象都存储于此命名空间之中;

  • 管理全局日志输出(Handler)对象列表。

日志管理器从位于Apusic应用服务器安装目录中config目录下的配置文件logging.xml读取其初始化配置。

logging.xml配置文件中可使用handler标记装载某个日志输出类文件并注册一个全局日志输出(Handler)对象。每个handler标记可以有零个或多个属性(property)声明,这些属性将通过JavaBean的内省(introspection)机制在初始化时对此Handler对象进行设置。

在日志管理器(LogManager)对日志子系统进行配置时,必须保证所有的日志输出(Handler)类位于系统的类路径中。

对于在logging.xml中声明的日志记录器(Logger)对象,可以按照句点分隔的命名方式进行命名,日志管理器(LogManager)将把这些对象按照其命名组织到一个分级的命名空间中,例如,名字为a.b.c的日志记录器(Logger)对象从属于名字为a.b的日志记录器(Logger)对象,而名字为a.c的日志记录器(Logger)对象与名字为a.b的日志记录器(Logger)对象是同级的关系。

在Apusic应用服务器中,包含多个除了日志子系统之外的其他子系统,其他子系统在日志子系统中注册自己的日志记录器(Logger)分级命名空间,子系统和子系统中的模块向命名空间中相应的日志记录器(Logger)输出日志信息。这些由应用服务器注册并使用的日志记录器被称为系统日志记录器(Logger),对应于应用系统注册并使用的应用日志记录器(Logger)。

25.1.2. 日志级别

Apusic日志系统支持六个日志级别,设置日志级别的目的是用来控制日志的输出。

日志记录器(Logger)对象和日志输出(Handler)对象需要被指定所接受日志请求的日志级别,通过被指定的的级别对输入的日志请求进行过滤,对属于指定级别和高于指定级别的日志请求进行处理,而低于指定级别的日志请求将被忽略。

按照由低到高的顺序,各级别排列如下表:

级别描述
DEBUG调试级别日志信息
INFO报告类信息
NOTICE常规但重要的信息
WARNING警告类信息
ERROR错误类信息
FATAL重大情况信息(最高级别)

如为日志记录器(Logger)指定了某个级别,如NOTICE,则对于NOTICE, WARNING, ERROR或FATAL级别的日志请求将会被处理,而INFO和DEBUG级别的请求将被日志记录器(Logger)忽略。

另外,可以将日志级别设置为OFF以关闭对日志请求的处理,也可将日志级别设置为ALL输出所有的日志信息。

25.1.3. 日志记录器对象(Logger)

对于特定系统或应用组件,可使用日志记录器对象进行日志信息的记录。日志记录器通常需要命名,且通常使用句点分隔的分级命名方式。另外,创建不从属于日志记录器(Logger)命名空间的匿名日志记录器(Logger)也是允许的。

对于输入到特定日志记录器对象(Logger)的日志信息,如果此日志记录器(Logger)对象已登记了相应的日志输出(Handler)对象,则日志信息将被输出到被登记的所有日志输出对象,再由相应的日志输出(Handler)对象输出到相应的目标,如控制台,日志文件等等。

25.1.4. 日志输出(Handler)

日志输出(Handler)从日志记录器(Logger)接受日志记录(LogRecord)并输出到指定的目标,如日志文件,控制台,操作系统日志等等。

通常每个日志输出对象将伴随一个过滤器(Filter)对象和一个格式化(Formatter)对象,过滤器对象用于决定是否接受日志纪录输入的逻辑,格式化对象用于将日志记录(LogRecord) 转化为字符串形式的日志信息。缺省状态下采用com.apusic.logging.SimpleFormatter类作为缺省的Formatter,并且缺省状态下不使用过滤器。

Apusic应用服务器日志子系统提供五个日志输出类:

  • 控制台日志输出(ConsoleHandler)

    本输出将把日志信息输出到System.err对象,缺省状态下字符集采用平台缺省字符集

  • 日志文件输出 (FileHandler)

    本输出将把日志信息输出到指定的文件或者一个循环的文件集合

    对于循环的文件集合,当对某个文件的输出达到了了指定限制,此文件将被关闭,新的接收日志输入的文件将被打开,旧的日志文件将会在基本日志文件名后被连续地加上如:1,2,3等数字标识。

    缺省状态下日志文件输出采用了缓冲机制,但在每个日志记录完成之后即被刷新。

    缺省状态下,com.apusic.logging.SimpleFormatter类被用于缺省格式化对象。

  • 端口日志输出(SocketHandler)

    日志记录被输出到指定的网络端口的输出流,缺省状态下使用com.apusic.logging.XMLFormatter作为格式化对象。

    缺省状态下对端口的输出采用了缓冲机制,但每个日志记录完成之后即被刷新。

  • 按日期文件日志输出(DateFileHandler)

    类名:com.apusic.logging.DateFileHandler

    本输出将把日志信息输出到指定的文件,文件名称包含日期信息,一天默认产生一个文件。也可以通过修改配置limit,控制文件的大小,此时必须设置strict属性为false(默认值为true)。

  • WEB控制台日志输出(WebConsoleHandler)

    类名:com.apusic.tools.admin.WebConsoleHandler

    本输出将把日志信息输出到WEB控制台。如果要实现在WEB管理控制台对日志进行实时的监控,需要开启这个日志输出,反之不需要。