log4j入门

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

二、为什么要需要记录日志

  1. 监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作;
  2. 跟踪代码运行时轨迹,作为日后审计的依据;
  3. 担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息

三、log4j入门

  1. log4j的组成
    log4j主要有Loggers(日志记录器)、Appenders(输出端)和Layout(日志格式化器)组成。
    Loggers:控制日志的输出级别与日志是否输出;
    Appenders:指定日志的输出方式(输出到控制台、文件等);
    Layout:控制日志信息的输出格式。
  2. log4j的日志级别
    log4j在org.apache.log4j.Level类中定义了OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL七种日志级别。
OFF:最高级别、关闭所有日志。
FATAL:将会导致应用程序退出的错误。
ERROR:发生错误事件,但仍不影响系统的继续运行。(常用)
WARN:潜在的错误情形。(常用)
INFO:一般和在粗粒度级别上,强调应用程序的运行全程。(常用)
DEBUG :一般用于细粒度级别上,对调试应用程序非常有帮助。(常用)
ALL:最低等级,打开所有日志记录。
  1. 输出端Appender
    Appender 用来指定日志输出到哪个地方,可以同时指定日志的输出目的地。log4j常用的输出目的地有以下几种:
org.apache.log4j.ConsoleAppender:将日志输出到控制台
org.apache.log4j.FileAppender:将日志输出到文件中
org.apache.log4j.DailyRollingFileAppender:将日志输出到一个日志文件,并且每天输出到一个新的文件
org.apache.log4j.RollingFileAppender:将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大 小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件
org.apache.log4j.jdbc.JDBCAppender:把日志信息保存到数据库中

4.日志格式化器Layout

HTMLLayout:格式化日志输出为HTML表格形式
SimpleLayout:简单的日志输出格式化,打印的日志格式为(info - message)
PatternLayout:最强大的格式化期,可以根据自定义格式输出日志,如果没有指定转换格式,就是用默认的转换格式。
  1. log4j的简单使用
    1)默认配置输出到控制台
public class UseLog4j {
	private static final Logger LOG = LoggerFactory.getLogger(UseLog4j.class); 
	    //程序入口——主函数
	    public static void main(String[]args) {
	        //输出日志信息,测试日志级别的作用(配置在配置文件中),仅仅输出大于等于目前有效级别的日志信息
	    	LOG.debug("[1]-my level is DEBUG 天");
    		LOG.info("[2]-my level is INFO");
    		LOG.warn("[3]-my level is WARN");
    		LOG.error("[4]-my level is ERROR");
	    }
}

输出结果如下:
输出结果
2)使用Simple Layout格式化器打印日志为html表格

public class UseLog4j {
	    //程序入口——主函数
	    public static void main(String[]args) {
	    	Logger logger = (Logger) Logger.getLogger(UseLog4j.class);
	        //输出日志信息,测试日志级别的作用(配置在配置文件中),仅仅输出大于等于目前有效级别的日志信息
	    	BasicConfigurator.configure();
	    	HTMLLayout layout = new HTMLLayout();
	    	try {
				FileAppender appender =  new FileAppender(layout,"\\out.html",false);
				logger.addAppender(appender);
				logger.setLevel(Level.WARN);

	            //设置日志输出级别为info,这将覆盖配置文件中设置的级别,只有日志级别高于WARN的日志才输出
				logger.debug("[1]-my level is DEBUG 天");    		
				logger.info("[2]-my level is INFO");   		
				logger.warn("[3]-my level is WARN"); 		
				logger.error("[4]-my level is ERROR");
				
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} 
	    }
}

输出结果

3)log4j.property文件详解

#定义LOG输出级别
log4j.rootLogger=INFO,Console,File
#定义日志输出目的地为控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
#可以灵活地指定日志输出格式,下面一行是指定具体的格式
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%c] - %m%n

#文件大小到达指定尺寸的时候产生一个新的文件
log4j.appender.File = org.apache.log4j.RollingFileAppender
#指定输出目录
log4j.appender.File.File = logs/ssm.log
#定义文件最大大小
log4j.appender.File.MaxFileSize = 10MB
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n

4)log4j错误日志邮件监控
首先在pom文件内添加mail依赖

<dependency>
	<groupId>javax.mail</groupId>
	<artifactId>mail</artifactId>
	<version>1.4.7</version>
</dependency>

其次在log4j.xml文件添加相关配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

	<!-- Appenders -->
	<appender name="console" class="org.apache.log4j.ConsoleAppender">
		<param name="Target" value="System.out" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%-5p: %c - %m%n" />
		</layout>
	</appender>
	
	 <appender name="RollingFileAppender" class="org.apache.log4j.RollingFileAppender">
        <!-- 设置日志信息输出文件全路径名 -->
        <param name="File" value="log4j/RollingFileAppender.log" />
        <!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
        <param name="Append" value="true" />
        <!-- 设置保存备份回滚日志的最大个数 -->
        <param name="MaxBackupIndex" value="10" />
        <!-- 设置当日志文件达到此阈值的时候自动回滚,单位可以是KB,MB,GB,默认单位是KB -->
        <param name="MaxFileSize" value="1KB" />
        <!-- 设置日志输出的样式 -->
        <layout class="org.apache.log4j.PatternLayout">
            <!-- 设置日志输出的格式 -->
            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
        </layout>
    </appender>
    
  <!--      <appender name="DailyRollingFileAppender" class="org.apache.log4j.DailyRollingFileAppender">
        设置日志信息输出文件全路径名
        <param name="File" value="log4j/DailyRollingFileAppender.log" />
        设置日志每分钟回滚一次,即产生一个新的日志文件
        <param name="DatePattern" value="'.'yyyy-MM-dd-HH-mm'.log'" />
        设置日志输出的样式
        <layout class="org.apache.log4j.PatternLayout">
            设置日志输出的格式
            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
        </layout>
    </appender> -->
    
    <!--发邮件(只有ORROE时才发送)-->
    <appender name="MAIL"
		class="org.apache.log4j.net.SMTPAppender">
		<param name="threshold" value="error" />
		<!-- 日志的错误级别 <param name="threshold" value="fatal"/> -->
		<!-- 缓存文件大小,日志达到512K时发送Email -->
		<param name="BufferSize" value="1" /><!-- 单位K -->
		<param name="From" value="[email protected]" />
		<param name="SMTPHost" value="smtp.163.com" />
		<param name="Subject" value="errorteset" />
		<param name="To" value="[email protected]" />
		<param name="SMTPUsername" value="[email protected]" />
		<param name="SMTPPassword" value="qwerty123" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern"
				value="%-d{yyyy-MM-dd HH:mm:ss.SSS} [%p]-[%c] %m%n" />
		</layout>
	</appender>
	
	<!-- Application Loggers -->
	<logger name="com.testfan.spring">
		<level value="info" />
	</logger>
	
	<!-- 3rdparty Loggers -->
	<logger name="org.springframework.core">
		<level value="info" />
	</logger>	
	
	<logger name="org.springframework.beans">
		<level value="info" />
	</logger>
	
	<logger name="org.springframework.context">
		<level value="info" />
	</logger>

	<logger name="org.springframework.web">
		<level value="info" />
	</logger>

	<!-- Root Logger -->
	<root>
		<priority value="info" />
		<appender-ref ref="console" />
		<appender-ref ref="RollingFileAppender" />
		<appender-ref ref="MAIL" />
	</root>
</log4j:configuration>

执行结果:
执行结果