日志工具——slf4j

一、概述

  简单日记门面(simple logging Facade for java)SLF4J是为各种loging APIs提供一个简单统一的接口,从而使得最终用户能够在部署的时候配置自己希望的loging APIs实现。

  百度百科:

  SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志System

  为什么使用slf4j:

    我们在开发过程中可能使用各种log,每个Log有不同的风格、布局,如果想灵活的切换那么slf4j是比较好的选择。

二、入门程序

  引入依赖: 

    <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.2</version>
        </dependency>

  这样我们的依赖中就会多出3个jar,分别是:

  引入配置文件:

   这里我们结合的是log4j,所以引入Log4j的的配置文件在当前classpath下:log4j.properties

复制代码
#   可设置级别:TRACE→DEBUG→INFO→WARNING→ERROR→FATAL→OFF
#   高级别level会屏蔽低级别level。
#   debug:显示debug、info、error
#   info:显示info、error

#log4j.rootLogger=DEBUG,console,file
log4j.rootLogger=INFO,console


#输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
#设置输出样式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
#日志输出信息格式为
log4j.appender.console.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n

#输出到文件(这里默认为追加方式)
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=F:/LinkinPark/logs/Log4J.log
#样式为TTCCLayout
#log4j.appender.file.layout=org.apache.log4j.TTCCLayout

#自定义样式
#%c 输出所属的类目,通常就是所在类的全名
#%C 输出Logger所在类的名称,通常就是所在类的全名
#%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},%d{ABSOLUTE},%d{DATE}
#%F 输出所在类的类名称,只有类名。
#%l 输出语句所在的行数,包括类名+方法名+文件名+行数
#%L 输出语句所在的行数,只输出数字
#%m 输出代码中指定的讯息,如log(message)中的message
#%M 输出方法名
#%p 输出日志级别,即DEBUG,INFO,WARN,ERROR,FATAL
#%r 输出自应用启动到输出该log信息耗费的毫秒数
#%t 输出产生该日志事件的线程名
#%n 输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n”
#%% 用来输出百分号“%”
#log4j.appender.Linkin.layout.ConversionPattern=%n[%l%d{yy/MM/dd HH:mm:ss:SSS}][%C-%M] %m
#log4j.appender.Linkin.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}[%C]-[%p] %m%n
#log4j.appender.Linkin.layout.ConversionPattern = %d{ABSOLUTE} %5p %t %c{2}:%L - %m%n
View Code
复制代码

   编码测试代码:

    初始化logger的方式不一样了:

 private static final Logger log = LoggerFactory.getLogger(LogTest.class);

   //之前的方式:public static Logger log = Logger.getLogger(LogTest.class);

    log的输出日志的写法也稍有不同(下节讲解):

     log.info("info...{}", "info...");
        log.warn("warn...{}", age);

  完整测试代码如下:

复制代码
package com.log;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 日志测试类
 * 作者: Administrator
 * 日期: 2017/9/20
 **/
public class LogTest {
    // 获取日志对象
    private static final Logger log = LoggerFactory.getLogger(LogTest.class);
    private static Integer age = 18;
    private static String name = "Alice";
    public static void log() {
        log.debug("debug....{}", "debug...");
        log.info("info...{}", "info...");
        log.warn("warn...{}", age);
        log.error("error...{}", name);
        try {
            int i = 10 / 0;
        } catch (Exception e) {
            log.error(e.getMessage());
        }
    }

    public static void main(String[] args) {
        log();
    }
}
复制代码

  结果:

  

  入门程序参考自http://blog.csdn.net/anialy/article/details/8529188

三、slf4j的格式

  由于log4j的拼接字符串的形式,无论从性能上或者从优雅性上,都难以满足,所以,我们强烈推荐使用slf4j来进行日志记录!

  使用log4j输出程序中参数变量的日志写法大概是这样的: 

if (logger.isDebugEnabled()) {
    logger.debug("Processing trade with id: " + id + " symbol: " + symbol);
}

  切换为slf4j后:

logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);

  可以看到,通过使用大括号 {} 来占位,再通过参数的传入来避免了拼接字符串的性能与代码优雅性问题,同时省去了麻烦的isInfoEnabled()的判断

   当然,slf4j日志还有一些重载方法,可参见API!

  大括号 {} 对应若是POJO类等应当重写toString()方法

 

 

实例:在resource目录下新建lo4j.properties:

 

复制代码
log4j.rootLogger=INFO, stdout
log4j.logger.com=INFO,stdout
log4j.logger=INFO,stdout
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} [%c]-[%p] %m%n


# Parquet related logging
log4j.logger.org.apache.parquet.CorruptStatistics=ERROR
log4j.logger.parquet.CorruptStatistics=ERROR
复制代码

 

`Log4j.properties` 是 Apache Log4j 日志框架的配置文件,用于定义日志记录的行为,如日志级别、输出目标和格式等。下面将详细解释您提供的 `Log4j.properties` 文件中的每一项配置,并说明它们的作用。

### 配置文件解析

```properties
log4j.rootLogger=INFO, stdout
```
- **含义**: 设置根日志记录器(root logger)的日志级别为 `INFO`,并且指定日志消息应发送到名为 `stdout` 的Appender。
- **作用**: 根日志记录器是所有其他日志记录器的默认继承者,除非另有指定。这里表示全局的日志记录级别是 `INFO`,意味着只记录 `INFO` 级别及其以上(如 `WARN`, `ERROR`, `FATAL`)的日志信息,并且这些信息会输出到控制台。

```properties
log4j.logger.com=INFO,stdout
```
- **含义**: 为所有以 `com` 开头的包设置日志级别为 `INFO`,并将日志输出到 `stdout` Appender。
- **作用**: 这行配置特别针对 `com` 包下的类进行日志记录。例如,如果你的应用程序中有一些类位于 `com.example` 或 `com.myapp` 包下,那么这些类的日志行为将遵循此规则。

```properties
log4j.logger=INFO,stdout
```
- **含义**: 这一行配置实际上是多余的或无效的,因为它没有指定具体的日志记录器名称。通常情况下,应该明确指出要配置的日志记录器,比如上面的 `com` 或特定的包名/类名。
- **建议移除**: 为了避免混淆,最好删除这一行,因为它的存在不会对日志行为产生实际影响。

```properties
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
```
- **含义**: 定义了一个名为 `stdout` 的Appender,类型为 `ConsoleAppender`。
- **作用**: `ConsoleAppender` 是一种将日志输出到控制台的组件。这意味着所有配置为使用 `stdout` Appender 的日志记录器都会将日志打印到控制台上。

```properties
log4j.appender.stdout.Target=System.out
```
- **含义**: 指定 `stdout` Appender 的目标为 `System.out`。
- **作用**: 确保日志信息被写入标准输出流(通常是终端窗口)。这与直接输出到控制台的效果相同,但在某些环境中可能需要显式地指定这一点。

```properties
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
```
- **含义**: 为 `stdout` Appender 指定布局(Layout),即日志消息的格式化方式,这里使用的是 `PatternLayout`。
- **作用**: `PatternLayout` 允许通过模式字符串来定制日志输出的格式,提供灵活的日志展示选项。

```properties
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
```
- **含义**: 定义了 `PatternLayout` 的转换模式(Conversion Pattern),具体格式如下:
- `%d{yyyy-MM-dd HH:mm:ss}`: 时间戳,格式为年-月-日 小时:分钟:秒。
- `[%c]`: 日志记录器名称(logger name)。
- `[%p]`: 日志级别(如 `DEBUG`, `INFO`, `WARN`, `ERROR`, `FATAL`)。
- `%m`: 实际的日志消息内容。
- `%n`: 换行符,确保每条日志记录在新的一行开始。
- **作用**: 这个模式定义了日志输出的具体格式,使得日志更易于阅读和理解。

### Parquet 相关日志配置

```properties
# Parquet related logging
log4j.logger.org.apache.parquet.CorruptStatistics=ERROR
log4j.logger.parquet.CorruptStatistics=ERROR
```
- **含义**: 对于 `org.apache.parquet.CorruptStatistics` 和 `parquet.CorruptStatistics` 类别,仅记录 `ERROR` 级别的日志。
- **作用**: 特别针对 Parquet 文件中的统计信息损坏情况,限制日志级别为 `ERROR`。这有助于减少不必要的警告信息,专注于严重的问题。注意:重复配置同一日志记录器是多余的,可以保留其中一个即可。

### 总结

这个 `Log4j.properties` 文件主要配置了日志记录的全局行为,包括日志级别、输出目的地以及日志格式。它还专门调整了 Parquet 库的日志记录策略,以避免过多的非致命性警告信息干扰正常的日志输出。对于大多数应用程序来说,这样的配置能够有效地管理和优化日志记录过程。如果不需要额外的日志过滤或特殊处理,可以考虑简化部分配置,比如移除冗余的日志记录器定义。

 

posted @   ---江北  阅读(642)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
TOP
点击右上角即可分享
微信分享提示

目录导航