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
Использование LinkLog
<dependency>
<groupId>io.gitee.reywong</groupId>
<artifactId>ry-linklog</artifactId>
<version>1.0.1-releases</version>
</dependency>
В шаблоне добавьте
%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.
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 )