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. Redis集群模式及工作原理

    Redis有三种集群模式:主从模式.哨兵模式和集群模式. 1. 主从模式 所有的写请求都被发送到主数据库上,再由主数据库将数据同步到从数据库上.主数据库主要用于执行写操作和数据同步,从数据库主要用于执 ...

  2. IDEA2021 在jsp文件中 写out报错

    报错原因: 是因为没有关联好服务器: 解决方案 File --> Project structure --> Modules --> 选中当前的模板 --> Dependenc ...

  3. testNG框架之我见

    testNG框架中会有一个xml文件夹,里面放xml文件,之后必须要在pom文件中配置 xml文件中有一个suite,在suite中可以配置parameter参数.test用例,还可以添加listen ...

  4. 互联网架构 之备份服务器 rsync

    备份服务器(Rsync) 1.介绍备份的场景 1.什么情况下需要备份 一般数据比较重要的情况下,数据如果丢失很容易找不回来了的,建议备份. 2.什么是备份 将原有的数据复制一份或几份存起来,以备不时之 ...

  5. 十大经典排序之基数排序(C++实现)

    基数排序 也是采用分桶的思想,但是加入了按位比较的思想(可以理解为每位进行一次计数排序) 思路: 计算数列中最大位数 按位数循环处理每位的排序 代码实现: #include<iterator&g ...

  6. 深入理解C++的型别推导

    所谓型别推导,指的是我们在为变量赋予类型时不必再显式声明,编译器可以根据代码来自动推导类型.C++11中有两种型别推导的场景:模板和auto.下面我们来一一解析. 模板的型别推导 模板在C++中的应用 ...

  7. mergehex tools安装

    (1)nRF5x command line tools包括Jlink驱动以及Nordic自己开发的一些命令行工具,具体包括Jlink驱动,nrfjprog,nrfutil以及mergehex等. 下载 ...

  8. CH573 CH579 CH582程序烧录讲解

    WCH的蓝牙芯片CH57x/CH58x系类大部分是支持串口烧录.USB烧录和LINK烧录的,除了一些特殊的封装,如571K,它引脚较少,只支持串口免按键烧录. 仿真下载:ARM内核的CH579支持Jl ...

  9. mysql-开启日志记录功能

    开启日志记录功能 -- 开启功能 SET GLOBAL general_log = ON; -- 保存到文件 SET GLOBAL log_output = 'file'; 查看日志内容 -- 查看日 ...

  10. pytest之运行环境

    简介 pytest是Python最流程化的单元测试框架,它具有允许直接使用assert进行断言,而不需要使用self.assert*:可以自动寻找单测文件.类和函数,还可支持执行部分用例:Modula ...