Java学习笔记——Log4j配置与Spring中使用Log4j

Java日志记录

一、简介

       在开发过程中做好日志记录是必不可少的一部分。在线上追踪问题,分析业务逻辑快速定位错误原因,精准解决问题必离不开日志。Java中实现这一功能的狂爱很多,目前常用的有Log4j1、Log4j2、Commons Logging、Slf4j等等。

 

1、常用框架简介

  1. Log4j:Log4j是Apache的一个开源项目,通过Log4j,可以通过配置文件精细控制日志的生成过程。
  2. Log4j2: Apache Log4j 2是对Log4j的升级,它比其前身Log4j 1.x提供了重大改进,并提供了Logback中可用的许多改进,同时修复了Logback架构中的一些固有问题。

“Apache Log4j 2 is an upgrade to Log4j that provides significant improvements over its predecessor, Log4j 1.x, and provides many of the improvements available in Logback while fixing some inherent problems in Logback’s architecture.”

—— logging.apache.org

  1. Commons Logging:Apache基金会所属的项目,是一套Java日志接口,之前叫Jakarta Commons Logging,后更名为Commons Logging。
  2. Sl4j:Simple Logging Facade for Java(SLF4J)用作各种日志框架(例如java.util.logging,logback,log4j)的简单外观或抽象,允许最终用户在部署 时插入所需的日志记录框架。

“The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks (e.g. java.util.logging, logback, log4j) allowing the end user to plug in the desired logging framework at deployment time.”

—— slf4j.org

2、框架关系

       Log4j和Log4j2是包含了日志系统的实现和一套完整的接口。

       Commons Logging和Slf4j都是日志门面接口(Logging Façade),在使用过程中,只需要调用对应接口,底层的日志系统实现可以选择Log4j或Java自带的日志类(JUL).

 

二、Spring框架中使用Log4j

       在Spring框架中实现了Commons Logging,所以配合Log4j实现日志记录。

1、使用导入日志jar包

<!—版本定义在pom.xml文件开头 -->

<log4jVersion>1.2.17</log4jVersion>

<!-- log4j配置, 视情况添加 -->

    <dependency>

      <groupId>log4j</groupId>

      <artifactId>log4j</artifactId>

      <version>${log4jVersion}</version>

</dependency>

 

2、编写配置文件

Log4j 的配置文件可在官方网站查找到模板,若使用Eclipse,可以查找到由Eclipse生成的Log4j.properties文件(Eclipse安装根目录下搜索即可)。

以下是Eclipse生成的Log4j.properties文件;

# Set root category priority to INFO and its only appender to CONSOLE.

log4j.rootCategory=INFO, CONSOLE

#log4j.rootCategory=INFO, CONSOLE, LOGFILE

 

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.

log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

 

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender

log4j.appender.CONSOLE.Threshold=INFO

log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout

log4j.appender.CONSOLE.layout.ConversionPattern=- %m%n

 

# LOGFILE is set to be a File appender using a PatternLayout.

log4j.appender.LOGFILE=org.apache.log4j.FileAppender

log4j.appender.LOGFILE.File=axis.log

log4j.appender.LOGFILE.Append=true

log4j.appender.LOGFILE.Threshold=INFO

log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout

log4j.appender.LOGFILE.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

 

       以下是参考官方样例,进行了一些修改的配置文件:

og4j.rootLogger = debug,Console,D,E

#控制日志的输出等级和分类

# log4j.rootLogger = [ level ] , appenderName, appenderName, …

 

#一下是对日志输出方式的不同控制

### 输出信息到控制抬 ###

log4j.appender.Console = org.apache.log4j.ConsoleAppender

log4j.appender.Console.Target = System.out

log4j.appender.Console.Append = true

log4j.appender.Console.Threshold = INFO

log4j.appender.Console.layout = org.apache.log4j.PatternLayout

log4j.appender.Console.layout.ConversionPattern= [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

 

### 输出DEBUG 级别以上的日志到服务器/logs/debug.log ###

log4j.appender.D = org.apache.log4j.DailyRollingFileAppender

log4j.appender.D.File = ${webapp.root}/logs/debug.log

log4j.appender.D.Append = true

log4j.appender.D.Threshold = DEBUG

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

 

### 输出ERROR 级别以上的日志到服务器/logs/error.log ###

log4j.appender.E = org.apache.log4j.DailyRollingFileAppender

log4j.appender.E.File = ${webapp.root}/logs/error.log

log4j.appender.E.Append = true

log4j.appender.E.Threshold = ERROR

log4j.appender.E.layout = org.apache.log4j.PatternLayout

log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%nl

 

       在web.xml中添加监听器:

  <context-param>

    <param-name>log4jConfigLocation</param-name>

    <param-value>classpath:log4j-config.properties</param-value>

  </context-param>

 

  <listener>

    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>

  </listener>

 

3、记录日志和查看日志

import org.apache.log4j.Logger;

 

//获取Logger实体类,this.class 代表当前 类名.class

    private static Logger logger= Logger.getLogger(this.class);

       调用方法:

查看控制台输出结果:

在项目目录中的target文件目录,查看debug.log和error.log文件

 

 

三、Log4j配置文件详解

       Log4j配置文件主要由三部分构成:日志信息优先等级、日志信息输入目的地、日志文件输出格式。

       日志信息优先等级从高到底分为:

ALL = TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF

       官方建议一般使用DEBUG、INFO、WARN、ERROR四个等级即可。

1、配置根Logger

log4j.rootLogger = [ level ] , appenderName, appenderName, …

此处的第一项即日志优先等级,appenderName则作为输入目的地的标记。

  1. 配置appenderName,控制输出位置与格式

log4j.appender.appenderName = fully.qualified.name.of.appender.class 

log4j.appender.appenderName.option1 = value1 

log4j.appender.appenderName.option = valueN

       appender的实现类Log4j提供了一下几种:

org.apache.log4j.ConsoleAppender(控制台)

org.apache.log4j.FileAppender(文件)

org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件), 

org.apache.log4j.RollingFileAppender(文件大小到达指定值产生一个新的文件)

org.apache.log4j.WriterAppender(将日志信息以流格式输出到指定的位置)

       appender的格式控制根据以下格式:

log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class 

log4j.appender.appenderName.layout.option1 = value1 

… 

log4j.appender.appenderName.layout.option = valueN

       Log4j中支持的layout有以下几种:

org.apache.log4j.HTMLLayout(以HTML表格形式布局)

org.apache.log4j.PatternLayout(可以灵活地指定布局模式)

org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)

org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息)

       在使用ParrernLayout的方式定制输出格式时候,类似于C语言printf函数,参数使用%()作为占位符:

%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL 

%r 输出自应用启动到输出该log信息耗费的毫秒数 

%c 输出所属的类目,通常就是所在类的全名 

%t 输出产生该日志事件的线程名 

%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n” 

 

%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 

 

%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)

 

发布了29 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42404727/article/details/88614581