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">

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

查看所有标签

猜你喜欢:

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

人工智能

人工智能

李开复、王咏刚 / 文化发展出版社 / 2017-5-10 / CNY 55.00

人工智能已经来了,它就在我们身边,几乎无处不在。 人工智能技术正在彻底改变人类的认知,重建人机相互协作的关系。史无前例的自动驾驶正在重构我们头脑中的出行地图和人类生活图景,今天的人工智能技术也正在翻译、写作、绘画等人文和艺术领域进行大胆的尝试。 我们真的知道什么是人工智能吗? 我们真的准备好与人工智能共同发展了吗? 我们该如何在心理上将人和机器摆在正确的位置? 我们该......一起来看看 《人工智能》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具