1. SocketAppender被设计为通过序列化ILoggingEvent实例把记录输出到远程实体。被序列化的事件的真实类型是LoggingEventVO, 它实现了ILoggingEvent接口。尽管如此, 就记录事件而言, 远程记录仍然是无损的。在接收和反序列化后, 事件像是从本地产生的一样被记录。运行在不同机器上的多个SocketAppender实例可以把各自的记录输出到一个格式固定的中央记录服务器。

2. SocketAppender不关联layout, 因为它把序列化的事件发送到远程服务器。SocketAppender运作在TCP层上, TCP层提供可靠、有序、流量控制的端到端的二进制流。因此, 如果远程服务器可访问, 则记录事件最终会到达那里。否则, 如果远程服务器关机或不可访问, 那么记录事件会被抛弃。当远程服务器恢复可用时, 会透明地继续传输事件。这种透明的重新连接是由一个连接器(connector)线程执行的, 它定时尝试连接服务器。

3. 记录事件被本地TCP实现自动地缓冲。这意味着如果服务器连接很慢, 但快于客户端生成事件的速度, 那么客户端不会受网络连接慢的影响。但是如果网络连接慢于生成事件的速度, 那么客户端只能按网络速度执行。特别是在服务器宕机这种极端情况下, 客户端会被阻塞。

4. 如果连接器线程仍然存在, 即使SocketAppender不再关联到任何logger, 也不会被垃圾回收。连接器线程只在当与服务器之间没有连接时存在。为避免这个垃圾回收问题, 你应当显式地关闭 SocketAppender。会创建/销毁很多SocketAppender实例的长期运行的程序应当注意这个垃圾回收问题。多数其他程序可以安全地忽略这个问题。如果宿主JVM在SocketAppender关闭之前退出了, 不管 SocketAppender被显式关闭还是交给垃圾回收, 都有可能在管道(pipe)里剩有一些未被传输的数据, 这些数据会丢失。为避免数据丢失, 一般在退出程序之前显式地调用SocketAppender的close()方法或调用LoggerContext的stop()方法就可以了。

5. SocketAppender的属性见下表

6. Logback标准发行包含一个简单的记录服务器程序"ch.qos.logback.classic.net.SimpleSocketServer", 可以支持多个SocketAppender客户端。它等待来自SocketAppender客户端的记录事件, 接收到事件后, 按照本地服务器的记录策略进行记录。

7. 例子

7.1. 新建一个名为ServerSocketAppender的Java项目, 同时添加相关jar包

7.2. 在src目录下创建logback.xml

<configuration><appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>log/my.log</file><prudent>true</prudent> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>log/my.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>10MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy>    </rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><root level="debug"><appender-ref ref="file" /><appender-ref ref="stdout" /></root></configuration>

7.3. 编辑MyServer.java

package com.zr.server;import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.net.SimpleSocketServer;public class MyServer {public static void main(String[] args) {LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();SimpleSocketServer sss = new SimpleSocketServer(lc, 9999);sss.start();}
}

7.4. 新建一个名为SocketAppender的Java项目, 同时添加相关jar包

7.5. 在src目录下创建logback.xml

<configuration><appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><appender name="socket" class="ch.qos.logback.classic.net.SocketAppender"><remoteHost>127.0.0.1</remoteHost><port>9999</port></appender><root level="debug"><appender-ref ref="socket" /><appender-ref ref="stdout" /></root></configuration>

7.6. 编辑MyClient.java

package com.zr.client;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class MyClient {private static final Logger logger = LoggerFactory.getLogger(MyClient.class);public static void main(String[] args) {for(int i = 0; i < 1000; i++) {logger.debug("客户端日志: " + i);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

7.7. 运行MyServer.java

7.8. 运行MyClient.java, 可以多运行几个客户端

7.9. 运行的过程中可以更改系统时间, 服务端接收到客户端的日志信息

8. SimpleSocketServer不是很强大不能打印客户端的ip和端口信息。

010_logback中的SocketAppender相关推荐

  1. GNU Make 使用手册(于凤昌中译版)

    GNU Make 使用手册(中译版) 翻译:于凤昌 GNU make Version 3.79 April 2000 Richard M. Stallman and Roland McGrath 1 ...

  2. Logback第四章:Appenders

    第四章:Appenders 什么是 Appender logback 将写入日志事件的任务委托给一个名为 appender 的组件.Appender 必须实现 ch.qos.logback.core. ...

  3. 面试:第十二章:所有总结

    Java基础 java基本类型哪些,所占字节 byte :1个字节 short :2个字节 char :2个字节 int :4个字节 long :8个字节 float :4个字节 double :8个 ...

  4. linux内核分析(转自某位大哥网上的笔记)

    启动 当PC启动时,Intel系列的CPU首先进入的是实模式,并开始执行位于地址0xFFFF0处的代码,也就是ROM-BIOS起始位置的代码.BIOS先进行一系列的系统自检,然后初始化位于地址0的中断 ...

  5. log4j中调试与错误日志分开_Log4j 配置

    我们可以通过设置Log Level,定义Appender和在配置文件中指定Layout对象来配置log4j. log4j.properties 文件是一个log4j配置文件,它保留键 - 值对中的属性 ...

  6. Logback中文文档(四):Appender

    什么是 Appender Appender是负责写记录事件的组件.Appender 必须实现接口"ch.qos.logback.core.Appender".该接口的重要方法总结如 ...

  7. 在 Web 应用中增加用户跟踪功能

    http://www.ibm.com/developerworks/cn/web/wa-lo-usertrack/index.html 进行用户跟踪的重要性 随着 Web 应用的复杂化,用户在网站上的 ...

  8. log4j中将SocketAppender将日志内容发送到远程服务器

    1.服务端配置 1)服务端配置文件log4j-server.properties #Define a narrow log category. A category like debug will p ...

  9. log4,log4net,Log4配置,log4net使用实例,.net中使用LOG4输出日志,LOG4纪录日志

    log4,log4net,Log4配置,log4net使用实例,.net中使用LOG4输出日志,LOG4纪录日志 Log4配置 一.常用输出格式 %c   列出logger名字空间的全称,如加上{&l ...

最新文章

  1. 近乎于“神”的任正非
  2. Webkit 最新 Javascript 引擎领先 Chrome
  3. pointPolygonTest函数
  4. enum 使用规范及技巧(C# 参考)
  5. 多线程不重复读取数据_别再犯错了,多线程访问同一个资源一定要上锁?
  6. XML Schema ---complexType-----复合元素
  7. 今天是 OSChina 上线 6 周年!
  8. Spring.Net的AOP的通知
  9. 谈表单的设计 (一) 合理对表单进行布局
  10. 委托解绑的一个小问题
  11. 如何确定一家培训机构值得信赖
  12. 基于Java医院网上预约挂号系统设计与实现(含源代码)
  13. spring boot 中用到的thymeleaf (模板引擎)
  14. 安卓手机阅读软件哪个比较好啊
  15. python超声成像仿真_超声合成孔径成像
  16. 兼职接单过万后,关于一些渠道、报价及接单内容等经验的整理分享
  17. JDBC连接数据库6个步骤
  18. 微生物 Alpha多样性 作图 16S 菌群 R语言
  19. 装好office之后,鼠标右键不显示word和excel的问题
  20. RAP2的安装和部署

热门文章

  1. HDU 5384 Danganronpa (2015年多校比赛第8场)
  2. IntelliJ IDEA 的 project 和 module 区别与关系
  3. 20161228阅读笔记
  4. java重载和重载的区别
  5. C#调用C++Dll封装时遇到的一系列问题
  6. C# 线程手册 第三章 使用线程
  7. .net讀取指定節點的值
  8. 单臂路由与三层交换机—Vecloud微云
  9. 安装 Windows 7 64位系统 相关注意事项
  10. js Array Map and Set