一、了解log4j
log4j是Apache的一个开放源代码的项目,通过使用log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。方便项目的调试。(最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。)
二、为什么要需要记录日志
三、log4j入门
Loggers:控制日志的输出级别与日志是否输出; Appenders:指定日志的输出方式(输出到控制台、文件等); Layout:控制日志信息的输出格式。
OFF:最高级别、关闭所有日志。 FATAL:将会导致应用程序退出的错误。 ERROR:发生错误事件,但仍不影响系统的继续运行。(常用) WARN:潜在的错误情形。(常用) INFO:一般和在粗粒度级别上,强调应用程序的运行全程。(常用) DEBUG :一般用于细粒度级别上,对调试应用程序非常有帮助。(常用) ALL:最低等级,打开所有日志记录。
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:最强大的格式化期,可以根据自定义格式输出日志,如果没有指定转换格式,就是用默认的转换格式。
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>
执行结果: