Цели дизайна и сценарии использования:- Использует Spring AOP для перехвата параметров методов; большинство подходов в этом отношении схожи, поэтому нет необходимости писать код для перехвата и обработки логов в каждом проекте, достаточно использовать этот пакет.
@Controller
.asyncMode
), что не оказывает влияния на производительность и скорость реакции нормальных методов.@AopLog
(или пользовательского аспекта).### Быстрый старт<dependency>
<groupId>com.github.ealenxie</groupId>
<artifactId>aop-log</artifactId>
<version>2.5</version>
</dependency>
implementation 'com.github.ealenxie:aop-log:2.5'
@AopLog
для сбора метрикДобавьте аннотацию @AopLog
к классу (действует на все методы класса) или конкретному методу класса для сбора метрик.
Пример:
@AopLog(type = "тестовый интерфейс", stackTraceOnErr = true)
@RestController
public class AppController {
@GetMapping("/app/sayHello")
public RespBody<String> sayHello() {
return RespBody.ok("hello EalenXie");
}
}
Пример простого вывода в консоль или записи в базу данных.
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.LogData;
import com.github.collector.LogCollector;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* Пример реализации
* Конфигурация простого логгера для сбора данных. Здесь просто используется log.info для вывода информации,
* но можно использовать запись в базу данных или другое место.
*/
@Slf4j
@Component
public class AopLogCollector implements LogCollector {
private final ObjectMapper objectMapper = new ObjectMapper();
/**
* Метод сбора данных
*
* @param logData объект с данными для логирования
*/
@Override
public void collect(final LogData logData) {
try {
log.info(objectMapper.writeValueAsString(logData));
} catch (final JsonProcessingException e) {
e.printStackTrace();
}
}
}}
```plaintext
2020-09-16 16:01:04.782 INFO 2012 --- [AsyncExecutor-2] имя.елян.infra.advice.AopLogCollector : {"appName":"app-template","host":"127.0.0.1","port":8080,"clientIp":"192.168.110.1","reqUrl":"http://localhost:8080/app/sayHello","httpMethod":"GET","headers":{"User-Agent":"Apache-HttpClient/4.5.10 (Java/11.0.5)"}},"type":"test","content":"","method":"имя.елян.api.facade.AppController#sayHello","args":null,"respBody":{"code":"200","desc":"OK","message":"Запрос успешен","dateTime":"2020-09-16 16:01:04","body":"hello EalenXie"},"logDate":1600243264780,"costTime":1,"threadName":"http-nio-8080-exec-3","threadId":33,"success":true}
Свойства объекта LogData для сбора данных
| success | boolean | Статус выполнения, успех (true)/ошибка (false) |#### Опции аннотации AopLog|
Полученный текст уже был частично переведён, поэтому были сделаны следующие изменения:
Финальный результат:
| success | boolean | Статус выполнения, успех (true)/ошибка (false) |
|-------------|---------|----------------------------------------------|
#### Опции аннотации AopLog
```| Опция | Тип | Описание | По умолчанию |
| :------------- | :----------------------------- | :--------------------------------------------------- | ----------------------- |
| logOnErr | boolean | Сбор данных только при возникновении ошибки | false |
| tag | String | Метка операции | "неопределённая" |
| headers | String[] | Получаемые заголовки HTTP, выбор конкретных заголовков | "User-Agent", "Content-Type" |
| args | boolean | Включать ли параметры запроса | true |
| respBody | boolean | Включать ли тело ответа | true |
| stackTraceOnErr | boolean | При возникновении ошибки в методе цели, добавлять ли трассировку стека в контент LogData | false |
| asyncMode | boolean | Асинхронный режим сбора | true |
| collector | Class<? extends LogCollector> | Указание коллекционера логов | По умолчанию используется глобальный коллекционер логов |
#### Метод step класса LogData.
Записывает шаги выполнения. (Если есть важные шаги, которые вы хотите записать)
Пример:
```java
import com.github.AopLog;
import com.github.LogData;
import name.ealen.infra.base.resp.RespBody;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author EalenXie создал 2020/6/22 14:28
*/
@AopLog(tag = "тест", stackTraceOnErr = true)
@RestController
public class AppController {
``` @GetMapping("/app/sayHello")
public RespBody<String> sayHello() {
LogData.step("1. Первый шаг выполнен");
//......
LogData.step("2. Второй шаг выполнен");
//.....
LogData.step("3. Метод сервиса выполнен");
//.....
return RespBody.ok("hello EalenXie");
}
}
При повторном вызове этого интерфейса /app/sayHello
, можно наблюдать вывод в консоли, особенно обратите внимание на поле content.```
2020-09-16 17:26:20.285 INFO 3284 --- [AsyncExecutor-2] name.ealen.infra.advice.AopLogCollector : {"appName":"app-template","host":"127.0.0.1","port":8080,"clientIp":"192.168.110.1","reqUrl":"http://localhost:8080/app/sayHello","httpMethod":"GET","headers":{"User-Agent":"Apache-HttpClient/4.5.10 (Java/11.0.5)"}},"tag":"тест","content":"1. Первый шаг выполнен\n2. Второй шаг выполнен\n3. Метод сервиса выполнен\n","method":"name.ealen.api.facade.AppController#sayHello","args":null,"respBody":{"code":"200","desc":"OK","message":"Запрос успешно выполнен","dateTime":"2020-09-16 17:26:20","body":"hello EalenXie"},"logDate":1600248380283,"costTime":1,"threadName":"http-nio-8080-exec-2","threadId":32,"success":true}
"content":"1. Первый шаг выполнен\n2. Второй шаг выполнен\n3. Метод сервиса выполнен\n"
```
#### Без использования аннотации @AopLog, сбор данных через пользовательский аспект
Пользовательский аспект внедряется в `AopLogProcessor`, вызывая метод `proceed(config, point)`.
```java
import com.github.AopLogConfig;
import com.github.AopLogProcessor;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* Пользовательский аспект
*/
@Aspect
@Component
public class CustomLogDataAspect {
```markdown
@Resource
private AopLogProcessor aopLogProcessor;
private static final AopLogConfig CONFIG;
static {
CONFIG = new AopLogConfig();
CONFIG.setTag("операционный тег");
CONFIG.setStackTraceOnErr(false);
CONFIG.setHeaders(new String[]{"content-type", "user-agent"});
}
// Пользовательский срез execution(public * com.test.web.TestController.*(..))
@Pointcut("execution(public * com.test.web.TestController.*(..))")
public void test() {
// игнорировать
}
// Пожалуйста, используйте окружение @Around()
@Around("test()")
public Object note(ProceedingJoinPoint point) throws Throwable {
return aopLogProcessor.proceed(CONFIG, point);
}
}
```
#### Примечания о изменениях:
Дополнительные сведения о изменениях см. в [заметках о выпуске](https://github.com/EalenXie/aop-log/releases).
```
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )