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

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

内容简介:公司项目做了集群实现请求分流,由于线上或多或少会出现请求失败或系统异常,为了查看失败请求的日志信息,我们得将所有服务的日志文件都打开来进行问题的定位分析,操作起来非常麻烦。因此,我们开发组决定设计一套日志查看系统来解决上述问题。默认的,应用服务日志信息会保存在本地服务器的目录中,为了方便查看日志我们应该把多台服务器日志统一输出到一个日志文件中。由于项目使用的 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">

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

查看所有标签

猜你喜欢:

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

轻量级Django

轻量级Django

茱莉亚·埃尔曼 (Julia Elman)、马克·拉温 (Mark Lavin) / 侯荣涛、吴磊 / 中国电力出版社; 第1版 / 2016-11-1 / 35.6

自Django 创建以来,各种各样的开源社区已经构建了很多Web 框架,比如JavaScript 社区创建的Angular.js 、Ember.js 和Backbone.js 之类面向前端的Web 框架,它们是现代Web 开发中的先驱。Django 从哪里入手来适应这些框架呢?我们如何将客户端MVC 框架整合成为当前的Django 基础架构? 本书讲述如何利用Django 强大的“自支持”功......一起来看看 《轻量级Django》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具