009_logback本地Appender

一. Appender接口

1. 什么是Appender?

1.1. Appender是负责写记录事件的组件。Appender必须实现接口"ch.qos.logback.core.Appender"。

2. Appender接口的重要方法

3. Appender接口里的多数方法都是getter和setting。值得注意的是doAppend()方法, 它唯一的参数是类型E的对象。类型E的实际类型视logback模块的不同而不同。在logback-classic模块里, E可能是"ILoggingEvent"类型; 在logback-access模块里, E可能是"AccessEvent"类型。doAppend()方法也许是logback框架里最重要的方法, 它负责以适当的格式将记录事件输出到合适的设备。

4. Appender接口扩展了FilterAttachable接口, 因此appender实例可被关联一个或多个过滤器。

5. FilterAttachable接口的实现类FilterAttachableImpl

6. Appender是最终负责输出记录事件的组件。然而, 它们可以把实际格式化的任务委托给Layout或Encoder对象。每个layout/encoder都关联到一个且仅一个appender。有些appender有内置的或固定的事件格式, 因此它们不需要也没有layout/encoder。例如: SocketAppender在发送记录事件之前只是简单地对其进行序列化。

二. AppenderBase抽象类

1. 类ch.qos.logback.core.AppenderBase是实现了Appender接口的抽象类。AppenderBase提供所有appender共享的基本功能, 比如设置/获取名字的方法, 其活动状态和过滤器。AppenderBase是loback里继承自appender的一个超类。尽管是抽象类, AppenderBase实际上实现了Appender接口的doAppend()方法。

2. AppenderBase抽象类doAppend方法实现

3. 这里的doAppend()方法的实现是同步的(synchronized), 确保不同线程对同一个appender的记录是线程安全的。这里进行的同步并不总是合适的, logback带了与AppenderBase非常相似的类ch.qos.logback.core.UnsynchronizedAppenderBase, 之后会讨论它。

4. doAppend()方法做的第一件事就是检查"guard"是否为true。如果是, 则立即退出方法。如果未设置"guard", 紧接下来的语句就把它设为true。"guard"确保doAppend()方法不会递归/重复调用自己。

5. 之后的语句里, 我们检查"started"字段是否为true。如果不是, doAppend()会发出一条警告信息然后返回。换句话说, appender一旦关闭后, 就无法再向它写入。Appender对象实现LifeCycle接口, 意味着它们实现了start()、stop()和isStarted()方法。对appender的所有属性都设值后, Joran调用start()方法让appender激活自己的属性。

6. LifeCycle接口

7. 如果appender不能启动或者已经被停止, 则会通过logback的内部状态管理系统发出一条警告消息。尝试几次后, 为了避免内部状态系统被同一条警告消息所淹没, doAppend()方法将停止发出这些警告消息。

8. 接着的if语句检查关联的过滤器的结果。根据过滤器链的判断结果, 事件被拒绝或接受。如果过滤器链没有结果, 则事件被默认接受。

9. doAppend()方法然后调用派生类的append()方法, 此方法真正把事件增加到合适的设备。

10. 最后, 释放guard, 允许下一个doAppend()调用。

三. UnsynchronizedAppenderBase抽象类

1. UnsynchronizedAppenderBase抽象类和AppenderBase抽象类最大的区别就是doAppend方法不是同步的

四. OutputStreamAppender类

1. OutputStreamAppender把事件添加到java.io.OutputStream。该类提供其他appender所需的基本服务。用户通常不直接实例化OutputStreamAppender对象。由于java.io.OutputStream一般无法被方便地映射到字符串, 所以无法在配置文件里指定目标OutputStream对象。简而言之, 你不能在配置文件里配置OutputStreamAppender。但这不是说OutputStreamAppender没有配置属性。它的属性如下。

2. OutputStreamAppender是另外三个appender的超类: ConsoleAppender、FileAppender及其直接子类RollingFileAppender。下图演示了OutputStreamAppender和其子类的类图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值