一、了解log4j
log4j是Apache的一个开放源代码的项目,通过使用log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。方便项目的调试。(最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。)
二、为什么要需要记录日志
- 监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作;
- 跟踪代码运行时轨迹,作为日后审计的依据;
- 担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息
三、log4j入门
- log4j的组成
log4j主要有Loggers(日志记录器)、Appenders(输出端)和Layout(日志格式化器)组成。Loggers:控制日志的输出级别与日志是否输出; Appenders:指定日志的输出方式(输出到控制台、文件等); Layout:控制日志信息的输出格式。
- log4j的日志级别
log4j在org.apache.log4j.Level类中定义了OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL七种日志级别。
OFF:最高级别、关闭所有日志。
FATAL:将会导致应用程序退出的错误。
ERROR:发生错误事件,但仍不影响系统的继续运行。(常用)
WARN:潜在的错误情形。(常用)
INFO:一般和在粗粒度级别上,强调应用程序的运行全程。(常用)
DEBUG :一般用于细粒度级别上,对调试应用程序非常有帮助。(常用)
ALL:最低等级,打开所有日志记录。
- 输出端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:最强大的格式化期,可以根据自定义格式输出日志,如果没有指定转换格式,就是用默认的转换格式。
- 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="wjia5520@163.com" />
<param name="SMTPHost" value="smtp.163.com" />
<param name="Subject" value="errorteset" />
<param name="To" value="2822212098@qq.com" />
<param name="SMTPUsername" value="wjia5520@163.com" />
<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>
执行结果: