@ SLF4J: как настроить lombok поддерживается slf4j - PullRequest
2 голосов
/ 06 апреля 2020

У меня есть проект maven, который регистрируется с использованием встроенного в Lombok @ Slf4j. В настоящее время мои журналы отображаются в консоли, как показано ниже:

    06-Apr-2020 17:42:38.217 INFO [RMI TCP Connection(2)-127.0.0.1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
    [2020-04-06 05:42:40,701] Artifact Tarkshala-Scholars-Engine:war exploded: Artifact is deployed successfully
    [2020-04-06 05:42:40,701] Artifact Tarkshala-Scholars-Engine:war exploded: Deploy took 4,521 milliseconds

    [http-nio-8080-exec-1] INFO com.tarkshala.scholars.engine.webservices.AuthenticationService - Welcome to Tarkshala Scholar APIs
    [http-nio-8080-exec-3] INFO com.tarkshala.scholars.engine.webservices.AuthenticationService - Welcome to Tarkshala Scholar APIs

    06-Apr-2020 17:42:45.808 INFO [Catalina-utility-2] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/Users/kuldeep/Work/apps/apache-tomcat-9/webapps/manager]
    06-Apr-2020 17:42:45.843 INFO [Catalina-utility-2] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/Users/kuldeep/Work/apps/apache-tomcat-9/webapps/manager] has finished in [35] ms

Пара строк в середине - это та, что записана в slf4j.

resources / log4j.properties выглядит ниже

    # Root logger option
    log4j.rootLogger=DEBUG, stdout, file

    # Redirect log messages to console
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.out
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

    # Redirect log messages to a log file, support file rolling.
    log4j.appender.file=org.apache.log4j.RollingFileAppender
    log4j.appender.file.File=/Users/kuldeep/Work/repos/Tarkshala-Scholars-APIs/logs/application.log
    log4j.appender.file.MaxFileSize=5MB
    log4j.appender.file.MaxBackupIndex=10
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

пом. xml выглядит следующим образом:

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.30</version>
</dependency>

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <version>1.7.30</version>
</dependency>

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.10</version>
  <scope>provided</scope>
</dependency>

Java класс выглядит так:

@Slf4j
@Path("/authentication")
@Authorization
public class AuthenticationService extends SpringApplication {

    @Path("/greet")
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @PubliclyAllowed
    public Response greet(){
        log.info("Welcome to Tarkshala Scholar APIs");
        return getBean(AuthenticationServiceHandler.class).greet();
    }
}

У меня есть несколько проблем:

  • Форматирование оператора, оно должно содержать время в квадратных скобках [].
  • журналы не добавляются в файл, указанный в конфигурации, фактически я считаю, что конфигурация не выбирается из файла.

Понятия не имею, что именно мне не хватает. Любая помощь / подсказка приветствуется.

1 Ответ

0 голосов
/ 11 апреля 2020

Сам разобрался, пройдя официальную страницу руководства apache.

Я разбью весь ответ на следующие два раздела

1. Настройка Log4j2 для Jersey2 Maven Webapp

Добавить следующие зависимости в pom. xml

<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-api</artifactId>
  <version>2.13.1</version>
</dependency>
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>2.13.1</version>
</dependency>
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-web</artifactId>
  <version>2.13.1</version>
</dependency>

Добавить следующий фильтр в веб. xml

  <filter>
    <filter-name>log4jServletFilter</filter-name>
    <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>log4jServletFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

Файл конфигурации log4j2. xml. Необходимо следовать имени log4j2. xml, так как сканирование конфигурации в classpath автоматически его обнаруживает, или в противном случае потребуется еще несколько строк в сети. xml потребуется для установки пути к файлу конфигурации. И не только имя, файл конфигурации должен быть помещен в каталог WEB-INF, где также находится web. xml.

    <?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
    <Appenders>
        <Console name="LogToConsole" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>

        <RollingRandomAccessFile name="LogToRollingRandomAccessFile" fileName="logs/TSE-app.log"
                                 filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout>
                <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="1 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingRandomAccessFile>
    </Appenders>

    <Loggers>
        <!-- avoid duplicated logs with additivity=false -->
        <Logger name="com.tarkshala.scholars" level="debug" additivity="false">
            <AppenderRef ref="LogToConsole"/>
            <AppenderRef ref="LogToRollingRandomAccessFile"/>
        </Logger>
        <Root level="error">
            <AppenderRef ref="LogToRollingRandomAccessFile"/>
            <AppenderRef ref="LogToConsole"/>
        </Root>
    </Loggers>
</Configuration>

Приведенная выше конфигурация содержит два типа регистраторов, первый для консоли и второй для файла. Также уровни журналов могут быть указаны для отдельных регистраторов. Для получения дополнительной информации, такой как шаблон журнала и т. Д. c, следуйте инструкции apache page

И последний пункт - использование регистратора в классе java. Регистратор может быть введен в класс java следующим образом:

@Path("/authentication")
public class AuthenticationService extends SpringApplication {

    private Logger logger = LogManager.getLogger(AuthenticationService.class);

    @Path("/greet")
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public Response greet(){
        logger.info("Welcome to Tarkshala Scholar APIs");
        logger.error("THis is error log");
        logger.debug("THis is debug log");
        return getBean(AuthenticationServiceHandler.class).greet();
    }
}

, и приятный результат такого большого количества выглядит следующим образом logs


Это прекрасно работает, но это раздражает впрыскивание Logger, инициализируя экземпляр в каждом классе, так что, чтобы сэкономить немного работы, Slf4j может помочь. Slf4j - это просто фасад (абстрактный слой), за которым работает реальный каркас журналирования (например, Log4j, встроенный утилит Java. Logger и Logback et c). Таким образом, в будущем, если улучшится каркас ведения журналов, тогда нам не придется трогать java классы, в которых был создан экземпляр логгера, это будут только зависимости и конфигурация, которые будут заботиться в соответствии с новыми потребностями.

2. Slf4j и lombok в дополнение к log4j2

Нам нужно добавить еще несколько зависимостей в дополнение ко всей работе, которую мы проделали в случае 1.

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.13.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.13.1</version>
</dependency>

С помощью Lombok очень легко внедрить регистратор аннотация @Slf4j.

@Path("/authentication")
@Slf4j
public class AuthenticationService extends SpringApplication {

    private Logger logger = LogManager.getLogger(AuthenticationService.class);

    @Path("/greet")
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public Response greet(){
        log.info("Welcome to Tarkshala Scholar APIs");
        log.error("THis is error log");
        log.debug("THis is debug log");
        return getBean(AuthenticationServiceHandler.class).greet();
    }
}

Lombok заботится о инициализации и внедрении экземпляра регистратора (log объекта) в класс.

И это все. Рад помочь :) 1046

...