SSM前言(五)之日志

一、Log4j与Log4j2

一个完整的软件,日志是必不可少的。程序从开发、测试、维护、运行等环节,都需要向控制台或文件等位置输出大量信息。这些信息的输出,在很多时候是使用System.out.println()无法完成的。

日志信息根据用途与记录内容的不同,分为调试日志、运行日志、异常日志等。
用于日志记录的技术很多,如 jdk的logger技术apache的log4jlog4j2技术等。

Log4j的全称为Log for java,即,专门用于java语言的日志记录工具。其目前有两个版本:Log4j与Log4j2

1.1 Log4j基础

Log4j下载地址:http://logging.apache.org/

(1) Log4j版本下载

(2) Logfj2版本下载


1.2 日志级别

为了方便对于日志信息的输出显示,对日志内容进行了分级管理日志级别由高到低 ,共分6个级别:fatal(致命的)、error、warn、info、debug、trace(堆栈)。
为什么要对日志进行分级呢?
无论是将日志输出到控制台,还是文件,其输出都会降低程序的运行效率。但由于调试、运行维护的需要,客户的要求等原因,需要进行必要的日志输出。这时就必须要在代码中加入日志输出语句。

这些输出语句若在程序运行时全部执行,则势必会降低运行效率。例如,使用System.out.println()将信息输出到控制台,则所有的该输出语句均将执行。会大大降低程序的执行效率。而要使其不输出,唯一的办法就是将这些输出语句逐个全部删除。这是个费时费力的过程。
将日志信息进行分级管理,便可方便的控制信息输出内容及输出位置:哪些信息需要输出,哪些信息不需要输出,只需在一个日志输出控制文件中稍加修改即可。而代码中的输出语句不用做任何修改。

从这个角度来说,代码中的日志编写,其实就是写大量的输出语句。只不过,这些输出语句比较特殊,它们具有级别,在程序运行期间不一定被执行。它们的执行是由另一个控制文件控制。


1.3 日志输出控制文件

Log4j的日志输出控制文件,主要由三个部分构成:
(1)日志信息的输出位置:控制日志信息将要输出的位置,是控制台还是文件等。
(2)日志信息的输出格式:控制日志信息的显示格式,即以怎样的字符串形式显示。
(3)日志信息的输出级别:控制日志信息的显示内容,即显示哪些级别的日志信息。

有了日志输出控制文件,代码中只要设置好日志信息内容及其级别即可,通过控制文件便可控制这些日志信息的输出了。


1.4 Log4j技术

在程序中的日志实现步骤

1) 导入Jar包
在项目中导入log4j需要的jar包。将Log4j框架的zip文件进行解压,在其根目录下就有其Jar包。

2) 放入日志输出控制文件

将属性文件log4j.properties直接放到项目的src下

3)代码中实现日志记录
在要输出日志的类中创建日志对象Logger,并通过Logger的方法在代码中加入日志输出语句。在Java代码中进行日志输出,需要用到Logger类的静态方法getLogger()。
注意,Logger为org.apache.log4j包中的类。

将来这些日志输出语句,会根据log4j.properties文件中日志级别的设置进行输出,会输出到指定位置。其输出结果是:输出指定级别及其更高级别的信息。如指定info级别,则会输出fatal、error、warn、info级别的信息。就本例而言,会执行以下三句,而不会执行debug()方法。日志输出控制文件分析
日志属性文件log4j.properties是专门用于控制日志输出的。其主要进行三方面控制:
    输出位置:控制日志将要输出的位置,是控制台还是文件等。
    输出布局:控制日志信息的显示形式

    输出级别:控制要输出的日志级别。

 日志属性文件由两个对象组成:日志附加器与根日志。

根日志,即为Java代码中的日志记录器,其主要由两个属性构成:日志输出级别与日志附加器。

日志附加器,则由日志输出位置定义,由其它很多属性进行修饰,如输出布局、文件位置、文件大小等。

(1) 定义日志附加器appender
所谓日志附加器,就是为日志记录器附加上很多其它设置信息。附加器的本质是一个接口,其定义语法为:log4j.appender.appenderName = 输出位置
appenderName为自定义名称。

输出位置为log4j指定的类型,是定义好的一些appender接口的实现类。查看log4j框架解压目录下的站点目录site的index.jsp中的JavaDoc,可看到log4j的API。

org.apache.log4j.ConsoleAppender:日志输出到控制台
org.apache.log4j.FileAppender:日志输出到文件
org.apache.log4j.RollingFileAppender:当日志文件大小到达指定尺寸的时候将产生一个新的日志文件
org.apache.log4j.DailyRollingFileAppender:每天产生一个日志文件
(2) 修饰日志附加器
所谓修饰日志附加器,就是为定义好的附加器添加一些属性,以控制到指定位置的输出。不同的附加器,其修饰属性不同。

Target:控制输出到控制台的使用目标。其值为System.out 或 Sytem.err。它们的区别是,System.out是以黑色字体显示到控制台,而System.err则是以红色字体显示。

File:日志要输出的文件位置及文件名称。

MaxFileSize:用于指定日志文件的最大值。若文件超过指定值,将自动产生另一个日志文件。
Log4j常用布局类型:
org.apache.log4j.HTMLLayout:网页布局,以HTML表格形式布局
org.apache.log4j.SimpleLayout:简单布局,包含日志信息的级别和信息字符串
org.apache.log4j.PatternLayout:匹配器布局,可以灵活地指定布局模式。其主要是通过设置PatternLayout的ConversionPattern属性值来控制具体输出格式的。

(3) 配置根Logger
配置rootLogger,以便于代码加载来控制日志的输出。其语法为:
log4j.rootLogger = [ level ] , appenderName, …
其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。OFF为关闭日志功能。

低级别的可以显示高级别的,但高级别的不能显示低级别的。所以,级别越高,将来显示的信息就越少。


这个日志技术已经过时,了解一下不介绍使用了。

1.5 Log4j2技术

og4j2,是对Log4j的升级,其在配置与使用上发生了较大变化。

A)在程序中的日志实现步骤

项目:log4j2

(1) 导入Jar包
使用Log4j2,需要导入其Jar包。Log4j框架解压目录中找到如下两个jar包:


(2) 放入日志输出控制文件

将文件log4j2.xml直接放到项目的src下。log4j2配置文件是XML文件,不再支持properties文件。默认的文件名为log4j2.xml。其存放的位置为classpath中。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
	<Appenders>
		<Console name="myConsole" target="SYSTEM_OUT">
			<PatternLayout pattern="[%-5p][%d{yyyy-MM-dd HH:mm:ss}] [%c %l] %msg%n" />
		</Console>
		<File name="myLogFile" fileName="log/myLogFile.log" append="true">
			<PatternLayout pattern="[%-5p][%d{yyyy-MM-dd HH:mm:ss}] [%c %l] %msg%n" />
		</File>
		<!--  这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档  -->
		<RollingFile name="myRollingFile" fileName="logs/myRollingFile.log"
			filePattern="logs/$${date:yyyy-MM}/myRollingFile-%d{MM-dd-yyyy}-%i.log.gz">
			<PatternLayout
				pattern="[%-5p][%d{yyyy-MM-dd HH:mm:ss}] [%c %l] %msg%n"/>
			<SizeBasedTriggeringPolicy size="2MB" />
		</RollingFile>
	</Appenders>

	<Loggers>
		<Root level="trace">
			<AppenderRef ref="myConsole" />
			<AppenderRef ref="myLogFile" />
			<AppenderRef ref="myRollingFile" />
		</Root>
	</Loggers>
</Configuration>

(3) 代码中实现日志记录
在要输出日志的类中创建日志对象Logger,并通过Logger的方法在代码中加入日志输出语句。该日志对象是通过静态类LogManager的getLogger()方法获取的。
注意,Logger与LogManager均为org.apache.logging.log4j包中的类,非org.apache.log4j包中的。

package com.itcast.test;

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

public class Log4j2Test {

	public static void main(String[] args) {
		Logger logger = LogManager.getLogger(Log4j2Test.class);
		// 记录fatal级别的信息
		logger.fatal("This is fatal message");
		// 记录error级别的信息
		logger.error("This is error message");
		// 记录debug级别的信息
		logger.debug("This is debug message");
		// 记录info级别的信息
		logger.info("This is info message");
		// 记录trace级别的信息
		logger.trace("This is trace message");
	}

}
B)日志输出控制文件分析
log4j2配置文件是XML文件,不再支持properties文件。默认的文件名为log4j2.xml。其存放的位置为classpath中。

若没有设置log4j2.xml,则系统会使用默认的日志配置:只会输出到控制台error级别的信息。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
	<Appenders>
		<Console name="myConsole" target="SYSTEM_OUT">
			<PatternLayout pattern="[%-5p][%d{yyyy-MM-dd HH:mm:ss}] [%c %l] %msg%n" />
		</Console>
		<File name="myLogFile" fileName="log/myLogFile.log" append="true">
			<PatternLayout pattern="[%-5p][%d{yyyy-MM-dd HH:mm:ss}] [%c %l] %msg%n" />
		</File>
		<!--  这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档  -->
		<RollingFile name="myRollingFile" fileName="logs/myRollingFile.log"
			filePattern="logs/$${date:yyyy-MM}/myRollingFile-%d{MM-dd-yyyy}-%i.log.gz">
			<PatternLayout
				pattern="[%-5p][%d{yyyy-MM-dd HH:mm:ss}] [%c %l] %msg%n"/>
			<SizeBasedTriggeringPolicy size="2MB" />
		</RollingFile>
	</Appenders>

	<Loggers>
		<Root level="trace">
			<AppenderRef ref="myConsole" />
			<AppenderRef ref="myLogFile" />
			<AppenderRef ref="myRollingFile" />
		</Root>
	</Loggers>
</Configuration>

配置文件说明:
(1) <configuration/>标签
<configuration/>标签的status属性用于设置Log4j2自身运行的日志显示级别,一般为OFF,不显示。当然,也可以设置为ERROR、DEBUG等其它级别。
(2) <Console/>标签
<Console/>标签的target属性用于设置输出的目标形式,其值一般为:

SYSTEM_OUT或SYSTEM_ERR

(3) <File/>标签
<File/>标签的fileName属性用于设置文件的文件保存路径及文件名。如本例的意思是,日志文件名为myLogFile.log,将其存放在当前项目的根目录下的log子目录中。

append属性用于设置是否以追加方式将日志写入指定文件。

<RollingFile/>标签的<SizeBasedTriggeringPolicy/>子标签用于指定每一个日志文件最大文件大小。当达到这个指定值后,会自动再新建一个日志文件。
(4) <RollingFile/>标签

fileName指定存放目录及第一个日志文件名。filePattern指定新创建的日志文件的文件名。本例还会对文件进行压缩。

(5) <loggers/>标签
用于配置根Logger对象,以指定所使用的日志记录器,及显示的级别。
其子标签<root/>用于指定所使用的日志记录器。该子标签的属性level用于指定显示级别。而日志记录器是通过<root/>的子标签<appender-ref/>来引用<appenders/>中定义好的记录器的。
需要注意的是,只要在<appenders/>中定义了<File/>、<RollingFile/>等,且在其中指定了日志存放的目录,那么这些目录就会自动创建。无论在<loggers/>的<root/>中是否声明使用它们。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值