Java 日志工具Log4j的简单使用
1. 简介
Log4j是Java的一个日志工具,是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
2. 使用
这里通过Maven引入Log4j的依赖包
2.1 Idea新建Maven工程, 配置Maven依赖项
使用Idea工具新建一个Maven工程,建好的工程目录如下:
其中,pom.xml是Maven的工程配置文件,我们需要编写此文件来向工程添加外部依赖包。(如果Idea提示是否导入工程,这里选择Auto import)
<dependencies>
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
Log4j的最新版Maven依赖配置项可以在mvnrepository.com搜索得到。
2.2 示例
2.2.1 配置示例
Log4j使用src/main/resources/log4j.properties
作为配置文件。内容如下:
###Log4j设置###
log4j.rootLogger=debug,stdout,D
### 输出信息到控制台 ###
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=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} [ %t ] %m%n
### 输出DEBUG 级别以上的日志到日志文件 ###
log4j.appender.D=org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File=./log/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
2.2.2 使用示例
LogUtils类
import org.apache.log4j.Logger;
/**
* LogUtils
* 日志输出类
* @author ScorpioDong
* @version 1.0
* @date 2020/3/14 9:48 PM
*/
public class LogUtils {
private static final Logger debugLogger = Logger.getLogger("DEBUG");
private static final Logger infoLogger = Logger.getLogger("INFO");
private static final Logger warnLogger = Logger.getLogger("WARN");
private static final Logger errorLogger = Logger.getLogger("ERROR");
/**
* 输出debug级别的日志
*
* @param msg Object 要输出的消息
*/
public static void logDebug(Object msg) {
debugLogger.debug(msg);
}
/**
* 输出info级别的日志
*
* @param msg Object 要输出的消息
*/
public static void logInfo(Object msg) {
debugLogger.info(msg);
}
/**
* 输出warn级别的日志
*
* @param msg Object 要输出的消息
*/
public static void logWarn(Object msg) {
debugLogger.warn(msg);
}
/**
* 输出error级别的日志
*
* @param msg Object 要输出的消息
*/
public static void logError(Object msg) {
debugLogger.error(msg);
}
}
测试
public static void main(String[] args) {
LogUtils.logDebug("Hello1");
LogUtils.logInfo("Hello2");
LogUtils.logWarn("Hello3");
LogUtils.logError("Hello4");
}
执行结果:
[DEBUG] 2020-03-15 15:00:48,441 [ main ] Hello1
[INFO ] 2020-03-15 15:00:48,443 [ main ] Hello2
[WARN ] 2020-03-15 15:00:48,443 [ main ] Hello3
[ERROR] 2020-03-15 15:00:48,443 [ main ] Hello4
日志文件信息:
3 Log4j配置介绍
Log4j有三个主要的组件:Loggers(日志记录器),Appenders (日志的输出源)和Layouts(日志的布局)。
3.1 Loggers
Loggers可以理解为日志的级别,Log4j分为5个级别,从轻到重依次为:DEBUG、INFO、WARN、ERROR和FATAL。
Log4j可以在代码中调用相应级别的日志输出方法实现日志的记录。特别的规则:Log4j可以配置全局日志等级,最终输出的日志登记不低于全局日志等级。简单来说,全局日志等级为DEBUG则,五种日志全部记录,全局日志等级为WARN则会忽略DEBUG和INFO等级日志。
3.2 Appenders
Appenders可以理解为日志将要输出的地方的配置。Log4j允许把日志输出到不同的地方,如控制台(Console)、文件(Files)等,可以根据天数或者文件大小产生新的文件,可以以流的形式发送到其它地方等等。
常用配置项如下:
- org.apache.log4j.ConsoleAppender(控制台)
- org.apache.log4j.FileAppender(文件)
- org.apache.log4j.DailyRollingFileAppender(每隔一段时间产生一个新的日志文件)
- org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
- org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
3.3 Layouts
Layouts可以理解为日志以怎样的格式输出。Layouts提供四种日志输出样式,如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式。
常用配置项如下:
- org.apache.log4j.HTMLLayout(以HTML表格形式布局)
- org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
- org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
- org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息)
4 Log4j详细配置
4.1 rootLogger配置
log4j.rootLogger = [ level ] , appenderName1, appenderName2, …
- level:设定全局日志等级,可设的值有OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别,Log4j建议只使用中间四个级别。
- appenderName: 日志信息要输出到哪里,名字可以随意取。可以同时指定多个输出目的地,用逗号隔开。
4.2 appender的详细配置
配置appender的输出方式
log4j.appender.appenderName = org.apache.log4j.ConsoleAppender
常用配置项如下:
- org.apache.log4j.ConsoleAppender(控制台)
- org.apache.log4j.FileAppender(文件)
- org.apache.log4j.DailyRollingFileAppender(每隔一段时间产生一个新的日志文件)
- org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
- org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
不同输出方式的详细配置 (可选)
ConsoleAppender(控制台)
- Threshold=WARN:指定该输出方式的最低输出级别,默认DEBUG。
- ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。
- Target=System.err: 指定输出流,默认System.out。
FileAppender(文件)
- Threshold=WARN:同上。
- ImmediateFlush=true:同上。
- Append=false:设置文件是覆盖写还是添加写,false为覆盖,true是添加。默认为true。
- File=./log/logging.log4j:指定消息输出到工程log文件夹的logging.log4j文件中。
DailyRollingFileAppender(固定时间间隔产生一个日志文件)
- Threshold=WARN:同上。
- ImmediateFlush=true:同上。
- Append=false:同上。
- File:同上。
- DatePattern=’.'yyyy-MM:指定多久产生新的配置文件。就文件命名为"指定文件名.yyyy-MM".
- '.'yyyy-MM:每月
- '.'yyyy-ww:每周
- '.'yyyy-MM-dd:每天
- '.'yyyy-MM-dd-a:每天两次
- '.'yyyy-MM-dd-HH:每小时
- '.'yyyy-MM-dd-HH-mm:每分钟
RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
- Threshold=WARN:同上。
- ImmediateFlush=true:同上。
- Append=false:同上。
- File:同上。
- MaxFileSize=100KB:后缀可以是KB, MB或者GB。在日志文件到达该大小时,将会自动滚动,即将原来的内容移到"指定文件名.1"文件中。
- MaxBackupIndex=2:指定可以产生的滚动文件的最大数,2表示可以保存"指定文件名.1"、"指定文件名.2"和"指定文件名"三个文件,存满会覆盖.1文件
不同输出方式的Layout输出格式配置 (可选)
log4j.appender.appenderName.layout=org.apache.log4j.PatternLayout
常用配置项如下:
- org.apache.log4j.HTMLLayout(以HTML表格形式布局)
- org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
- org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
- org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息)
HTMLLayout
- LocationInfo=true:输出java文件名称和行号,默认值是false。
- Title=My Logging: 默认值是Log4J Log Messages。
PatternLayout选项
- ConversionPattern=%m%n:设定以怎样的格式显示消息。
格式化符号:
- %p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR,FATAL。
- %d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{yyyy/MM/dd HH:mm:ss,SSS}。
- %r:输出自应用程序启动到输出该log信息耗费的毫秒数。
- %t:输出产生该日志事件的线程名。
- %l:输出日志事件的发生位置,相当于%c.%M(%F:%L)的组合,包括类全名、方法、文件名以及在代码中的行数。例如:test.TestLog4j.main(TestLog4j.java:10)。
- %c:输出日志信息所属的类目,通常就是所在类的全名。
- %M:输出产生日志信息的方法名。
- %F:输出日志消息产生时所在的文件名称。
- %L::输出代码中的行号。
- %m::输出代码中指定的具体日志信息。
- %n:输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"。
- %x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
- %%:输出一个"%"字符。
格式化修饰符
- c:指定输出category的名称,最小的长度是20,如果category的名称长度小于20的话,默认的情况下右对齐。
- %-20c:"-"号表示左对齐。
- %.30c:指定输出category的名称,最大的长度是30,如果category的名称长度大于30的话,就会将左边多出的字符截掉,但小于30的话也不会补空格。