【问题标题】:@SLF4J : How to configure lombok supported slf4j@SLF4J:如何配置 lombok 支持的 slf4j
【发布时间】:2020-07-18 11:22:52
【问题描述】:

我有一个使用 Lombok 的内置 @Slf4j 记录日志的 maven 项目。目前我的日志在控制台中可见,如下所示

    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

pom.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();
    }
}

我有几个问题:

  • 语句格式,它应该在方括号[]中包含时间。
  • 日志没有添加到配置中给出的文件中,事实上我相信配置不是从文件中挑选出来的。

不知道我到底错过了什么。任何帮助/提示表示赞赏。

【问题讨论】:

  • 你能添加你的主类吗?
  • 这是一个 web 应用,集合了 jersey restful api。所以我真的无法理解你的问题。
  • 因为查看应用程序的配置方式很有用。你应该有这样一行 "PropertyConfigurator.configure("path_to_my_log4j_properties");"
  • @StefanoCurcio webapps 在 servlet 中没有 Main 类。事实上,主类位于 webserver/servlet-container 更深处的某个地方(就像我的例子中的 tomcat)。是的,有一个名为 Application 的类,它可以被视为 servlet 的网关或将在部署 servlet 时调用的类。希望对您有所帮助。

标签: java logging slf4j lombok


【解决方案1】:

通过官方apache manual page.自己想通了

我会将整个答案分为以下两个部分

1. Jersey2 Maven Webapp 的 Log4j2 设置

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

在 web.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,因为扫描类路径中的配置会自动选择它,否则需要 web.xml 中的几行来设置配置文件路径。而且不仅仅是名称,配置文件必须放在web.xml所在的WEB-INF目录中。

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

上面给出的配置包含两种类型的记录器,第一种用于控制台,第二种用于文件。也可以为单个记录器指定日志级别。有关日志模式等更多信息,请遵循 apache 手册page

最后一点是在java类中使用logger。 Logger 可以被注入到 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();
    }
}

做了这么多的甜蜜结果看起来像这样


这很好用,但是通过在每个类中初始化实例来注入 Logger 很烦人,所以为了节省一些工作,Slf4j 可以提供帮助。 Slf4j 只是一个外观(抽象层),其背后是一个实际的日志框架(如 Log4j、Java 的内置 util.Logger 和 Logback 等)。因此,如果将来出现更好的日志记录框架,那么我们将不必接触已实例化记录器的 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 注入 logger 非常容易。

@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 对象)并将其注入到类中。

就是这样。乐于助人:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-31
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多