1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/reywong-OSSRH-71430

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

LinkLog: краткое описание

Содержание LinkLog

Рисунок 1. Mind map.

Руководство по использованию LinkLog

Лучшие практики оптимальной системы журналов.

Описание функции отслеживания ссылок LinkLog

LinkLog перехватывает запросы основного потока, добавляет traceId для передачи между системами и затем использует функцию MDC библиотеки slf4j для печати в журнале, что позволяет отслеживать журналы по ссылкам.

Отслеживание по ссылкам включает два основных компонента: traceId и spanId. TraceId — это уникальный глобальный идентификатор для одного запроса, а spanId — идентификатор узла для текущего запроса (в виде древовидной структуры).

Рисунок 2. Пример:

Поддерживаемые фреймворки LinkLog

  • Поддержка динамического изменения уровня журнала с помощью конфигурационных центров, таких как Disconf и Apollo. Примечание: необходимо изменить или добавить файл linklog.properties.

    ### k=v пара ключ-значение  k=имя LoggerFactory  v=уровень журнала
    ### k:LoggerFactory.getLogger(LinkLog.class) при получении logger k является полным путём класса LinkLog
    ### v: уровень журнала включает OFF>FATAL>ERROR>WARN>INFO>DEBUG>TRACE>ALL
       cn.ry.LinkLog=DEBUG
    
  • Поддерживаемые фреймворки журналов: logback, log4j, log4j2.

  • Автоматически адаптируемые фреймворки: SpringBoot, SpringMVC, Fegin, Spring GateWay, Dubbo.

  • Способ подключения HttpClient:

      //добавляем LinkLogHttpRequestInterceptor для перехвата
      CloseableHttpClient httpClient = HttpClientBuilder.create()
                    .addInterceptorFirst(new LinkLogHttpRequestInterceptor())   
                    .build();
    
  • Способ подключения RestTemplate:

      //добавляем LinkLogRestTemplateFilter для перехвата
      RestTemplate restTemplate = new RestTemplate();
      restTemplate.setInterceptors(Collections.singletonList(new LinkLogRestTemplateFilter()));
    
  • Способ подключения OkHttp:

      //добавляем LinkLogOkHttpInterceptor для перехвата
      OkHttpClient client = new OkHttpClient.Builder()
      .addInterceptor(new LinkLogOkHttpInterceptor())
      .build();
    
    
  • Jersey способ подключения:

ClientBuilder clientBuilder = ClientBuilder.newBuilder();
Client client=clientBuilder.withConfig(new ClientConfig(LinkLogJerseyFilter.class)).build();

Особенности LinkLog

  • Простое подключение, нулевое добавление в систему.
  • Лёгкий вес, не требует сторонних jar-файлов.
  • Автоматическая адаптация, перехватчики автоматически адаптируются в соответствии с jar-файлами системы.

Использование LinkLog

Добавление зависимости в pom.xml
<dependency>
    <groupId>io.gitee.reywong</groupId>
    <artifactId>ry-linklog</artifactId>
    <version>1.0.1-releases</version>
</dependency>
Отображение traceId в файле конфигурации журнала

В шаблоне добавьте %X{linkLog}.

Например:

 <appender name="messageText_console" class="ch.qos.logback.core.ConsoleAppender">
     <encoder>
         <pattern>[%X{linkLog}] [%date{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%-5level] [%logger:%line] %msg%n</pattern>
         <charset>UTF-8</charset>
     </encoder>
 </appender>
Демонстрация эффекта

Система A вызывает систему B.

Код системы A

public String linklog(HttpServletRequest request, HttpServletResponse response) {
        StringBuilder stringBuilder = new StringBuilder();
        logger.info("1.请求参数{}", "reywong");
        List<String> sayList = demoServer.sayHello("reywong");
        if (sayList != null) {
            for (String say : sayList) {
                stringBuilder.append(say);
            }
        }
        String result = stringBuilder.toString();
        logger.info(result);

        logger.info("2.请求参数{}", "reywong");
        demoServer.sayHello("reywong");

        logger.info("3.httpclient 请求接口");
        httpClient();

        return result;
    }

    
    public String httpClient() {
        String msg = "";
        // получаем Http-клиент (можно понимать как: сначала у вас должен быть браузер; обратите внимание: на самом деле HttpClient и браузер разные)
        CloseableHttpClient httpClient = HttpClientBuilder
                .create()
                .addInterceptorFirst(new LinkLogHttpRequestInterceptor())
                .build();


        // создаём Get-запрос
        HttpGet httpGet = new HttpGet("http://localhost:8082/springMvc");
        // модель ответа
        CloseableHttpResponse response = null;
        try {
            Thread.sleep(1000);
            // клиент выполняет (отправляет) запрос Get
            logger.info("request springMVC");
            response = httpClient.execute(httpGet);
            // из модели ответа получаем объект ответа
            HttpEntity responseEntity = response.getEntity();
            msg = responseEntity.toString();
            if (responseEntity != null) {
                logger.info("reponse get springMVC");
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally
``` {
    try {
        // 释放资源
        if (httpClient != null) {
            httpClient.close();
        }
        if (response != null) {
            response.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
return msg;
}

#### A系统日志

[Изображение не предоставлено]

#### B系统代码

@RequestMapping("/springMvc") public String springMvc(HttpServletRequest request, HttpServletResponse response) { logger.info("linkLog-Server springMvc"); return "springMvc"; }


#### B系统日志
[Изображение не представлено]

##### Тестовый план
В проекте есть тестовый проект, который можно запустить напрямую.
LinkLog-example/link-example-dubbo содержит тестовые примеры для springMvc и dubbo.
Шаги:
1. Запустить linklog-example-dubbo-server.
2. Включить linklog-example-dubbo-client.
3. Выполнить запрос в dubbo.http (в идее есть поддержка HTTP-запросов, аналогично Postman).

#### Примечания
1. В настоящее время проект загружается через SPI, поддерживая tomcat spi, springboot spi и dubbo spi.
2. Если springmvc не может быть перехвачен, можно настроить перехватчик: ```<bean class="cn.com.ry.framework.linklog.LinkLogInit"></bean>```.
3. После java8 можно включить опцию «пустой указатель стека», добавив параметр JVM ``` -XX:-OmitStackTraceInFastThrow``` при запуске.

## Лучшие практики
[Лучшие практики ведения журнала](doc/linklog.md).

#### Другие открытые проекты
[Meteor — инструмент диагностики онлайн-неисправностей на основе Arthas](https://gitee.com/reywong/meteor?_from=gitee_search).

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

linkLog осуществляет системную передачу данных с помощью добавления traceId к запросам основной структуры. Затем данные выводятся в журнал через функцию MDC библиотеки slf4j, что позволяет реализовать логирование с отслеживанием связей. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/reywong-OSSRH-71430.git
git@api.gitlife.ru:oschina-mirror/reywong-OSSRH-71430.git
oschina-mirror
reywong-OSSRH-71430
reywong-OSSRH-71430
master