Log4j2使用总结

2019-02-16 20:57:00     

一、摘要

Log4j在2015年的时候就已经停更了,进而推出了slf4j+logback进化版以及后续的Log4j2高级版既然Log4j寿命已到,那当然要学习新的版本Log4j2了log4j2版本不再支持像log4j中的.properties后缀的文件配置方式,log4j2版本配置文件后缀名只能为.xml .json .jsn相关的两个jar包:
  • log4j-api-2.6.2.jar
  • log4j-core-2.6.2.jar

二、配置介绍

把log4j2的配置文件放到项目的classpath下,系统就能默认访问到了

  • maven项目的classpath系统默认是在【src/main/resources】
  • 普通项目的classpath系统默认是在【src】

创建日志文件一般默认使用log4j2.xml进行命名,缺省默认配置文件配置如下:

<?xml version="1.0" encoding="UTF-8"?>  
<configuration status="WARN" monitorInterval="30">  
  <appenders>  
    <Console name="Console" target="SYSTEM_OUT">  
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </Console>  
  </appenders>  
  <loggers>  
    <root level="ERROR">  
      <appender-ref ref="Console"/>  
    </root>  
  </loggers>  
</configuration>  

status:用来指定log4j2本身的打印日志的级别

monitorInterva:是用来设置配置文件的动态加载时间的,单位是秒monitorInterval="30"表示每30秒配置文件会动态加载一次

PatternLayout:用来设置控制台打印的格式

%c :输出日志信息所属的类的全名

%d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss }

%f :输出日志信息所属的类的类名

%l :输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行

%m :输出代码中指定的信息,如log(message)中的message

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

%p :输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug() * 输出的,则为DEBUG,依此类推

%r: 输出自应用启动到输出该日志信息所耗费的毫秒数

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

level:是日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF其中最常用的是中间6个级别

All:最低等级的,用于打开所有日志记录.

Trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出.

Debug:指出细粒度信息事件对调试应用程序是非常有帮助的.

Info:消息在粗粒度级别上突出强调应用程序的运行过程.

Warn:输出警告及warn以下级别的日志.

Error:输出错误信息日志.

Fatal:输出每个严重的错误事件将会导致应用程序的退出的日志.

OFF:最高等级的,用于关闭所有日志记录.

配置pom.xml文件,加入log4j2相关的jar包,配置如下:

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<log4j2.version>2.6.2</log4j2.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-core</artifactId>
			<version>${log4j2.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-api</artifactId>
			<version>${log4j2.version}</version>
		</dependency>
	</dependencies>

编写TestLog4j2测试类,如下代码:

package bounds;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test;

public class TestLog4j2 {
	// 基于类的名称获取日志对象
	Logger logger=LogManager.getLogger(TestLog4j2.class);
	@Test
	public void TestOne() {
		logger.trace("跟踪信息");
		logger.debug("调试信息");
		logger.info("输出信息");
		logger.warn("警告信息");
		logger.error("错误信息");
		logger.fatal("致命信息");
	}
}

使用Junit运行,打印结果:

00:37:53.711 ERROR [main] (TestLog4j2.java:16) - 错误信息
00:37:53.713 FATAL [main] (TestLog4j2.java:17) - 致命信息

三、复杂配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN" monitorInterval="30">
	<!--先定义所有的appender -->
	<appenders>
		<!--这个输出控制台的配置,这里输出除了warn和error级别的信息到System.out -->
		<Console name="console_out_appender" target="SYSTEM_OUT">
			<!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
			<ThresholdFilter level="warn" onMatch="DENY"
				onMismatch="ACCEPT" />
			<!-- 输出日志的格式 -->
			<PatternLayout pattern="%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n" />
		</Console>
		<!--这个输出控制台的配置,这里输出warn和error级别的信息到System.err,在eclipse控制台上看到的是红色文字 -->
		<Console name="console_err_appender" target="SYSTEM_ERR">
			<!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
			<ThresholdFilter level="warn" onMatch="ACCEPT"
				onMismatch="DENY" />
			<!-- 输出日志的格式 -->
			<PatternLayout pattern="%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n" />
		</Console>
		<!-- 记录滚动日志文件-->
		<RollingRandomAccessFile name="rollingFile" fileName="${LOG_DIR}/application.log"
			filePattern="${LOG_DIR}/application.%d{dd-MMM}.log.gz"
			ignoreExceptions="false">
			<!-- 滚动日志文件只记录level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
			<ThresholdFilter level="warn" onMatch="ACCEPT"
				onMismatch="DENY" />
			<!-- 输出日志的格式 -->
			<PatternLayout pattern="%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n" />
			<Policies>
				<OnStartupTriggeringPolicy />
				<SizeBasedTriggeringPolicy size="2 MB" />
				<TimeBasedTriggeringPolicy />
			</Policies>
			<DefaultRolloverStrategy max="5" />
		</RollingRandomAccessFile>
	</appenders>
	<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
	<loggers>
		<!-- 第三方日志系统 -->
		<logger name="org.springframework" level="INFO"></logger>
		<logger name="org.mybatis" level="INFO"></logger>
		<root level="all">
			<appender-ref ref="console_out_appender" />
			<appender-ref ref="console_err_appender" />
			<appender-ref ref="rollingFile" />
		</root>
	</loggers>
</configuration>
  • immediateFlush:log4j2接收到日志事件时,是否立即将日志刷到磁盘
  • fileName:日志存储路径
  • filePattern:历史日志封存路径,注意后缀,log4j2自动识别zip等后缀,表示历史日志需要压缩
Java中的String

String是个类,属于引用数据类型。String类可以调用方法,具有面向对象的特征。String类是final类,也即意味着String类不能被继承,并且它的成员方法都默认为final方法。在Java中,被final修饰的类是不允许被继承的,并且该类中的成员方法都默认为final方法。

二级域名解析到同IP不同端口

最近又多了个项目想发布到服务上去,使用`phpstudy`运行之后发现端口冲突了。php项目使用的是`80端`口,之前的项目Apache也使用的是80端口。因为phpstudy操作简单,就直接`修改phpstudy端口为1111`再次运行来到==127.0.0.1:1111==之后,项目成功启动,用域名替换成==www.bounds.top:1111==后还是可以访问。 诶........有点小开心。开心不过三秒,突然一想,谁家的访问地址是带端口号的?闻所未闻啊!于是不得不继续寻找解决方案,难受!

 发表评论