Используйте ApiBoot Logging для унифицированного управления журналами запросов.

Spring Boot

ApiBoot Loggingпутем интеграцииminbox-loggingДля управления информацией журнала каждого запроса, включая头信息,参数,主体内容,路径, происходящий服务器Сопутствующая информация и т. д., в соответствии со статусом ответа интерфейса, информация заголовка ответа, содержание ответа и ответ при возникновении исключения также могут быть записаны.堆栈信息.

организация с открытым исходным кодом minbox-projects

“org.minbox.framework”Стремление предоставить разработчикам ряд“开箱即用”Фреймворк реализует решение.

посколькуApiBootПосадка рамы, внутренняя интеграция第三方插件(plugin)Увеличение числа также привело кApiBootИсходный код слишком раздут, для этой проблемыminbox-projectsОрганизация с открытым исходным кодом родилась,ApiBootПервым вступит в организацию и будетApiBootинтегрированный第三方插件Разделяйте их один за другим и добавляйте каждый плагин как независимый проект с открытым исходным кодом.minbox-projectsОрганизация с открытым исходным кодом, которая облегчает отдельное обслуживание и обновление каждого проекта.

Домашняя страница организации:git ee.com/min-exploitation-pro т.е...

компонент журнала minbox-logging

minbox-loggingКомпонент журналаminbox-projectsЧлен организации с открытым исходным кодом, являетсяРаспределенная, ненавязчивая среда анализа журнала запросов на основе ссылок.

Предоставляет конечную точку администратора для采集日志,分析日志,日志告警通知,服务性能分析Ждать. Просмотр в режиме реального времени через интерфейс администратора链路日志информация, онлайн业务服务列表, решатьrequest -> responseАнализ журнала и запись всего бизнес-запроса.

Исходный код компонента журнала Minbox-logging:git ee.com/min-exploitation-pro т.е...

Создайте пример проекта

пройти черезideaинструменты разработчика для созданияSpringBootпроект.

  • pom.xml зависимости
<!--配置参数-->
<properties>
  <java.version>1.8</java.version>
  <api.boot.version>2.1.4.RELEASE</api.boot.version>
</properties>

<dependencies>
  <!--Web-->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <!--ApiBoot Logging-->
  <dependency>
    <groupId>org.minbox.framework</groupId>
    <artifactId>api-boot-starter-logging</artifactId>
  </dependency>
</dependencies>

<dependencyManagement>
  <!--ApiBoot统一版本依赖-->
  <dependencies>
    <dependency>
      <groupId>org.minbox.framework</groupId>
      <artifactId>api-boot-dependencies</artifactId>
      <type>pom</type>
      <scope>import</scope>
      <version>${api.boot.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>
  • тестовый контроллер

добавить тестLoggingSampleControllerКонтроллер, исходный код выглядит следующим образом:

/**
 * 请求日志示例
 *
 * @author 恒宇少年
 */
@RestController
@RequestMapping(value = "/test")
public class LoggingSampleController {
    /**
     * 验证请求参数以及相应内容
     *
     * @param name
     * @return
     */
    @GetMapping
    public String hello(@RequestParam("name") String name) {
        return "你好:" + name;
    }

    /**
     * 验证主体请求内容以及相应内容
     *
     * @param user
     * @return
     */
    @PostMapping
    public String bodyHello(@RequestBody User user) {
        return "你好:" + user.getName();
    }

    /**
     * RequestBody 示例类
     */
    @Data
    public static class User {
        private String name;
    }
}
  • application.yml
spring:
  application:
    name: apiboot-unified-manage-request-logs
server:
  port: 8080

потому чтоApiBoot LoggingИнформация о сервере, генерируемая журналом, должна быть записана, поэтомуspring.application.nameтак же какserver.portЭти два параметра должны быть настроены, иначе при запуске проекта будет выдано сообщение об ошибке.

  • Аннотация @EnableLoggingClient
@SpringBootApplication
@EnableLoggingClient
public class ApibootUnifiedManageRequestLogsApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApibootUnifiedManageRequestLogsApplication.class, args);
    }

}

использовать@EnableLoggingClientАннотация для включения ведения журналаклиент, настроить аннотацию для класса входа, внутренне передатьImportBeanDefinitionRegistrarзарегистрироватьсяminbox-logging-clientнужныйBean.

Унифицированные зависимости версии ApiBoot

мы используемSpringBootКогда мы обнаружили, что в зависимостях, которые мы добавили, не нужно было указывать конкретные版本号, это роль унифицированной зависимости версии, в основномMaven继承关系причина.

существуетApiBootЕсть еще такой модуль, который единообразно поддерживает зависимые версииapi-boot-dependencies, исходный код этого модуля только одинpom.xmlфайл, который в основном используется для настройки конкретной версии каждой сторонней зависимости или встроенной зависимости.

Проходим в проектpom.xmlДобавьте следующие зависимости управления версиями в файл конфигурации:

<dependencyManagement>
  <!--ApiBoot统一版本依赖-->
  <dependencies>
    <dependency>
      <groupId>org.minbox.framework</groupId>
      <artifactId>api-boot-dependencies</artifactId>
      <type>pom</type>
      <scope>import</scope>
      <version>${api.boot.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>

Вы можете использовать его без указания номера версииApiBootВсе зависимости предоставлены.

тестовый запрос

Проект готов, давайте сначала сдадим проектSpringBoot Applicationспособ начать, через следующееcurlКоманда обращается к нашему тестовому интерфейсу:

curl http://localhost:8080/test\?name\=hengboy

После завершения доступа запрос выполнен успешно, но консоль не выводит никакой информации журнала запросов, но есть журнал предупреждений:

Not set 【LoggingAdminDiscovery】in LoggingFactoryBean,don't invoke report request logs.

Это предупреждение очень четкое, мы не настроилиlogging-admin, поэтому отчет журнала не может быть выполнен Мы используем эту главу самостоятельно.ApiBoot Logginglog, поэтому это предупреждающее сообщение можно игнорировать.

журнал запросов на консольную печать

ApiBoot Loggingпредоставляет конфигурациюapi.boot.logging.show-console-log, значение по умолчанию для этой конфигурацииfalse, благодаря этой конфигурации журнал запросов можно распечатать на консоли.

существуетapplication.ymlКонфигурация, добавленная в файл конфигурации, выглядит следующим образом:

api:
  boot:
    # ApiBoot Logging 日志组件配置
    logging:
      show-console-log: true

После добавленияперезапустить проект, снова войдите в тестовый интерфейс, консоль выведет следующее:

2019-10-16 10:20:18.489  INFO 3930 --- [         task-1] o.m.f.l.c.n.support.LoggingLocalNotice   : Request Uri:/test, Logging:
{"endTime":1571192418416,"httpStatus":200,"requestBody":"","requestHeaders":{"host":"localhost:8080","user-agent":"curl/7.64.1","accept":"*/*"},"requestIp":"0:0:0:0:0:0:0:1","requestMethod":"GET","requestParam":"{\"name\":\"hengboy\"}","requestUri":"/test","responseBody":"你好:hengboy","responseHeaders":{},"serviceId":"apiboot-unified-manage-request-logs","serviceIp":"127.0.0.1","servicePort":"8080","spanId":"35a22772-5015-438a-a441-ba407926b789","startTime":1571192418391,"timeConsuming":25,"traceId":"ec53d162-314e-4516-8c24-5d5e03181543"}

В настоящее время мы можем видеть распечатанную информацию журнала запросов, но распечатанное содержимое журнала не украшено, не волнуйтесь,ApiBoot LoggingТакже предоставляется конфигурация для украшения выходного содержимого.

Журнал запросов на украшение консоли

ApiBoot Loggingпредоставленная конфигурацияapi.boot.logging.format-console-log-json, этот параметр по умолчанию равенfalse, мы можем украсить журнал запросов на печать, изменив значение этой конфигурации.

существуетapplication.ymlКонфигурация, добавленная в файл конфигурации, выглядит следующим образом:

api:
  boot:
    # ApiBoot Logging 日志组件配置
    logging:
      show-console-log: true
      format-console-log-json: true

После того, как дополнение будет завершено, мы придем сноваперезапустить проектПосле доступа к тестовому интерфейсу консоль выводит следующее:

2019-10-16 10:24:05.480  INFO 4051 --- [         task-1] o.m.f.l.c.n.support.LoggingLocalNotice   : Request Uri:/test, Logging:
{
	"endTime":1571192645404,
	"httpStatus":200,
	"requestBody":"",
	"requestHeaders":{
		"accept":"*/*",
		"host":"localhost:8080",
		"user-agent":"curl/7.64.1"
	},
	"requestIp":"0:0:0:0:0:0:0:1",
	"requestMethod":"GET",
	"requestParam":"{\"name\":\"hengboy\"}",
	"requestUri":"/test",
	"responseBody":"你好:hengboy",
	"responseHeaders":{},
	"serviceId":"apiboot-unified-manage-request-logs",
	"serviceIp":"127.0.0.1",
	"servicePort":"8080",
	"spanId":"277c0973-8042-4740-a8e7-2dbb0c7bb42c",
	"startTime":1571192645381,
	"timeConsuming":23,
	"traceId":"7a742942-f3cc-4d72-9493-d828b090f1cc"
}

Легко ли увидеть детали запроса? Тем не менее, рекомендуется настроить в соответствии с реальной ситуацией вашего собственного проекта, украшенный журнал займет больше места.консольная линия.

Уведомление журнала LoggingNotice

ApiBoot LoggingПредоставляет интерфейс для уведомления журнала, нам нужно только реализовать этот интерфейс, чтобы получить его每一次请求из日志对象, вы также можете настроить реализацию каждого класса реализации уведомлений журнала执行顺序.

существуетApiBoot LoggingКласс реализации, предоставленный внутри, показан на следующем рисунке:

  • LoggingLocalNotice

    Этот класс представляет собой реализацию, используемую для печати журнала запросов на консоли и украшения журнала запросов.Приоритет:Ordered#HIGHEST_PRECEDENCE(высший приоритет).

  • LoggingAdminNotice

    Этот класс используется для передачи журналов запросов вLogging Admin, приоритет:Ordered#HIGHEST_PRECEDENCE +1, нижеLoggingLocalNotice.

Добавить заголовок с LoggingNotice

Выше мы видели два встроенныхLoggingNoticeКласс реализации, приоритет у нас тоже был ясен, то если мы добавим кастомныйLoggingNoticeРеализуйте класс для запроса журнала этого времениRequestHeaderКак добавить пользовательскую информацию заголовка внутри?

AddHeaderLoggingNoticeИсходный код класса уведомлений выглядит следующим образом:

/**
 * 通过{@link LoggingNotice}向日志的请求header内添加区域信息
 *
 * @author 恒宇少年
 */
@Component
public class AddHeaderLoggingNotice implements LoggingNotice {
    /**
     * 区域头信息key
     */
    private static final String SERVER_REGION = "server-region";

    @Override
    public void notice(MinBoxLog minBoxLog) {
        minBoxLog.getRequestHeaders().put(SERVER_REGION, "JiNan");
    }

    /**
     * 最大优先级
     *
     * @return
     */
    @Override
    public int getOrder() {
        return HIGHEST_PRECEDENCE;
    }
}

потому чтоminbox-loggingЭто было принято во внимание в начале дизайна, поэтому добавить его относительно просто, нам просто нужно настроить приоритет нашего пользовательского уведомления журнала, а затем передать#noticeметод для изменения значения объекта журнала этого запроса.

Стук по доске

В этой главе мы знакомимApiBoot LoggingИнтегрированное использование , может быть использовано для сбора журналов запросов, эта возможность не только в этом, она будет очень мощной при правильном использовании.日志通知设计Это позволяет нам очень хорошо контролировать журнал запроса, и журнал添加标识,归类и т. д., можно управлять конфигурацией日志打印так же как美化.

автор личноблогИспользуйте фреймворк с открытым исходным кодомApiBootПомочь вам стать архитектором сервисов интерфейса API