2年前 (2022-01-14)  相关技术 |   抢沙发  714 
文章评分 0 次,平均分 0.0

如果您曾经不得不分析生产中的问题,我相信您知道良好的日志记录是多么重要。良好的日志记录需要三件事:

  • 日志消息需要提供所需的信息,以了解应用程序在内部执行的操作。
  • 编写日志消息必须尽可能高效,这样才能不影响应用程序的性能。
  • 您需要能够根据不同的部署环境和情况调整日志详细信息。

虽然您仍然需要自己决定应该为每个用例编写哪些日志消息,但您不需要担心需求2和需求3。各种日志框架已经解决了这些技术需求。您只需要选择其中一个,并使用它来编写日志消息。

为了让它变得更好,SLF4J提供了一个标准化的API,大多数框架都以某种方式实现了该API。这使您能够在不更改代码的情况下更改日志框架。您只需要将依赖关系更改为实现SLF4J接口的不同框架。

使用SLF4J写入日志消息

使用SLF4J编写日志消息非常简单。首先需要调用LoggerFactory上的getLogger方法来实例化一个新的Logger对象。然后可以调用记录器上的debug、info、warning、errorfatal方法之一,以编写具有相应日志级别的日志消息。在这里,您可以看到一个典型示例:

public class MyClass { 
    Logger log = LoggerFactory.getLogger(this.getClass().getName());
 
    public void myMethod() { 
        log.info("This is an info message"); 
        // ... 
    } 
}

因此,如果这些框架很容易互换,您应该选择哪一个?

这个问题的答案并不像你想象的那么简单。Java世界中广泛使用了几种可用的框架。在本文中,我想向您介绍Log4j及其两个继承者Logback和Log4j2

Apache Log4J

ApacheLog4J是一个非常古老的日志框架,是几年来最流行的日志框架。它介绍了一些基本概念,如分层日志级别和日志记录器,这些概念仍然被现代日志框架使用。

开发团队在2015年宣布了Log4j的生命终结。虽然很多遗留项目仍在使用它,但如果您启动一个新项目,您应该更喜欢本文中讨论的其他框架之一。

您可以使用我之前展示的SLF4JAPI来使用Log4j编写日志消息。因此,在讨论Logback和Log4j2之前,让我们快速了解一下所需的依赖项和配置。

必需的依赖项

如果希望在应用程序中使用Log4j,则需要添加Log4j。jar文件到您的类路径。您可以在下面的代码段中看到所需的Maven依赖项。

<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.17</version> 
</dependency>

Log4j本机不支持SLF4J。您还需要添加以下依赖项,以便能够通过标准化接口使用Log4j。

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-log4j12</artifactId> 
    <scope>test</scope> 
</dependency>

配置Log4j

除了log4j。jar文件,您需要在log4j中定义appenderlogger的日志级别。属性文件。追加器将日志消息写入目标,如文件或数据库。记录器和级别定义写入日志文件的日志消息的粒度。

下面的代码片段显示了使用Hibernate作为对象关系映射器的应用程序开发系统的典型Log4j配置。它将所有日志消息写入文件应用程序。记录日志并将常规日志级别设置为INFO。该配置还设置记录器组织的日志级别。冬眠要调试的SQL和类别组织。冬眠类型描述符。要跟踪的sql。这是Hibernate的两个记录器,它们将执行的SQL语句及其绑定参数值写入配置的文件appender。

log4j.appender.file=org.apache.log4j.FileAppender 
log4j.appender.file.File=app.log 
log4j.appender.file.layout=org.apache.log4j.PatternLayout 
log4j.appender.file.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%c] - %m%n 

log4j.rootLogger=info, file 
# basic log level for all messages 
log4j.logger.org.hibernate=info 

# SQL statements and parameters 
log4j.logger.org.hibernate.SQL=debug 
log4j.logger.org.hibernate.type.descriptor.sql=trace

基于此配置,您可以使用SLF4J API编写日志消息。

Logback

Logback由实现Log4j的开发人员编写,其目标是成为Log4j的继任者。它遵循与Log4j相同的概念,但被重写是为了提高性能、本机支持SLF4J以及实现其他一些改进,如高级过滤选项和自动重新加载日志配置。

该框架由3部分组成:

  • logback-core
  • logback-classic
  • logback-access

Logback-core提供日志框架的核心功能。Logback-classic为核心功能添加了更多功能,例如,对SLF4J的本机支持。LogbackAccess将其与servlet容器集成,以便您可以使用它编写HTTP访问日志。

必需的依赖项

您只需要定义对logback-classic的依赖关系。它可传递地包括对logback核心和SLF4J API的依赖关系。

<dependency> 
    <groupId>ch.qos.logback</groupId> 
    <artifactId>logback-classic</artifactId> 
    <version>1.2.3</version> 
</dependency>

配置Logback

Logback不需要任何配置。默认情况下,它会将调试级别或更高级别的所有日志消息写入标准输出。您可以使用XML或Groovy格式的自定义配置文件来更改这一点。

Logback使用与Log4j相同的概念。因此,毫不奇怪,即使它们使用不同的文件格式,它们的配置也非常相似。下面的代码片段显示了与我在Log4j中使用的配置相同的配置。

<configuration> 
    <appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
        <file>app.log</file> 
        <encoder> 
            <pattern>%d{HH:mm:ss,SSS} %-5p [%c] - %m%n</pattern> 
        </encoder> 
    </appender> 
    <logger name="org.hibernate.SQL" level="DEBUG" /> 
    <logger name="org.hibernate.type.descriptor.sql" level="TRACE" /> 
    <root level="info"> 
        <appender-ref ref="FILE" /> 
    </root> 
</configuration>

添加所需的依赖项并配置Logback后,可以使用它通过SLF4J API编写日志消息。因此,如果您想从Logback提供的改进中获益,您不需要更改任何代码来用Logback替换Log4j。

Apache Log4j2

Apache Log4j2是这三个框架中最年轻的一个,它的目标是通过提供自己对Log4j的改进来改进这两个框架,包括Logback中包含的一些改进,并避免Log4j和Logback的问题。

因此,与Logback一样,Log4j2支持SLF4J,自动重新加载日志配置,并支持高级过滤选项。除了这些特性之外,它还允许基于lambda表达式对日志语句进行延迟计算,为低延迟系统提供异步记录器,并提供无垃圾模式以避免垃圾收集器操作造成的任何延迟。

所有这些特性使Log4j2成为这三个日志框架中最先进、最快的。

必需的依赖项

Log4j2将其API和实现打包在两个单独的jar文件中。您可以使用log4japi实现和log4j-api.jar,您需要提供额外的log4j内核。运行时使用jar。如果要使用SLF4JAPI,还需要log4j-slf4j-impl.jar文件,其中包含两个API之间的桥梁。

<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-api</artifactId> 
    <version>2.11.1</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-core</artifactId> 
    <version>2.11.1</version> 
    </dependency> 
<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-slf4j-impl</artifactId> 
    <version>2.11.1</version> 
</dependency>

配置Log4j2

Log4j2的配置遵循与前面两个日志框架相同的原则,因此看起来非常相似。

<Configuration status="info"> 
    <Appenders> 
        <File name="FILE" fileName="app.log"> 
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
        </File> 
    </Appenders> 
    <Loggers> 
        <Logger name="org.hibernate.SQL" level="DEBUG"> 
            <AppenderRef ref="FILE"/> 
        </Logger> 
        <Logger name="org.hibernate.type.descriptor.sql" level="TRACE"> 
            <AppenderRef ref="FILE"/> 
        </Logger> 
        <Root level="info"> 
            <AppenderRef ref="FILE"/> 
        </Root> 
    </Loggers> 
</Configuration>

Log4j、Logback和Log4j2是广泛使用的良好日志框架。

 

除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/2550.html

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册