log4j的一些配置:
log4j.rootLogger=info,stdout,D,E
//日志的常用输出的级别debug<info<error<fatal 这里面的stdout(控制台)、D(输出debug及以上级别的日志信息)、E(输出error及以上级别的日志信息)代表日志输出的位置(可以指定任意的名称)
//指定日志输出的级别info,相当于object类中的一个属性,在不指定的要具体输出什么类下面的日志的时候,最低输出的级别为info,像D和E也会继承info因此输出的日志级别最低也是info信息,像D里面就不会出现debug的日志信息了。但是如果指定了要输出的类里面的日志的信息,像下面的指定log.Log4jTest类里面输出的最低的级别为debug,因此所有的stdout,D,E都会继承他输出的日志的信息的级别最低都为debug,D中就会出现debug的日志信息。(简单来说向D、E是在类的基础上实现的Threshold的功能的,如果继承的最低级别是info的话,那么最低输出日志级别必定是info信息即使Threshold配置DEBUG也不起作用。这点还不太清楚为什么,有知道的可以在下面评论里说一下,感谢。)
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p -%m%n
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.appender.D=org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File=/log/debug.log
log4j.appender.D.Append=true
log4j.appender.D.Threshold=DEBUG
log4j.appender.D.layout=org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern= %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
log4j.appender.E=org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File=/log/error.log
log4j.appender.E.Append=true
log4j.appender.E.Threshold=ERROR
log4j.appender.E.layout=org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %l:%c:%t:%r ] - [ %p ] %m%n
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.additivity.log.Log4jTest=true
log4j.logger.log.Log4jTest=debug,testLog
log4j.appender.testLog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.testLog.File=/log/testLog.log
log4j.appender.testLog.layout=org.apache.log4j.PatternLayout
log4j.appender.testLog.layout.ConversionPattern=%m%n
测试代码如下:
public class Log4jTest {
static Logger log=Logger.getLogger(Log4jTest.class);
public static void main(String[] args) {
PropertyConfigurator.configure("src/main/resources/log4j.properties");
log.info("这是在测试info");
log.error("这是在测试error");
log.debug("这是在测试debug");
try{
Student.print();
}catch(Exception e){
log.error("发生异常"+e);
}
}
}
public class Student implements Serializable{
public static Logger log=Logger.getLogger(Student.class);
private static final long serialVersionUID = 6953145752845327861L;
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public Student(){
}
public Student(String name,String age){
this.name=name;
this.age=age;
}
@Override
public String toString() {
return "[name=" + name + ", age=" + age + "]";
}
public static void print(){
Student stu=new Student();
stu.setName("张三");
stu.setAge("23");
log.debug("这是student的debug信息");
log.info("这是 Student "+stu);
}
}