Вход в Java и вообще: передовой опыт?

Ниже приводится набор рекомендаций, которым logger я следую во всех своих проектах, чтобы logger обеспечить хорошую производительность. Я .java пришел к формированию этого oraclejdk набора руководящих принципов .java на основе материалов из различных openjdk источников в Интернете.

На logging сегодняшний день я считаю, что jdk Log4j 2 - лучший вариант javax для входа в систему на Java.

Тесты core-java доступны here. Чтобы добиться javax максимальной производительности, я logging придерживаюсь следующей практики:

  1. В настоящее время я избегаю использования SLF4J по следующим причинам:
    • У него есть некоторые проблемы параллелизма с маркерами, которые я хочу использовать для управления журналированием операторов SQL (Markers not as powerful as slf4j - см. первый комментарий Ральфа Гоерса)
    • Он не поддерживает Java 8 Lambda, который, опять же, я хочу использовать для повышения производительности (Support the lambda expression in the Logger)
  2. Регулярно ведите журнал с помощью асинхронного средства ведения журнала для повышения производительности.
  3. Записывать сообщения об ошибках в отдельный файл с помощью синхронного регистратора, потому что мы хотим видеть сообщения об ошибках, как только они возникают.
  4. Не используйте информацию о местоположении, такую ​​как имя файла, имя класса, имя метода, номер строки, в обычном журнале, потому что для получения этой информации платформа делает снимок стека и просматривает его. Это влияет на производительность. Следовательно, используйте информацию о местоположении только в журнале ошибок, а не в обычном журнале.
  5. Для отслеживания отдельных запросов, обрабатываемых отдельными потоками, рассмотрите возможность использования контекста потока и случайного UUID, как описано here
  6. Поскольку мы регистрируем ошибки в отдельном файле, очень важно, чтобы мы регистрировали контекстную информацию также в журнале ошибок. Например, если приложение обнаружило ошибку при обработке файла, распечатайте имя файла и обрабатываемую запись файла в файле журнала ошибок вместе с трассировкой стека.
  7. Файл журнала должен быть доступен для поиска и прост для понимания. Например, если приложение обрабатывает записи клиентов в нескольких файлах, каждое сообщение журнала должно выглядеть следующим образом:
12:01:00,127 INFO FILE_NAME=file1.txt - Processing starts
12:01:00,127 DEBUG FILE_NAME=file1.txt, CUSTOMER_ID=756
12:01:00,129 INFO FILE_NAME=file1.txt - Processing ends
  1. Регистрируйте все операторы SQL с помощью маркера SQL, как показано ниже, и используйте фильтр, чтобы включить или отключить его:
private static final Marker sqlMarker = 
  MarkerManager.getMarker("SQL");

private void method1() {
    logger.debug(sqlMarker, "SELECT * FROM EMPLOYEE");
}
  1. Регистрируйте все параметры с помощью лямбда-выражений Java 8. Это избавит приложение от форматирования сообщения, когда данный уровень журнала отключен:
int i=5, j=10;
logger.info("Sample output {}, {}", ()->i, ()->j);
  1. Не jre используйте конкатенацию logger строк. Используйте параметризованное log4j сообщение, как показано выше

  2. Используйте log динамическую перезагрузку logs конфигурации ведения журнала, чтобы .java приложение автоматически oraclejdk перезагружало изменения в java-libraries конфигурации ведения журнала log без необходимости перезапуска openjdk приложения

  3. Не используйте java printStackTrace() или System.out.println()

  4. Приложение должно выключить log4j регистратор перед выходом:

LogManager.shutdown();
  1. Наконец, для всеобщего сведения, я использую следующую конфигурацию:


    
        ${env:LOG_ROOT}/SAMPLE
        ${env:LOG_ROOT}/SAMPLE/sample
        
        10 MB
    
    
        
            
                
            
            
                %d{HH:mm:ss,SSS} %m%n
                
            
            
                
                

            
        
        
            
                %d{HH:mm:ss,SSS} %p %c{1.}[%L] [%t] %m%n
                
            
            
                
                
            
        
    
    
        
            
        
        
            
        
    

  1. Необходимые зависимости Maven находятся здесь:

    org.apache.logging.log4j
    log4j-api
    2.8.1


    org.apache.logging.log4j
    log4j-core
    2.8.1


    com.lmax
    disruptor
    3.3.6



    org.apache.logging.log4j
    log4j-1.2-api
    2.8.1

java

logging

log4j

2022-11-19T00:23:11+00:00