Log4j是一个开源的项目,早在JDK1.4之前就开始流行起来了,起源于1996年的EU SEMPER项目,威龙简单灵活的方式追踪程序运行情况,该项目决定编写一套日志系统API,经过无数次的改进和优化,改API从EU SEMPER项目中脱离出来,成为了我们后来的Log4j。
Log4j的组织曾经建议JDK1.4中使用Log4j作为其log的api,但是那时候JDK1.4已经将近完成,sun公司拒绝了它。但是作为JAVA开发的人都知道,JDK自带的LOG API形同鸡肋,最广泛使用的还是Log4j。同事JDK log与Log4j的api完全不同,彼此不能方便替换,Apache为了解决这一问题,推出了commans logging组件。它的作用就是当存在Log4j的时候会把输出原封不动的交给log4j,如果没有,它会吧相应的输出转换为JDK logging输出。
所以,在我们日常使用中,我们经常会使用到,commons-logging的jar包。
ALL、TRACE(跟踪)、DEBUG(调试)、INFO(信息)、WARNING(警告)、ERROR(错误)、FITAL(致命)、OFF
注意:高级别的日志会屏蔽低级别的日志
Log4j的默认配置文件为log4j.properties,启动时会默认加载classpath下的log4j.properties,如果不使用默认的log4j.properties文件,可以 使用PropertyConfiguration指定配置文件路径。
配置根记录器
作用:所有的logger都会沿用rootLogger的配置
基本格式:log4j.rootLogger=[日志级别],[日志输出地]……..
日志级别:ALL、TRACE(跟踪)、DEBUG(调试)、INFO(信息)、WARNING(警告)、ERROR(错误)、FITAL(致命)、OFF
日志输出地:自定义,可多个
示范:
log4j.rootLogger=ERROR,A,B,C
覆盖根记录配置
(1)针对某个类:
作用:对某个类的配置修改,不再沿用rootLooger配置
基本写法:log4j.logger.包名.类名=[日志级别],[日志输出地]…….
示范:
log4j.logger.com.zxm.test.TestLog = DEBUG
(2)针对某个包:
作用:对整个包下面所有的类的配置修改,不再沿用rootLooger配置
基本写法:log4j.category.包名=[日志级别],[日志输出地]…….
log4j.category.com.zxm.test = INFO
配置常用输出地、布局、常用配置
比如在.rootLogger设置的输出地有A(控制台),B(文件),C(JDBC数据库)
(1)A输出到控制台
log4j.rootLogger=ERROR,A
#输出到控制台的实现类
log4j.appender.A=org.apache.log4j.ConsoleAppender
#DEBUG以上级别时候输出
#log4j.appender.A.Threshold=DEBUG
#编码方式
#log4j.appender.A.Encoding=UTF-8
#是否立即输出
#log4j.appender.A.ImmediateFlush=true
#使用System.error输出
#log4j.appender.A.Target=System.error
#日志布局
log4j.appender.A.layout=org.apache.log4j.PatternLayout
#日志输出自定义格式
log4j.appender.A.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss,SSS}[%C]-[%p] %m%n
(2)B输出到文件
注意:输出到文件的实现有这么几种
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
log4j.rootLogger=ERROR,B
#输出到文件的指定类
log4j.appender.B=org.apache.log4j.FileAppender
#输出到文件的地址
log4j.appender.B.file=D:\\mylog.log
#是否追加文件
log4j.appender.B.Append=true
#日志布局
log4j.appender.B.layout=org.apache.log4j.PatternLayout
#日志输出自定义格式
log4j.appender.B.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss,SSS}[%C]-[%M]-[%p] %m%n
还有一种 输出到HTML,也是输出到文件,只需要修改日志的布局
log4j.rootLogger=ERROR,B
log4j.appender.B=org.apache.log4j.FileAppender
log4j.appender.B.file=D:\\mylog.html
log4j.appender.B.Append=true
#日志布局
log4j.appender.B.layout=org.apache.log4j.HTMLLayout
log4j.rootLogger=ERROR,C
#输出到数据库的实现
log4j.appender.C=org.apache.log4j.jdbc.JDBCAppender
#设置输出级别
log4j.appender.C.Threshold=ERROR
#数据库地址
log4j.appender.C.URL=jdbc:mysql://localhost:3306/log4j
#数据库链接驱动
log4j.appender.C.driver=com.mysql.jdbc.Driver
#连接数据库的用户名
log4j.appender.C.user=root
#连接数据库的密码
log4j.appender.C.password=root
#连接数据库的sql语句
log4j.appender.C.sql=INSERT INTO logs (date, priority, message, classname) VALUES ('%d', '%p', '%m', '%c');
#日志布局
log4j.appender.C.layout=org.apache.log4j.PatternLayout
#日志输出自定义格式
log4j.appender.C.layout.ConversionPattern=%m
示范:java代码:
package com.zxm.test;
import org.apache.log4j.Logger;
public class TestLog {
private Logger log = Logger.getLogger(TestLog.class);
public void test(){
log.error("hello word");
}
public static void main(String[] args) {
TestLog testLog = new TestLog();
testLog.test();
}
}
创建数据库:
CREATE TABLE logs (
id INT(11) NOT NULL AUTO_INCREMENT,
date VARCHAR(255) NULL DEFAULT '' COLLATE 'utf8_bin',
priority VARCHAR(255) NULL DEFAULT '' COLLATE 'utf8_bin',
message TEXT NULL COLLATE 'utf8_bin',
classname VARCHAR(255) NULL DEFAULT '' COLLATE 'utf8_bin',
PRIMARY KEY (id),
INDEX id (id)