log4j简介

日志的作用

  • 可分析程序执行过程,便于调试
  • 可将业务数据存储到文件、数据库,便于后期分析
     

log4j是一个功能强大的日志框架

  • 可以将日志信息输出到控制台、文件、GUI 组件、数据库中
  • 可以指定日志输出格式

 

log4j的日志级别

一共七种,从高到低依次为

  • OFF 最高日志级别,即关闭日志
  • FATAL  导致应用程序退出的错误
  • ERROR 运行发生错误,但不影响程序继续运行
  • WARN
  • INFO
  • DEBUG
  • ALL

一般只使用4个级别,从高到低为 ERROR > WARN > INFO > DEBUG

 

log4j的组成

log4j 主要由三部分组成

1、Loggers  日志记录器

控制是否输出日志、日志输出级别

 

2、Appenders  输出端

指定日志输出终端

  • ConsoleAppender 控制台

  • FileAppender 文件

  • JDBCAppender 数据库

  • RollingFileAppender 文件,可指定文件最大尺寸,当文件大小达到指定最大尺寸时,会创建一个新文件来保存日志

#指定单个日志文件的最大尺寸
MaxFileSize = 2KB

#指定最大备份数(日志文件最多允许保留多少个)
MaxBackupIndex = 5
  • DailyRollingFileAppender 文件,将特定时间段输出到一个新的文件
#指定输出周期,将一周的日志输出到一个文件中
DatePattern='.'yyyy-ww 

yyyy-MM 每月
yyyy-ww 每周
yyyy-MM-dd 每天
yyyy-MM-dd-a 每天两次
yyyy-MM-dd-HH 每小时
yyyy-MM-dd-HH-mm 每分钟

 

3、Layout 日志格式化器

用于指定日志输出格式

  • HTMLLayout html表格
  • SimpleLayout 简单格式
  • PatternLayout 可自定义日志输出格式
     

PatternLayout使用占位符指定格式,常用的占位符如下

  • %m 代码中指定的日志信息
  • %p 日志级别,eg. DEBUG、INFO
  • %n 换行
  • %c 所在类的类名
  • %t 所在的线程名
    • %F 所在文件的文件名
  • %L 所在行号
  • %l 所在位置,类名+线程名+文件名+行号,eg. UserService.main(UserService.java:10)
  • %d 服务器当前时间,可在{ }中指定时间格式,eg. %d{yyyy年MM月dd日 HH:mm:ss}
  • %% 输出一个 %

可指定宽度、对齐方式,eg

  • %5p 宽度是5,字符个数小于5时,右对齐
  • %-5p 左对齐

 

log4j的使用

依赖

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

<!-- 如果是在其它框架中使用log4j,往往需要引入commons-logging -->
<!-- commons-logging是日志接口,log4j是其中的一种实现 -->
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>

 

log4j.properties

### 日志记录器Logger的全局设置,最低级别指定为DEBUG ###
log4j.rootLogger = DEBUG,stdout,D,E


### 输出到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
#输出级别
log4j.appender.stdout.Threshold = DEBUG
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n


### 输出到文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File =D://log/debug/debug.log 
log4j.appender.D.Append = true
#输出级别
log4j.appender.D.Threshold = ERROR
log4j.appender.D.DatePattern='.'yyyy-ww
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

 

在java代码中输出日志

class Xxx{
    // 获取当前类的Logger对象,注意导入的Logger是log4j中的
    private static Logger logger = Logger.getLogger(Xxx.class);

    public void xxx() {
        logger.info("xxx");
        logger.warn("xxx");
        logger.error("xxx");
    }

}

 

附:slf4j的使用

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.30</version>
</dependency>
// 这个Logger导入的是slf4j中的类
private static Logger logger = LoggerFactory.getLogger(Xxx.class);