为什么需要在项目中导入日志组件?当然,如果我们可以自己完全实现那就不说什么了,但是实际上没有人有时间去实现一个功能强大的日志组件。那么,如果不借助现成的,我们一般就是systemout一些,这种只能应付简单的情况,在大型项目中完全不够用,比如多种输出配置,需要输出到文件,需要输出到数据库等,输出到文件的要按天来划分,定义不同的等级。这些都是我们需要的,而日志组件可以很好地支持这些,我们直接用就行。下面看一下log4j的用法,现在已经出到log4j2了,先看log4j吧。
主要包含了三个部分:Loggers,Appenders和Layouts。Loggers负责记录日志,主要分为以下级别:ALL,DEBUG,INFO,ERROR,FATAL。常用的是后四种,级别越来越高,logger只会记录级别不低于当前设置的日志。
那么平时如何使用这四个级别?一般debug是调试信息,在正式运行的时候是不会输出的,当系统出问题了,想排查可以开启这个级别。info可以输出系统的一些运行状态,比如启动。error和fatal可以是系统的异常。
Appenders负责决定日志输出的位置,常见的是控制台,文件,数据库网络等。
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
每一个appender都有这些配置:
Threshold:级别
ImmediateFlush:是否缓冲
Layout以及Conversion:格式
下面是各自的配置:
控制台:
Target:终端名称
日滚动文件:
Append:是否覆盖,默认不覆盖
File:位置和名称
DataPattern:这里可以定义滚动的日期,比如一天一个或者一月一个。'.'yyyy-MM-dd表示一天一个,当天的由File指定,过期的就加上这个后缀。
块滚动文件:
Append:是否覆盖,默认不覆盖
File:位置和名称
MaxFileSize:单个日志文件上限
MaxBackupIndex:备份数目,如果为2,那么有一个当前文件,和两个备份文件
Layouts负责输出的格式。
org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息)
一般使用PatternLayout模式,具体的格式由ConversionPattern配置:
%p:级别
%d:日期,到毫秒
%l:全类名+行号
%m:日志信息
%c:类名,这个参数与getLogger方法传入的一致,但是%l则是自动寻找当前的
使用:
这里采用了maven导入:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
log4j.properties:
log4j.rootLogger = INFO, MYCONSOLE, MYDAILY, ERROR
log4j.appender.MYCONSOLE = org.apache.log4j.ConsoleAppender
log4j.appender.MYCONSOLE.Target = System.out
log4j.appender.MYCONSOLE.layout = org.apache.log4j.PatternLayout
log4j.appender.MYCONSOLE.layout.ConversionPattern = [%p][%l,%d]: %m %n
log4j.appender.MYDAILY = org.apache.log4j.DailyRollingFileAppender
log4j.appender.MYDAILY.File = logs/app.log
log4j.appender.MYDAILY.DatePattern='.'yyyy-MM-dd-hh-mm
log4j.appender.MYDAILY.layout = org.apache.log4j.PatternLayout
log4j.appender.MYDAILY.layout.ConversionPattern = [%p][%l,%d]: %m %n
log4j.appender.ERROR = org.apache.log4j.RollingFileAppender
log4j.appender.ERROR.File = logs/error.log
log4j.appender.ERROR.Threshold = DEBUG
log4j.appender.ERROR.layout = org.apache.log4j.PatternLayout
log4j.appender.ERROR.layout.ConversionPattern = [%p][%l,%d]: %m %n
log4j.appender.ERROR.MaxFileSize = 1KB
log4j.appender.ERROR.MaxBackupIndex = 2
一个日志输出到控制台,一个输出到日滚动文件,另一个记录error,块滚动文件
package com.liyao;
import org.apache.log4j.Logger;
/**
* Hello world!
*
*/
public class App {
public static void main( String[] args ) {
Logger logger = Logger.getLogger(App.class);
logger.info("123123");
logger.error("eorr!!!!");
logger.debug("debug");
}
}
补充:
log4j.properties文件位置,如果是maven项目,放在resources目录下即可。
如果想指定日志的位置为相对路径,即项目目录下,可以使用logs/xxxx.log
log4j.rootLogger = DEBUG, Console, File, ERROR
log4j.appender.Console = org.apache.log4j.ConsoleAppender
log4j.appender.Console.Threshold = INFO
log4j.appender.Console.Target = System.out
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern = %d{yyyy-MM-dd HH\:mm\:ss} %5p %c{1}:%L - %m%n
log4j.appender.File = org.apache.log4j.RollingFileAppender
log4j.appender.File.Threshold = INFO
log4j.appender.File.File = logs/app.log
log4j.appender.File.MaxFileSize = 500MB
log4j.appender.FILE.Append = false
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern = [%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n
log4j.appender.ERROR = org.apache.log4j.RollingFileAppender
log4j.appender.ERROR.Threshold = ERROR
log4j.appender.ERROR.File = logs/error.log
log4j.appender.ERROR.MaxFileSize = 500MB
log4j.appender.ERROR.Append = false
log4j.appender.ERROR.layout = org.apache.log4j.PatternLayout
log4j.appender.ERROR.layout.ConversionPattern = [%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n
File的模式默认为追加,可以设置Append=false,就会覆盖。