1 简介

日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录。在apache网站:jakarta.apache.org/log4j 可以免费下载到Log4j最新版本的软件包。

Log4j(别名: log for java)是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

2 Log4j 基础知识

2.1 组件构成

Log4j由三个重要的组件构成:

  • 日志信息的优先级
  • 日志信息的输出目的地
  • 日志信息的输出格式。

2.2 日志信息的优先级

日志信息的优先级从高到低有: ERRORWARNINFODEBUG,分别用来指定这条日志信息的重要程度;日志信息的输出目的地指定了日志将打印到控制台还是文件中;而输出格式则控制了日志信息的显 示内容。

2.3 定义配置文件

其实您也可以完全不使用配置文件,而是在代码中配置Log4j环境。但是,使用配置文件将使您的应用程序更加灵活。Log4j支持两种配置文件格式

  • XML格式的文件[.xml]
  • Java特性文件[.properties](键=值)

下面我们介绍使用log4j.properties文件做为配置文件的方法:

1. 配置 Root Logger,其语法为:

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

其中:

  • level : 日志记录的优先级,分为OFFFATALERRORWARNINFODEBUGALL或您定义的级别。

    Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG

    通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定 义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。
  • appenderName: 就是指B日志信息输出到哪个地方。您可以同时指定多个输出目的地。

2. 配置日志信息输出目的地Appender,其语法为:

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

log4j.appender.appenderName.option = valueN

各类日志管理工具或开源工具(Eg: Log4JLogbackSkywalking等)提供的Appender可见:

[J2EE:中间件]LOG4J+Slf4J快速入门 # 输出源[Appender] - 博客园/千千寰宇

3. 配置日志信息的格式(布局),其语法为:

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

log4j.appender.appenderName.layout.option = valueN

其中,Log4j提供的layout有以e几种:

org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

4. 日志格式化问题

Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下: %m 输出代码中指定的消息

%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)
log信息耗费的毫秒数

2.3 在代码中使用Log4j

1. 得到记录器/日志器(Logger)

使用Log4j,第一步就是获取日志记录器,这个记录器将负责控制日志信息。其语法为:

public static Logger getLogger( String name)

通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。Name一般取本类的名字,比如:

static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )

2. 读取配置文件

当获得了日志记录器之后,第二步将配置Log4j环境,其语法为:

BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。
PropertyConfigurator.configure ( String configFilename) :读取使用Java的特性文件编写的配置文件。
DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。

3. 插入记录信息(格式化日志信息)

当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,其语法如下:

Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;

[可选] 4. LogManager: 动态设置Logger的日志等级

import org.apache.log4j.LogManager;

Strig loggerName = "root";

org.apache.log4j.Logger logger = loggerName.equalsIgnoreCase("ROOT")?LogManager.getRootLogger() : LogManager.getLogger(loggerName);
logger.setLevel( Level.toLevel( loggersConfig.getLogLevel() ) );

2.4 日志级别

每个Logger都被了一个日志级别(log level),用来控制日志信息的输出。日志级别从高到低分为:

A:off 最高等级,用于关闭所有日志记录。
B:fatal 指出每个严重的错误事件将会导致应用程序的退出。
C:error 指出虽然发生错误事件,但仍然不影响系统的继续运行。
D:warm 表明会出现潜在的错误情形。
E:info 一般和在粗粒度级别上,强调应用程序的运行全程。
F:debug 一般用于细粒度级别上,对调试应用程序非常有帮助。
G:all 最低等级,用于打开所有日志记录。

上面这些级别是定义在org.apache.log4j.Level类中。Log4j只建议使用4个级别,优先级从高到低分别是error,warn,info和debug。通过使用日志级别,可以控制应用程序中相应级别日志信息的输出。例如,如果使用b了info级别,则应用程序中所有低于info级别的日志信息(如debug)将不会被打印出来。

3 案例讲解

3.1 新建Java工程,并引入 Log4j JAR包

新建一个 JAVA 工程,导入包log4j-*.jar,整个工程最终目录如下:


以 Mave 方式引入JAR包为例:

3.1.1 Maven(pom.xml):JAR包依赖

<!-- 日志 -->
<!-- Slf<Simple Logging Facade For Java> + Log4J -->
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<!-- slf4j与log4j的整合jar包 : 其将自动引入其log4j-1.2.17.jar -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>

除了上面这种方式外,也可以:(不推荐 / 非基于 Slf4j 的方式)

<!-- 加入log4j支持 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

3.1.2 Maven(pom.xml):build(自动构建)

<build>
<!-- ↓解决问题↓:IDEA的Maven不会编译src/java目录的xml文件 在Mybatis的配置文件中找不到xml文件 -->
<!-- 在pom文件中新加<build>提示编译器:src/java下存在配置文件-->
<!-- 资源目录 -->
<resources>
<resource>
<!-- 设定主资源目录 -->
<directory>src/main/java</directory>
<!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,只处理如下配置中包含的资源类型 -->
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,不处理如下配置中包含的资源类型(剔除下如下配置中包含的资源类型)-->
<excludes>
<exclude>**/*.yaml</exclude>
</excludes> <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,指定处理后的资源文件输出目录,默认是${build.outputDirectory}指定的目录-->
<!--<targetPath>${build.outputDirectory}</targetPath> --> <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,是否对主资源目录开启资源过滤 -->
<filtering>true</filtering>
</resource>
</resources>
</build>

3.2 配置文件: log4j.properties

###########################################################################################
# 注意事项:
# 1 出现此类异常的可能原因
# [异常信息]↓
# log4j:WARN No appenders could be found for logger (org.example.XXXXTest).
# log4j:WARN Please initialize the log4j system properly.
# log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
# [原因/方案]
# 1)【根前缀】必须是 log4j,而非log。
# 2)构建/编译后的target/classes目录下是否存在 【log4j[2].properties/xml】文件
########################################################################################### ### Global logging configuration ###
####################################
### 根日志器(rootLogger) : 新的使用名称,对应Logger类 ###
# 配置: (继承的)子日志器的默认日志级别 + 自定义的日志输出源(Appender)
# 日志级别: OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL
# 自定义的输出源: CONSOLE, stdout, logfile, 其他自定义名字
# 示例:
# log4j.rootLogger=ERROR,file,stdout 表示,日志级别为ERROR的日志输出到控制台(stdout)和file中
log4j.rootLogger=ALL, stdout, ERROR_FILE ### 根目录(rootCategory) : 旧的使用名称,对应原来的Category类 ###
#log4j.rootCategory=ERROR, LOGFILE
### log4j.category.* : 对自定义类的设置,可对类、包和工程单独设置
#log4j.category.org.springframework=error
#log4j.category.org.apache=error ### 日志器继承状态 additivity
# 意义: 子Logger是否继承父Logger的输出源[appender]的标志位
# 默认: [true]子Logger会继承父Logger的appender (即 子Logger会在父Logger的appender里输出)
log4j.additivity=false
#log4j.additivity.com.example.user.service=false ### 配置: 具体Java包的日志级别 ###
################################
log4j.logger.org.apache=INFO
log4j.logger.org.springframework=warn
log4j.logger.org.hibernate=ERROR
# mybatis
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
# sql
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG ### 配置: 输出源 ###
###################
### 控制台(ConsoleAppender) ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
# ↓Threshold=WARN:指定日志信息的最低输出级别,默认DEBUG
log4j.appender.stdout.Threshold=DEBUG
# ↓Target=System.err:默认值是System.out,可选值:System.err / System.out / ...
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] [%l] - %m%n ### 文件(org.apache.log4j.FileAppender) ###
# org.apache.log4j.DailyRollingFileAppender(特有属性:datePattern / 可实现每天单独产生1个日志文件)
# [extends FileAppender]
# org.apache.log4j.RollingFileAppender(特有属性:MaxBackupIndex / MaxFileSize)
# [extends FileAppender]
log4j.appender.ERROR_FILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ERROR_FILE.name=LogDemo_File
# ↓Threshold=WARN:指定日志信息的最低输出级别,默认DEBUG
log4j.appender.ERROR_FILE.Threshold=ERROR
# ↓ D:/project.log | ../logs/logs.log | /example.log[项目根目录] | example.log[classes目录下]
log4j.appender.ERROR_FILE.File=logs/error.log
log4j.appender.ERROR_FILE.Encoding=UTF-8
log4j.appender.ERROR_FILE.Append=true
log4j.appender.ERROR_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ERROR_FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] [%l] - %m%n
# ↓Keep one backup file
#log4j.appender.FILE.MaxBackupIndex=5 [org.apache.log4j.RollingFileAppender 特有属性]
#log4j.appender.FILE.MaxFileSize=100KB [org.apache.log4j.RollingFileAppender 特有属性]
log4j.appender.ERROR_FILE.DatePattern='_'yyyy-MM-dd-HH'.log'

3.3 测试:开发Java类,并在执行方法的过程中打印各级别的日志

  • /test/java/example/AppTest.java
package org.example;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
// import org.apache.log4j.Logger; /**
* @project: LogDemo20200604
* @author: 千千寰宇
* @date: 2020/6/4 13:55:47
* @description: ...
*/ public class AppTest {
private final static Logger LOGGER = LoggerFactory.getLogger(AppTest.class); public static void main(String[] args) {
LOGGER.debug("Hello log! - start");
System.out.println("执行ing! - [AppTest.testLog]");
LOGGER.info("Hello log! - end");
} @Test
public void testOpenFile(){
// BasicConfigurator.configure(); //自动快速地使用缺省Log4j环境
openFile("356326");
} public static void openFile(String filePath) {
File file = new File(filePath);
try {
InputStream in = new FileInputStream(file);
} catch (FileNotFoundException e) {
//e要放在{}参数之外,而且只能放在最后一个。如果放在中间也不会被打印错误信息:
LOGGER.error("can found file [{}]", filePath, e);
}
}
}
①main测试


②Test测试(项目中更为实用)

4 样例集

避免赘述,参见本博主的另一文章的章节: [J2EE:中间件]LOG4J+Slf4J快速入门 # 5 实际项目开发中的日志应用

X 参考文献

[J2EE:中间件]LOG4J及配置文件(log4j.properties)详解的更多相关文章

  1. SpringBoot配置文件 application.properties详解

    SpringBoot配置文件 application.properties详解   本文转载:https://www.cnblogs.com/louby/p/8565027.html 阅读过程中若发现 ...

  2. SpringBoot配置文件application.properties详解

    喜欢的朋友可以关注下,粉丝也缺. 相信很多的码友在接触springboot时,不知道怎么去配置一些项目中需要的配置,比如数据源,tomcat调优,端口等等,下面我就给大家奉献出一些项目中常用的配置信息 ...

  3. Quartz的配置文件quartz.properties详解

    配置 quartz.properties 文件 文件 quartz.properties 定义了 Quartz 应用运行时行为,还包含了许多能控制 Quartz 运转的属性.这个文件应该放在class ...

  4. log4j.properties 详解与配置步骤(转)

    找的文章,供参考使用 转自 log4j.properties 详解与配置步骤 一.log4j.properties 的使用详解 1.输出级别的种类 ERROR.WARN.INFO.DEBUGERROR ...

  5. 【配置】log4j.properties 详解与配置步骤

    一.Log4j基本使用方法 Log4j由三个重要的组件构成:[日志信息的优先级],[日志信息的输出目的地],[日志信息的输出格式]. 日志信息的优先级从高到低有ERROR.WARN. INFO.DEB ...

  6. 《手把手教你》系列基础篇(八十六)-java+ selenium自动化测试-框架设计基础-Log4j实现日志输出(详解教程)

    1.简介 自动化测试中如何输出日志文件.任何软件,都会涉及到日志输出.所以,在测试人员报bug,特别是崩溃的bug,一般都要提供软件产品的日志文件.开发通过看日志文件,知道这个崩溃产生的原因,至少知道 ...

  7. Mybatis系列全解(四):全网最全!Mybatis配置文件XML全貌详解

    封面:洛小汐 作者:潘潘 做大事和做小事的难度是一样的.两者都会消耗你的时间和精力,所以如果决心做事,就要做大事,要确保你的梦想值得追求,未来的收获可以配得上你的努力. 前言 上一篇文章 <My ...

  8. Maven配置文件setting.xml详解

    注:本文来源于:大话JAVA的那些事 <Maven配置文件setting.xml详解> <?xml version="1.0" encoding="UT ...

  9. Mybatis Generator配置文件完整配置详解

    完整的Mybatis Generator(简称MBG)的最完整配置文件,带详解,再也不用去看EN的User Guide了 可以搭配着mybatis generator的中文文档看:http://mbg ...

  10. Maven全局配置文件settings.xml详解(转)

    Maven全局配置文件settings.xml详解   目录 一.概要 1.settings.xml的作用2.settings.xml文件位置3.配置的优先级 二.settings.xml元素详解 1 ...

随机推荐

  1. sat初学入门资料2022-12

    1. GlueMiniSatPPT-nabeshima.pdf A fast SAT solver with an aggressive acquiring strategy of glue clau ...

  2. Vue修改

    今天做的是一个Vue的修改操作: Vue主要是用来做视图来显示数据的,理解起来的话可能比较困难,学了好几天了,才刚摸到一点头绪,还是需要努力

  3. 自动备份一个TXT文件里面的SVN库

    之前的项目都是使用SVN进行代码管理,万一SVN挂了,,,项目全部爆炸,,,所以定时备份还是有必要的,,,虽然现在都不用SVN了,,,记录一下自己的备份方法 --------------------- ...

  4. java: javacTask: 源发行版 8 需要目标发行版 1.8

    idea同一工作空间中不同工程使用不同的jkd版本.在本地idea同时使用jdk1.7和jdk1.8,不同的java工程使用不同的jdk版本,但是在java代码编译时报错,其报错信息为:[java: ...

  5. HTML笔记(一) HTML相关概念

    一 HTML概述 1.HTML文档基本结构 先来看一个关于HTML的例子,里面包含了几个主要的HTML标签: <!DOCTYPE html> <html> <head&g ...

  6. 自定义DOM事件函数封装

    非原生DOM触发,个性化定制的自定义事件. currentTarget(DOM对象):要触发事件的元素节点. type(字符串):触发的事件类型,例如"keydown". bubb ...

  7. 文本的格式化标签(粗体,斜体)和 <div>和<span>标签(都是双标签)

    上一个笔记有提到各种型号的标题,为了保证文章的美观,又会有除了标题之外的东西,比如粗体,斜体,下划线,删除线和各种分隔 1加粗,<strong><strong/>或者<b ...

  8. mybatis源码-注解sql

    Mybatis-注解sql Demo 主启动类 public class MybatisHelloWorld { public static void main(String[] args) thro ...

  9. 关于lambda的由来

    总结lambda表达式的本质就是匿名方法,根据委托推断类型 class Program { static void Main(string[] args) { //泛型委托 最后一个是返回值 Acti ...

  10. vuex记录状态

    // actions import { queryProductDetailsById } from '../service' /* * 异步 */ export const addAndGetPro ...