log4j记录日志到指定文件
- 新建类文件:
1 import org.apache.log4j.Logger; 2 import org.apache.log4j.PropertyConfigurator; 3 4 /** 5 * 记录日志到指定文件 6 * 7 * @author He 8 * @date 2018/5/16 9 */ 10 public class Log4jDemo { 11 12 static Logger logger = Logger.getLogger(Log4jDemo.class); 13 14 public static void main(String[] args) { 15 PropertyConfigurator.configure("config/log4j.properties"); 16 logger.info("我记录在Log4jDemo 文件中...."); 17 logger.error("在Log4jDemo 文件中出现异常...."); 18 } 19 }
2. 在项目根目录下(即与src平级)创建config文件夹,新建log4j.properties 文件
配置如下:
# 声明日志类型 log4j.rootLogger = INFO,log4jDemo,test # 配置1 - 即日志Id名为 com.exampl.log.Log4jDemo 的日志配置(通俗来讲就是日志的标识,只不过该标识可在多个类中调用) log4j.logger.log4jDemo=com.exampl.log.Log4jDemo log4j.additivity.log4jDemo = false log4j.appender.log4jDemo=org.apache.log4j.RollingFileAppender # 输出级别(如果定义的ERROR级别,那么打印的INFO级别的日志就不会记录在文件中,因为INFO的级别比ERROR要) log4j.appender.log4jDemo.Threshold=ERROR # 输出的日志文件位置及文件名称 log4j.appender.log4jDemo.File=logs/Log4jDemo.log # 布局类型 log4j.appender.log4jDemo.layout=org.apache.log4j.PatternLayout # 布局模板 log4j.appender.log4jDemo.layout.ConversionPattern=%d %-5p [%l] - %m%n # 输出的日志文件的最大文件大小,单位b(字节) log4j.appender.log4jDemo.MaxFileSize=5242880 # 日志的循环周期 log4j.appender.log4jDemo.MaxBackupIndex=3
运行main方法 日志输出如下:
3.关于log4j.properties 一些配置:
- 日志输出级别,共有5级:
FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7
- Appender 为日志输出目的地,Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
- Layout:日志输出格式,Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
- 打印参数: Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,如下:
%m 输出代码中指定的消息 %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %c 输出所属的类目,通常就是所在类的全名 %t 输出产生该日志事件的线程名 %n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n” %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},输出类似:2002年10月18日 22 : 10 : 28 , 921 %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java: 10 )
- 在代码中初始化Logger:
1)在程序中调用BasicConfigurator.configure()方法:给根记录器增加一个ConsoleAppender,输出格式通过PatternLayout设为"%-4r [%t] %-5p %c %x - %m%n",还有根记录器的默认级别是Level.DEBUG.
2)配置放在文件里,通过命令行参数传递文件名字,通过PropertyConfigurator.configure(args[x])解析并配置;
3)配置放在文件里,通过环境变量传递文件名等信息,利用log4j默认的初始化过程解析并配置;
4)配置放在文件里,通过应用服务器配置传递文件名等信息,利用一个特殊的servlet来完成配置。
- 日志文件生成周期的定义:
rollover次数 | 输出的目标 | 压缩的日志文件 | 描述 |
---|---|---|---|
1 | foo.log |
foo-1.log | 在第一次rollover 时,foo.log会被重命名为foo-1.log。同时会创建一个新的foo.log 并开始写入。 |
2 | foo.log |
foo-1.log, foo-2.log | 在第二次发生rollover 时,foo-1.log会重命名为foo-2.log并且foo.log会重命名为foo-1.log。同时会创建一个新的foo.log 并开始写入。 |
3 | foo.log | foo-1.log, foo-2.log, foo-3.log | 在第三次发生rollover 时,foo-2.log会重命名为foo-3.log。foo-1.log重命名为foo-2.log,foo.log会重命名为foo-1.log。同时会创建一个新的foo.log 并开始写入。 |
4 | foo.log | foo-1.log, foo-2.log, foo-3.log | 在第四次和随后的rollover 时,foo-3.log会被删除,foo-2.log重命名为foo-3.log。foo-1.log重命名为foo-2.log。foo.log重命名为foo-1.log。后面同理 |
每次当文件达到指定文件大小(MaxFileSize)时,日志文件就会按上述规则来生成。