- 浏览: 959064 次
- 性别:
- 来自: 江西上饶
文章分类
- 全部博客 (460)
- p.spring (56)
- p.maven (20)
- p.ant (17)
- p.jee (18)
- p.jse (33)
- p.ofbiz (31)
- p.软件工程 (8)
- p.struts2 (5)
- p.hibernate (5)
- linux (25)
- 设计模式 (2)
- p.javascript (11)
- 硬件 (1)
- p.jsp (2)
- p.windows批处理 (1)
- 操作系统问题 (5)
- 算法 (1)
- p.mysql (7)
- p.sql (5)
- p.c (1)
- google产品 (0)
- 内存 (1)
- p.struts (1)
- p.freemarker (7)
- p.css (4)
- p.log4j (10)
- p.html (3)
- 淘宝产品 (0)
- 其他 (3)
- 编译器 (0)
- svn (4)
- p.spring.security (11)
- 图形 (0)
- p.xml (1)
- p.ssh (0)
- p.jquery (4)
- p.jdbc (3)
- p.flex (0)
- p.c++ (0)
- p.c#Net (0)
- p.assembly (0)
- p.sqlserver (0)
- p.其他 (3)
- p.webwork (21)
- p.wap (12)
- p.cglib (1)
- p.jee服务器 (11)
- windows (2)
- p.iphone (1)
- p.java.分布式与集群 (2)
- p.ibatis (16)
- p.eclipse (5)
- 架构 (2)
- http协议 (5)
- 我的个人标准 (2)
- 多线程 (1)
- 奇怪问题 (5)
- p.jira (13)
- p.httpclient (1)
- 服务器.apache (11)
- 安全防范 (1)
- p.PODAM (1)
- p.junit (16)
- fop (2)
- 硬盘安装 (1)
- powerdesigner (0)
- 单元测试 (1)
- apache commons (4)
- tomcat+apache集群 (10)
- 各类诡辩 (1)
- 安卓 (8)
- qvod (1)
- java编程基础知识考试考点及答案 (0)
- 工作总结 (4)
- oracle (0)
- spring的util工具 (3)
- json (2)
- maven (3)
- jms (19)
- p.bat (3)
- hadoop (2)
- git (3)
- nginx (1)
- p.移动开发 (1)
- shiro (3)
- 游戏破解 (1)
- react-native (7)
- ios开发 (1)
- webmagic (6)
- socks5 (1)
最新评论
-
weituotian:
说的不好,没人看的
公司系统中的菜单功能和权限功能 -
石不易:
非常详细的注解~
绑定端口和IP,Listen 与VirtualHost指令 -
spring_springmvc:
spring mvc demo教程源代码下载,地址:http: ...
spring mvc -
liyixing1:
PandaDONG 写道谢谢你啊,我已经下下来了,只是还有很多 ...
jira war安装 -
liyixing1:
PandaDONG 写道谢谢你啊,我已经下下来了,只是还有很多 ...
jira war安装
简单例子:
将log4j-VERSION.jar架包加入到classpath中。
我使用的是log4j-1.2.16.jar
package com.cgodo.log4j.test;
import org.apache.log4j.Logger;
/**
* log4j测试
*
* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-3 上午01:37:42
*/
public class Test {
private static final Logger LOGGER = Logger.getLogger("test");
/**
* @param args
*/
public static void main(String[] args) {
LOGGER.debug("hello");
}
}
这里的输出信息应该是
log4j:WARN No appenders could be found for logger (test).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
这是在说,我们还没有配置logger。
这个时候我们添加一句初始化默认配置的方法。
package com.cgodo.log4j.test;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
/**
* log4j测试
*
* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-3 上午01:37:42
*/
public class Test {
private static final Logger LOGGER = Logger.getLogger("test");
/**
* @param args
*/
public static void main(String[] args) {
//使用默认配置。
BasicConfigurator.configure();
LOGGER.debug("hello");
}
}
得到的输出信息是
0 [main] DEBUG test - hello
一般使用log4j的步骤
1.配置,一个简单的配置方式是使用默认配置
BasicConfigurator.configure()
2.检索类的Logger对象
一般会使用如下三种方式
Logger.getLogger("com.wombat.X"); // String variant
Logger.getLogger(X.class.getName()); // another String variant
Logger.getLogger(X.class); // convenient Class variant
3.调用Logger的记录消息的方法
debug(), info(), warn(), error(), fatal(), log()
log4j组成部分
log4j由三个部分组成
loggers, appenders and layouts
如果一个logger的名字后面跟着一个点号,它就是点号后面的那个logger的前辈(ancestor),是这个晚辈(descendant) 的前缀。如果在它自己和这个晚辈之间没有其它的前辈,它和这个晚辈之间就是父子关系。
例如,叫做"com.foo"的logger是叫做 "com.foo.Bar"的logger的父辈 。同样地,"java"是"java.util" 的父辈,是"java.util.Vector"的前辈。这和java中package的概念是一样的。
根(root)logger 位于logger阶层的最上层。它在三个方面很特别:
1.它总是存在的。
2.不能给它的level设置为null
3.不能通过name获取到它。
根logger是通过Logger.getRootLogger获取的。而非根logger是通过Logger.getLogger获取的。
logger拥有如下方法
package org.apache.log4j;
public class Logger {
// Logger creation & retrieval methods:
public static Logger getRootLogger();
public static Logger getLogger(String name);
// printing methods:
public void debug(Object message);
public void info(Object message);
public void warn(Object message);
public void error(Object message);
public void fatal(Object message);
// printing methods for exceptions:
public void debug(Object message, Throwable t);
public void info(Object message, Throwable t);
public void warn(Object message, Throwable t);
public void error(Object message, Throwable t);
public void fatal(Object message, Throwable t);
// generic printing method:
public void log(Level p, Object message);
}
logger的创建和检索
记录器创建时,会以如上说的结构创建。通过getLogger方法,我们可以得到一个logger。这个方法如果发现这个logger不存在,就回创建它。而getLogger方法传入的name相同,它们得到的引用是同一个。
如:
Logger x = Logger.getLogger("wombat");
Logger y = Logger.getLogger("wombat");
得到的是两个相同实例。
对于祖先logger,在创建后代logger的时候,如果祖先没有创建,那么祖先的logger会先被创建。
对于日志级别,这和UNIX的日志是一样的。而windows则叫做日志时间类型。
常用的级别
1.FATAL致命级别。这个级别表示应用出现了致命的错误。这样的错误难以恢复的。而对于java的Exception,则不应该属于这个级别。
2.ERROR错误级别。一般在发生了Exception使用
3.WARN警告级别。对系统的警告。如当发现数据不正确的时候。
4.INFO信息级别。比DEBUG级别略高。它一般用于记录系统信息,或者记录系统运行中的重要标志。
5.DEBUG调试级别。这个级别使用比较多。一般用来再开发阶段使用。来输出调试信息,方便调试。
级别包含
ALL, DEBUG, INFO, WARN, ERROR, FATAL and OFF等。
级别等级关系
ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF
实现org.apache.log4j.Level接口,我们还可以定义自己的级别。
一个logger的有效级别如果没有指定(level 为null),那么它将从它的父类继承,直到root logger,找到一个level不为null的祖先为止。
如表格,只有root logger被指派了级别。这个级别的值,DEBUG,被其它的loggers X, X.Y 和 X.Y.Z继承了。
如表格,所有的logger都指定了级别,无需继承。
如表只有x.y没设置级别,它将从它的上级logger(x)继承级别DEBUG
如表root和x指定了级别。x.y和x.y.z未设置级别,他们将从x继承而来。
日志过滤器。
日志是通过调用对应级别的方法来完成的。如果当前的logger开启的级别高于调用的方法级别,那么过滤器就会不允许打印。
例子
package com.cgodo.log4j.test;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
/**
* log4j测试
*
* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-3 上午01:37:42
*/
public class Test {
private static final Logger LOGGER = Logger.getLogger("test");
/**
* @param args
*/
public static void main(String[] args) {
BasicConfigurator.configure();
Logger logger = Logger.getLogger("com.foo");
// 设置等级为info
logger.setLevel(Level.INFO);
// 它未设置级别,从com.foo继承
Logger barLogger = Logger.getLogger("com.foo.Bar");
// because WARN >= INFO.
logger.warn("warn.");
// This request is disabled, because DEBUG < INFO.
logger.debug("debug.");
// INFO >= INFO.
barLogger.info("Located nearest gas station.");
// This request is disabled, because DEBUG < INFO.
barLogger.debug("debug2");
}
}
结果只有两句级别是输出的
0 [main] WARN com.foo - warn.
0 [main] INFO com.foo.Bar - Located nearest gas station.
层次性的级别过滤 Threshold
它设置的是全局的过滤级别。而logger的级别只是针对当前logger的
package com.cgodo.log4j.test;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggerRepository;
/**
* log4j测试
*
* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-3 上午01:37:42
*/
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
BasicConfigurator.configure();
Logger x = Logger.getLogger("foo.bar");
x.setLevel(Level.INFO);
LoggerRepository repository = x.getLoggerRepository();
//设置了全局的为WARN
repository.setThreshold(Level.WARN);
//info < warn
x.info("Dropped message.");
//设置全局的为off
repository.setThreshold(Level.OFF);
//fatal < off
x.fatal("This is a serious message but it will also be dropped.");
repository.setThreshold(Level.ALL);
x.info("Hello world.");
//debug >= all
x.debug("Remember: DEBUG < INFO.");
}
}
输出内容为
0 [main] INFO foo.bar - Hello world.
打印异常
package com.cgodo.log4j.test;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
/**
* log4j测试
*
* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-3 上午01:37:42
*/
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
BasicConfigurator.configure();
Logger x = Logger.getLogger("foo.bar");
x.setLevel(Level.ALL);
x.error("exception测试", new RuntimeException("测试"));
}
}
输出内容
0 [main] ERROR foo.bar - exception测试
java.lang.RuntimeException: 测试
at com.cgodo.log4j.test.Test.main(Test.java:24)
Appenders
log4j允许将输出信息输出到不同设备中。
调用logger的addAppender方法将添加一个设备。
logger的每一个允许的级别日志记录调用都将传递到这个设备。
Appender Additivity
Logger x.y.z的log输出信息将被输出到x.y.z的所有appenders和它的前辈的 appenders。这就是"appender additivity"的意思。
但是,如果logger x.y.z的前辈,比如说x.y,x.y的additivity flag被设置为 false,那么,x.y.z的输出信息将被输出到x.y.z的所有appenders中去,以及它的前辈的——截止在x.y那里,包括x.y在内的,appenders中去,但是不会输出到x.y的前辈的 appenders中去。
默认情况下,Loggers的additivity flag设置为true。
package com.cgodo.log4j.test;
import java.io.IOException;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.SimpleLayout;
/**
* log4j测试
*
* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-3 上午01:37:42
*/
public class Test {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
FileAppender a0 = new FileAppender(new SimpleLayout(), "a0.log");
FileAppender a1 = new FileAppender(new SimpleLayout(), "a1.log");
Logger root = Logger.getRootLogger();
Logger x = Logger.getLogger("x");
Logger xyz = Logger.getLogger("x.y.z");
root.addAppender(a0);
x.addAppender(a1);
// Note that we have not added any appenders to the xyz logger.
xyz.debug("Some message.");
xyz.info("Another message.");
}
}
如上代码
1.由于我们没有加载默认配置,所以不会往控制台输出信息
2.a1.log文件的内容
DEBUG - Some message.
INFO - Another message.
3.a0.log 的内容
DEBUG - Some message.
INFO - Another message.
可以发现,调用了记录日志的方法后,x.y,x.y.zlogger的日志同时打印在了root的日志appenders中。
package com.cgodo.log4j.test;
import java.io.IOException;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.SimpleLayout;
/**
* log4j测试
*
* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-3 上午01:37:42
*/
public class Test {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
FileAppender a0 = new FileAppender(new SimpleLayout(), "a0.log");
FileAppender a1 = new FileAppender(new SimpleLayout(), "a1.log");
FileAppender secureAppender = new FileAppender(new SimpleLayout(),
"secret.log");
Logger root = Logger.getRootLogger();
root.addAppender(a0);
Logger x = Logger.getLogger("x");
x.addAppender(a1);
Logger xyz = Logger.getLogger("x.y.z");
Logger secureLogger = Logger.getLogger("secure");
secureLogger.addAppender(secureAppender);
secureLogger.setAdditivity(false);
// The accessLogger is a child of the secureLogger.
Logger accessLogger = Logger.getLogger("secure.access");
// Output goes to a0.log and a1.log.
xyz.debug("Regular message.");
// Ouput goes only to secret.log.
accessLogger.warn("Detected snooping attempt by Eve.");
}
}
如上代码,a0.log,a1.log都有相同内容输出。而secret.log只有
WARN - Detected snooping attempt by Eve.
一句话。因为secureLogger.setAdditivity(false);设置为false。到secureLogger的appenders输出完毕后不会再往上面传递了。
Layouts
除了对输出设备的要求外,还会对输出格式布局有要求。一个常见的布局是PatternLayout布局。它的输出格式和C语句的格式化输出很类似
Object Rendering 对象渲染
这是log4j的强大功能。将对象以自定的布局格式方式输出。
package com.cgodo.log4j.test;
import java.io.IOException;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.SimpleLayout;
import com.cgodo.log4j.model.User;
/**
* log4j测试
*
* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-3 上午01:37:42
*/
public class Test {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
FileAppender a0 = new FileAppender(new SimpleLayout(), "a0.log");
Logger root = Logger.getRootLogger();
root.addAppender(a0);
Logger log = Logger.getLogger("test");
User user = new User(1, "aaa");
log.debug("debug user");
log.debug(user);
}
}
如上,未定义格式的情况下,输出内容是
DEBUG - debug user
DEBUG - com.cgodo.log4j.model.User@1bcc0bc
对象渲染器需要实现org.apache.log4j.or.ObjectRenderer接口
如我们可以使用AttributesRenderer来访问org.xml.sax.Attributes objects.
将log4j-VERSION.jar架包加入到classpath中。
我使用的是log4j-1.2.16.jar
package com.cgodo.log4j.test;
import org.apache.log4j.Logger;
/**
* log4j测试
*
* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-3 上午01:37:42
*/
public class Test {
private static final Logger LOGGER = Logger.getLogger("test");
/**
* @param args
*/
public static void main(String[] args) {
LOGGER.debug("hello");
}
}
这里的输出信息应该是
log4j:WARN No appenders could be found for logger (test).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
这是在说,我们还没有配置logger。
这个时候我们添加一句初始化默认配置的方法。
package com.cgodo.log4j.test;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
/**
* log4j测试
*
* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-3 上午01:37:42
*/
public class Test {
private static final Logger LOGGER = Logger.getLogger("test");
/**
* @param args
*/
public static void main(String[] args) {
//使用默认配置。
BasicConfigurator.configure();
LOGGER.debug("hello");
}
}
得到的输出信息是
0 [main] DEBUG test - hello
一般使用log4j的步骤
1.配置,一个简单的配置方式是使用默认配置
BasicConfigurator.configure()
2.检索类的Logger对象
一般会使用如下三种方式
Logger.getLogger("com.wombat.X"); // String variant
Logger.getLogger(X.class.getName()); // another String variant
Logger.getLogger(X.class); // convenient Class variant
3.调用Logger的记录消息的方法
debug(), info(), warn(), error(), fatal(), log()
log4j组成部分
log4j由三个部分组成
loggers, appenders and layouts
如果一个logger的名字后面跟着一个点号,它就是点号后面的那个logger的前辈(ancestor),是这个晚辈(descendant) 的前缀。如果在它自己和这个晚辈之间没有其它的前辈,它和这个晚辈之间就是父子关系。
例如,叫做"com.foo"的logger是叫做 "com.foo.Bar"的logger的父辈 。同样地,"java"是"java.util" 的父辈,是"java.util.Vector"的前辈。这和java中package的概念是一样的。
根(root)logger 位于logger阶层的最上层。它在三个方面很特别:
1.它总是存在的。
2.不能给它的level设置为null
3.不能通过name获取到它。
根logger是通过Logger.getRootLogger获取的。而非根logger是通过Logger.getLogger获取的。
logger拥有如下方法
package org.apache.log4j;
public class Logger {
// Logger creation & retrieval methods:
public static Logger getRootLogger();
public static Logger getLogger(String name);
// printing methods:
public void debug(Object message);
public void info(Object message);
public void warn(Object message);
public void error(Object message);
public void fatal(Object message);
// printing methods for exceptions:
public void debug(Object message, Throwable t);
public void info(Object message, Throwable t);
public void warn(Object message, Throwable t);
public void error(Object message, Throwable t);
public void fatal(Object message, Throwable t);
// generic printing method:
public void log(Level p, Object message);
}
logger的创建和检索
记录器创建时,会以如上说的结构创建。通过getLogger方法,我们可以得到一个logger。这个方法如果发现这个logger不存在,就回创建它。而getLogger方法传入的name相同,它们得到的引用是同一个。
如:
Logger x = Logger.getLogger("wombat");
Logger y = Logger.getLogger("wombat");
得到的是两个相同实例。
对于祖先logger,在创建后代logger的时候,如果祖先没有创建,那么祖先的logger会先被创建。
对于日志级别,这和UNIX的日志是一样的。而windows则叫做日志时间类型。
常用的级别
1.FATAL致命级别。这个级别表示应用出现了致命的错误。这样的错误难以恢复的。而对于java的Exception,则不应该属于这个级别。
2.ERROR错误级别。一般在发生了Exception使用
3.WARN警告级别。对系统的警告。如当发现数据不正确的时候。
4.INFO信息级别。比DEBUG级别略高。它一般用于记录系统信息,或者记录系统运行中的重要标志。
5.DEBUG调试级别。这个级别使用比较多。一般用来再开发阶段使用。来输出调试信息,方便调试。
级别包含
ALL, DEBUG, INFO, WARN, ERROR, FATAL and OFF等。
级别等级关系
ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF
实现org.apache.log4j.Level接口,我们还可以定义自己的级别。
一个logger的有效级别如果没有指定(level 为null),那么它将从它的父类继承,直到root logger,找到一个level不为null的祖先为止。
logger name | 指定级别 | 有效级别 |
root(根级别) | DEBUG | DEBUG |
x | none | DEBUG |
x.y | none | DEBUG |
x.y.z | none | DEBUG |
如表格,只有root logger被指派了级别。这个级别的值,DEBUG,被其它的loggers X, X.Y 和 X.Y.Z继承了。
logger name | 指定级别 | 有效级别 |
root(根级别) | DEBUG | DEBUG |
x | ERROR | ERROR |
x.y | INFO | INFO |
x.y.z | DEBUG | DEBUG |
如表格,所有的logger都指定了级别,无需继承。
logger name | 指定级别 | 有效级别 |
root(根级别) | INFO | INFO |
x | DEBUG | DEBUG |
x.y | none | DEBUG |
x.y.z | WARN | WARN |
如表只有x.y没设置级别,它将从它的上级logger(x)继承级别DEBUG
logger name | 指定级别 | 有效级别 |
root(根级别) | DEBUG | DEBUG |
x | ERROR | ERROR |
x.y | none | ERROR |
x.y.z | none | ERROR |
如表root和x指定了级别。x.y和x.y.z未设置级别,他们将从x继承而来。
日志过滤器。
日志是通过调用对应级别的方法来完成的。如果当前的logger开启的级别高于调用的方法级别,那么过滤器就会不允许打印。
例子
package com.cgodo.log4j.test;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
/**
* log4j测试
*
* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-3 上午01:37:42
*/
public class Test {
private static final Logger LOGGER = Logger.getLogger("test");
/**
* @param args
*/
public static void main(String[] args) {
BasicConfigurator.configure();
Logger logger = Logger.getLogger("com.foo");
// 设置等级为info
logger.setLevel(Level.INFO);
// 它未设置级别,从com.foo继承
Logger barLogger = Logger.getLogger("com.foo.Bar");
// because WARN >= INFO.
logger.warn("warn.");
// This request is disabled, because DEBUG < INFO.
logger.debug("debug.");
// INFO >= INFO.
barLogger.info("Located nearest gas station.");
// This request is disabled, because DEBUG < INFO.
barLogger.debug("debug2");
}
}
结果只有两句级别是输出的
0 [main] WARN com.foo - warn.
0 [main] INFO com.foo.Bar - Located nearest gas station.
层次性的级别过滤 Threshold
它设置的是全局的过滤级别。而logger的级别只是针对当前logger的
package com.cgodo.log4j.test;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggerRepository;
/**
* log4j测试
*
* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-3 上午01:37:42
*/
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
BasicConfigurator.configure();
Logger x = Logger.getLogger("foo.bar");
x.setLevel(Level.INFO);
LoggerRepository repository = x.getLoggerRepository();
//设置了全局的为WARN
repository.setThreshold(Level.WARN);
//info < warn
x.info("Dropped message.");
//设置全局的为off
repository.setThreshold(Level.OFF);
//fatal < off
x.fatal("This is a serious message but it will also be dropped.");
repository.setThreshold(Level.ALL);
x.info("Hello world.");
//debug >= all
x.debug("Remember: DEBUG < INFO.");
}
}
输出内容为
0 [main] INFO foo.bar - Hello world.
打印异常
package com.cgodo.log4j.test;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
/**
* log4j测试
*
* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-3 上午01:37:42
*/
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
BasicConfigurator.configure();
Logger x = Logger.getLogger("foo.bar");
x.setLevel(Level.ALL);
x.error("exception测试", new RuntimeException("测试"));
}
}
输出内容
0 [main] ERROR foo.bar - exception测试
java.lang.RuntimeException: 测试
at com.cgodo.log4j.test.Test.main(Test.java:24)
Appenders
log4j允许将输出信息输出到不同设备中。
调用logger的addAppender方法将添加一个设备。
logger的每一个允许的级别日志记录调用都将传递到这个设备。
Appender Additivity
Logger x.y.z的log输出信息将被输出到x.y.z的所有appenders和它的前辈的 appenders。这就是"appender additivity"的意思。
但是,如果logger x.y.z的前辈,比如说x.y,x.y的additivity flag被设置为 false,那么,x.y.z的输出信息将被输出到x.y.z的所有appenders中去,以及它的前辈的——截止在x.y那里,包括x.y在内的,appenders中去,但是不会输出到x.y的前辈的 appenders中去。
默认情况下,Loggers的additivity flag设置为true。
package com.cgodo.log4j.test;
import java.io.IOException;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.SimpleLayout;
/**
* log4j测试
*
* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-3 上午01:37:42
*/
public class Test {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
FileAppender a0 = new FileAppender(new SimpleLayout(), "a0.log");
FileAppender a1 = new FileAppender(new SimpleLayout(), "a1.log");
Logger root = Logger.getRootLogger();
Logger x = Logger.getLogger("x");
Logger xyz = Logger.getLogger("x.y.z");
root.addAppender(a0);
x.addAppender(a1);
// Note that we have not added any appenders to the xyz logger.
xyz.debug("Some message.");
xyz.info("Another message.");
}
}
如上代码
1.由于我们没有加载默认配置,所以不会往控制台输出信息
2.a1.log文件的内容
DEBUG - Some message.
INFO - Another message.
3.a0.log 的内容
DEBUG - Some message.
INFO - Another message.
可以发现,调用了记录日志的方法后,x.y,x.y.zlogger的日志同时打印在了root的日志appenders中。
package com.cgodo.log4j.test;
import java.io.IOException;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.SimpleLayout;
/**
* log4j测试
*
* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-3 上午01:37:42
*/
public class Test {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
FileAppender a0 = new FileAppender(new SimpleLayout(), "a0.log");
FileAppender a1 = new FileAppender(new SimpleLayout(), "a1.log");
FileAppender secureAppender = new FileAppender(new SimpleLayout(),
"secret.log");
Logger root = Logger.getRootLogger();
root.addAppender(a0);
Logger x = Logger.getLogger("x");
x.addAppender(a1);
Logger xyz = Logger.getLogger("x.y.z");
Logger secureLogger = Logger.getLogger("secure");
secureLogger.addAppender(secureAppender);
secureLogger.setAdditivity(false);
// The accessLogger is a child of the secureLogger.
Logger accessLogger = Logger.getLogger("secure.access");
// Output goes to a0.log and a1.log.
xyz.debug("Regular message.");
// Ouput goes only to secret.log.
accessLogger.warn("Detected snooping attempt by Eve.");
}
}
如上代码,a0.log,a1.log都有相同内容输出。而secret.log只有
WARN - Detected snooping attempt by Eve.
一句话。因为secureLogger.setAdditivity(false);设置为false。到secureLogger的appenders输出完毕后不会再往上面传递了。
Layouts
除了对输出设备的要求外,还会对输出格式布局有要求。一个常见的布局是PatternLayout布局。它的输出格式和C语句的格式化输出很类似
Object Rendering 对象渲染
这是log4j的强大功能。将对象以自定的布局格式方式输出。
package com.cgodo.log4j.test;
import java.io.IOException;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.SimpleLayout;
import com.cgodo.log4j.model.User;
/**
* log4j测试
*
* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-3 上午01:37:42
*/
public class Test {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
FileAppender a0 = new FileAppender(new SimpleLayout(), "a0.log");
Logger root = Logger.getRootLogger();
root.addAppender(a0);
Logger log = Logger.getLogger("test");
User user = new User(1, "aaa");
log.debug("debug user");
log.debug(user);
}
}
如上,未定义格式的情况下,输出内容是
DEBUG - debug user
DEBUG - com.cgodo.log4j.model.User@1bcc0bc
对象渲染器需要实现org.apache.log4j.or.ObjectRenderer接口
如我们可以使用AttributesRenderer来访问org.xml.sax.Attributes objects.
发表评论
-
Invalid signature file digest for Manifest main attributes
2015-09-23 14:26 8268java.lang.SecurityException: In ... -
log4jdbc
2014-12-25 13:55 3046该框架目前支持到jdbc3.和jdbc4的版本。 提供了多种 ... -
logger
2014-12-25 12:13 778loggers additivity属性,决定是否从root ... -
filter
2011-07-16 01:12 1038log4j默认提供了几个过滤器,包括repository过滤器 ... -
layout
2011-07-10 23:28 1136抽象类Layout public abstract ... -
appender
2011-07-10 17:03 2132Appender实现了Appender 类定义如下 packa ... -
配置文件
2011-07-09 21:47 1561log4j的配置支持xml和属性文件两种。在前面的文章中说过B ... -
log4j基础知识2 LoggingEvent类,性能
2011-07-07 23:21 4611LoggerEvent 当threshold和logg ... -
log4j的执行流程
2011-07-03 18:50 1840当调用了记录日志的方法后,比如调用log()方法 1.检测th ...
相关推荐
Log4j是Apache组织提供的一款强大的日志处理框架,它为开发者提供了丰富的日志记录功能,支持多种编程语言,如Java、C、C++、.Net等。通过Log4j,开发者可以在各种语言环境中实现一致的日志记录行为,极大地提高了跨...
**Log4j基础知识:** 1. **日志级别**:Log4j支持多个日志级别,如DEBUG、INFO、WARN、ERROR、FATAL以及OFF,允许开发者根据需要调整日志输出的详细程度。 2. **配置文件**:Log4j使用配置文件(如log4j2.xml或log4j...
**一、Log4j基础知识** 1. **Log4j组件**:Log4j主要由三个核心组件构成——Logger(日志器)、Appender(输出器)和Layout(布局器)。 - Logger:负责接收日志事件并决定是否需要记录。 - Appender:负责将日志...
**log4j基础知识** Log4j是一个强大的Java日志库,其主要功能包括: 1. **配置灵活性**:通过log4j.properties或log4j.xml文件,开发者可以自定义日志级别(如DEBUG, INFO, WARN, ERROR, FATAL),输出格式,以及...
**Log4j基础知识** Log4j是Apache软件基金会开发的一个开源项目,主要目标是提供一个灵活且强大的日志系统。它包含三个主要组件:Logger(日志器)、Appender(输出端)和Layout(格式化器)。Logger负责生成日志...
标题"Log4j简单使用"表明我们即将探讨的是日志记录库Log4j的基础应用。Log4j是Apache软件基金会开发的一个开源项目,它为Java应用程序提供了一个灵活的日志系统,允许开发者自定义日志级别、输出格式以及存储位置等...
通常,一本完整的手册会包括以下几个部分:介绍Log4j的基础知识、详细说明如何配置和使用Log4j、示例和最佳实践、高级配置技巧、性能优化建议、以及Log4j的二次开发等方面内容。读者可以根据个人需要,找到对应章节...
**Log4j基础知识** Log4j是Apache软件基金会的一个开源项目,它提供了一个灵活的日志记录系统。在Java应用程序中,Log4j能够帮助开发者记录调试信息、错误信息和其他关键事件,以协助诊断问题、优化性能和追踪系统...
在Spring项目中配置log4j是一项基础且重要的工作,它能帮助我们记录应用程序的运行日志,便于调试、排查问题和性能分析。Log4j是一个广泛使用的Java日志框架,提供灵活的日志记录功能。接下来,我们将详细讲解如何在...
以下是对如何整合Java、log4j2和MongoDB所需的知识点的详细说明: 首先,让我们了解Java和log4j2的基础。Java是一种广泛使用的面向对象的编程语言,具有平台无关性,这使得它成为构建跨平台应用程序的理想选择。Log...
log4j.properties 配置说明 ...在使用 Log4j 之前,我们需要了解 Log4j 的基础知识,包括 Appender、Layout、Logger 等概念。只有当我们了解了这些概念时,我们才能正确地配置 Log4j,达到我们想要的日志输出效果。
5. **配置Log4j**:使用`ZipDailyRollingFileAppender`需要在Log4j的配置文件(通常是`log4j.properties`或`log4j.xml`)中指定。配置项包括日志文件路径、压缩参数、滚动策略等。 6. **日志级别**:Log4j支持多种...
### log4j中文手册知识点概览 ...综上所述,`log4j`是一款强大且灵活的日志记录工具,通过上述知识点的学习,我们不仅可以快速掌握其基础使用方法,还能深入理解其内部机制,更好地应用于实际项目中。
1. **Log4j手册.pdf**:这个文档通常包含了Log4j的基础知识和详细指南。Log4j的核心组件包括Logger、Appender和Layout。Logger是记录日志信息的对象,用于定义日志级别(如DEBUG、INFO、WARN、ERROR和FATAL)。...
**Log4j基础知识** 1. **日志框架**:Log4j是Apache软件基金会的一个项目,提供了一个用于记录日志信息的框架。它允许程序员控制日志信息的输出级别,格式,目的地,以及如何处理日志事件。 2. **组件**:Log4j...
这个库包含了Log4j2的主要实现部分,如日志记录器、配置解析器、插件系统等,它是使用Log4j2进行日志处理的基础。 描述中提到,Struts2版本2.5.10.1依赖于Log4j2,这意味着开发者在使用该版本的Struts2时,需要引入...
**Log4j基础知识** Log4j是一个灵活且功能强大的日志工具,它的主要组件包括: 1. **配置器**:定义日志记录的行为,如日志级别(DEBUG, INFO, WARN, ERROR, FATAL)、日志输出目的地(控制台、文件、数据库等)和...
"log4j"标签进一步确认了这个资源与Log4j框架相关,可能涉及到使用、配置、问题解决等方面的知识。 **总结** 这个压缩包提供的资源对于Java开发者来说非常有价值,它包含了在项目中集成log4j所需的基础文件和可能...
- "log4j从入门到详解.pdf":这是一份完整的Log4j教程,从基础概念到高级用法,覆盖了Log4j的各个方面,适合初学者和进阶学习者。 - "log4j.rar": 这可能是Log4j的源码或者其他相关资源的压缩包,解压后可能包含更多...