今天我们学习了LOG4J,对它有一些比较片面的了解.
由"为什么要把事件分为不同的等级"引入正题?
因为不同事件的本质是不同的,有的事件至关重要(银行系统被攻击),而有的则无关紧要比较某个变以量在某时刻的值(如果这个数值在调试阶段有什么顶天立地的作用就另当别论了)
可以在多个设备上输出信息,一个设备就是可以理解为程序中的一个HANDLER
LEVEL是覆盖的关系而HANDLER是叠加的关系,意思是说假如父类的LEVEL值为1,子类的值为2,则父类的值在子类不再有作用,子类的LEVEL的值就是非功过,而HANDLER(也就是输入设备)的机制就不同了,比如说父类的输出设备为显示器,子类的输出设备为文件,则子类不但要把信息输出到文件,还要继承父类的输出设备(显示器).
class X{
static {X x = new X();}
getManager{return x};
}
java -Djava.util.logging.config.file=<属性文件名><类名>
LOGDEMO1.JAVA (程序主文件)
package cn.itcast;
import java.util.logging.Logger;
//import org.apache.commons.logging.Log;
//import org.apache.commons.logging.LogFactory;
/**
* descrption: logdemo1
* @author zxx
*/
public class LogDemo1 {
/**
* @param args
* mymethods
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Logger logger = Logger.getLogger("LogDemo1.class");
//Log log = LogFactory.getLog(LogDemo1.class);
//log.debug("debug");
logger.info("info");
logger.severe("servre");
//logger.fatal("fatal");
//log.error("error");
}
}
LOG4J.XML(LOG4J配置文件)
<log4j:configuration debug="false" xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="systemout" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.SimpleLayout"></layout>
</appender>
<root>
<level value="warn"/>
<appender-ref ref="systemout"/>
</root>
</log4j:configuration>
log4j使用常识:
Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数见表1如下: %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) 基本应用 Log4J的配置 现在来看log4j.properties配置文件的意义。第一行指定了根Logger的级别是DEBUG,并将此指定输出到A1。A1就是第二行定义的org.apache.log4j.ConsoleAppe