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

OSCHINA-MIRROR/ealenxie-aop-log

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

AopLog

AopLog — это инструментарий для сбора и обработки метрик методов запросов, реализованный с использованием Spring AOP и ThreadLocal.

Цели дизайна и сценарии использования:- Использует Spring AOP для перехвата параметров методов; большинство подходов в этом отношении схожи, поэтому нет необходимости писать код для перехвата и обработки логов в каждом проекте, достаточно использовать этот пакет.

  • Можно получить параметры запроса, параметры ответа, заголовки запроса, внутреннее время выполнения, успешность или неудачу метода, а также шаги, определённые самостоятельно.
  • Полный процесс метода генерирует одну запись метрик (объект LogData); например, полный HTTP-запрос в контроллере @Controller.
  • Сбор данных может быть активирован выборочно, например, только при возникновении ошибок (некоторые логи используются только для отладки проблем и бесполезны при нормальном запуске программы).
  • Процесс сбора метрик можно настроить самостоятельно, например, вывод логов, запись в базу данных, файл или очередь.
  • Сбор метрик не влияет на обычный поток выполнения метода, процесс сбора выполняется асинхронно (по умолчанию, но можно настроить через аннотацию asyncMode), что не оказывает влияния на производительность и скорость реакции нормальных методов.
  • Определение того, следует ли выполнять сбор метрик, осуществляется с помощью аннотации @AopLog (или пользовательского аспекта).### Быстрый старт

Включение проекта через адрес Maven-репозитория pom.xml.

<dependency>
    <groupId>com.github.ealenxie</groupId>
    <artifactId>aop-log</artifactId>
    <version>2.5</version>
</dependency>

Или же через Gradle

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 для сбора данных

Свойства объекта LogData для сбора данных

  • appName: Название приложения.
  • host: Адрес хоста.
  • port: Номер порта.
  • clientIp: IP-адрес клиента.
  • reqUrl: URL запроса.
  • httpMethod: HTTP метод.
  • headers: Заголовки HTTP.
  • type: Тип лога.
  • content: Содержание сообщения.
  • method: Метод API.
  • args: Аргументы метода.
  • respBody: Тело ответа.
  • logDate: Дата лога.
  • costTime: Время выполнения операции.
  • threadName: Имя потока.
  • threadId: ID потока.
  • success: Успешность выполнения запроса.--- | Поле | Тип | Примечание | | ------------- | ------ | ------------------------------------------------------------------------------------------------ | | appName | String | Название приложения | | host | String | Хост | | port | int | Номер порта | | clientIp | String | IP-адрес клиента | | reqUrl | String | Адрес запроса | | headers | Object | Заголовки запроса (опционально получаем user-agent, content-type) | | tag | String | Операционный тег, значение по умолчанию undefined | | content | String | Содержимое шага метода, значение по умолчанию пустое, можно использовать LogData.step для записи шагов | | method | String | Локальный Java метод запроса | | args | Object | Параметры запроса | | respBody | Object | Параметры ответа | | costTime | long | Время выполнения всего метода | | logDate | Date | Дата создания лога, время инициализации объекта LogData | | threadName | String | Название потока | | threadId | long | ID потока |

| success | boolean | Статус выполнения, успех (true)/ошибка (false) |#### Опции аннотации AopLog|

Полученный текст уже был частично переведён, поэтому были сделаны следующие изменения:

  1. Удалены лишние пробелы после двоеточий.
  2. Корректно оформлены скобки для логических значений true/false.

Финальный результат:

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

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

Введение

AopLog — это пакет инструментов логирования, который на основе SpringAop и ThreadLocal перехватывает и обрабатывает логирование содержимого методов запросов. Запрос: информация о точках. Развернуть Свернуть
Apache-2.0
Отмена

Обновления (1)

все
2.4

Участники

все

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

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