02-26Logback 整合 RabbitMQ 实现统一日志输出

栏目: Java · 发布时间: 5年前

内容简介:公司项目做了集群实现请求分流,由于线上或多或少会出现请求失败或系统异常,为了查看失败请求的日志信息,我们得将所有服务的日志文件都打开来进行问题的定位分析,操作起来非常麻烦。因此,我们开发组决定设计一套日志查看系统来解决上述问题。默认的,应用服务日志信息会保存在本地服务器的目录中,为了方便查看日志我们应该把多台服务器日志统一输出到一个日志文件中。由于项目使用的 Logback 日志框架和 RabbitMQ 消息队列,这两者正好可以进行整合。

一、前言

公司项目做了集群实现请求分流,由于线上或多或少会出现请求失败或系统异常,为了查看失败请求的日志信息,我们得将所有服务的日志文件都打开来进行问题的定位分析,操作起来非常麻烦。因此,我们开发组决定设计一套日志查看系统来解决上述问题。

二、实现思路

默认的,应用服务日志信息会保存在本地服务器的目录中,为了方便查看日志我们应该把多台服务器日志统一输出到一个日志文件中。

由于项目使用的 Logback 日志框架和 RabbitMQ 消息队列,这两者正好可以进行整合。

因此,我们可以将项目代码中的日志输出到 RabbitMQ 队列中,通过 Logstash 读取队列数据,最后再输出到一个日志文件中。

三、准备环境

测试环境:IP 为 192.168.2.13 的 CentOS 7 系统

# 3.1 RabbitMQ 配置

首先需要搭建 RabbitMQ 环境,可以参考本站 《CentOS 7.2 安装 RabbitMQ》 进行搭建。

搭建完成后,登录 RabbitMQ 的管理界面,需要操作如下步骤:

  • 创建一个名为 log_queue 的队列
  • 创建一个名为 rabbit.log 的交换器(direct 类型)
  • 将 log_queue 队列绑定到 rabbit.log 交换机上

操作演示图:

02-26Logback 整合 RabbitMQ 实现统一日志输出

# 3.2 Logstash 配置文件

修改 Logstash 配置文件,本站也有 Logstash 相关的博文,读者可移至《Logstash 基础入门》 查看。

  1. input {
  2. rabbitmq {
  3. type =>"all"
  4. durable => true
  5. exchange => "rabbit.log"
  6. exchange_type => "direct"
  7. key => "info"
  8. host => "192.168.2.13"
  9. port => 5672
  10. user => "light"
  11. password => "light"
  12. queue => "log_queue"
  13. auto_delete => false
  14. output {
  15. file {
  16. path => "/usr/test-log/test-%{+YYYY-MM-dd}.log"
  17. codec => multiline {
  18. pattern => "^\d"
  19. negate => true
  20. what => "previous"

注意: multiline 是 Logstash 的插件,需要手动安装。

配置表示 Logstash 服务从 RabbitMQ 读取日志信息,输出到指定的目录文件中。

四、编码

# 4.1 依赖

列出主要依赖:

  1. org.springframework.boot
  2. spring-boot-starter-amqp
  3. org.springframework.amqp
  4. spring-rabbit

# 4.2 日志文件

名为 logback-spring.xml

  1. %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
  2. class="org.springframework.amqp.rabbit.logback.AmqpAppender">
  3. %n ]]>
  4. 192.168.2.13:5672
  5. light
  6. light
  7. true
  8. direct
  9. rabbit.log
  10. info
  11. true
  12. UTF-8
  13. true
  14. NON_PERSISTENT
  15. false

配置中的 exchangeType 和 exchangeName 就是我们上边创建的交换机的类型和名称。

# 4.3 测试类

自定义异常:

  1. public class CustomException extends RuntimeException{
  2. private static final long serialVersionUID = 1L;
  3. private int code;
  4. private String msg;
  5. public CustomException(int code, String msg) {
  6. super(msg);
  7. this.code = code;
  8. this.msg = msg;
  9. public int getCode() {
  10. return code;
  11. public void setCode(int code) {
  12. this.code = code;
  13. public String getMsg() {
  14. return msg;
  15. public void setMsg(String msg) {
  16. this.msg = msg;

模拟打印日志:

  1. @Component
  2. public class DemoTask {
  3. private static Logger logger = LoggerFactory.getLogger(DemoTask.class);
  4. private int num = 1;
  5. @Scheduled(fixedRate = 3000)
  6. public void writeLog() {
  7. try {
  8. if (num % 5 == 0) {
  9. throw new CustomException(500, "自定义异常错误");
  10. logger.info("==={}===={}","hello rabbitmq", System.currentTimeMillis());
  11. num++;
  12. } catch (CustomException e) {
  13. e.printStackTrace();
  14. logger.error("=={}==", e);

五、代码测试

执行启动类:

  1. @EnableScheduling
  2. @SpringBootApplication
  3. public class RabbitmqTestApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(RabbitmqTestApplication.class, args);

执行结果如下图:

02-26Logback 整合 RabbitMQ 实现统一日志输出

代码运行的日志信息已经输出到指定日志文件中了。

补充

由于多台服务器的日志都打印到同一个文件,为了区分日志来源,我们还得需要打印出日志信息对应的主机 ip 地址。具体实现步骤如下:

  • 自定义日志转换器

需要继承 ClassicConverter 类

  1. public class CustomLogConverter extends ClassicConverter {
  2. public String convert(ILoggingEvent event) {
  3. try {
  4. return InetAddress.getLocalHost().getHostAddress();
  5. } catch (UnknownHostException e) {
  6. e.printStackTrace();
  7. return null;
  • 修改 logback-spring.xml 文件

以下只张贴关键配置信息

  1. class="org.springframework.amqp.rabbit.logback.AmqpAppender">

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

打造有吸引力的学习型社群

打造有吸引力的学习型社群

苏平、田士杰、吕守玉 / 机械工业出版社 / 45.00元

本书首先对社群的定位、准备和吸引粉丝方面等做了饶有趣味的介绍,从社群黏度的提升、社群知识的迭代与转化和社群的持续发展等多个角度入手,对学习型社群的运营手段、运营模式、运营规律和运营经验等进行了全方位剖析。从中国培训师沙龙这个公益社群近十年成功运营的经验中,为如何经营好学习型社群总结出了一套系统性的、具有实操价值的方法。并以此为基础,扩展到知识管理、团队管理、内容IP等领域,为有致于社团建设以及优质......一起来看看 《打造有吸引力的学习型社群》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具