Log4j 发布2.0首个Alpha 版本
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
Log4j 2是Log4j的升级版本,该版本相比之前的版本来说有着显著的改进,包含很多在Logback中的改进以及Logback架构中存在的问题。
这是 Log4j 2的首次发行的版本,值得关注的改进包括:
- API分离(API Separation) – Log4j 的 API 和其实现进行分类(本来一个jar包搞定的,现在要变成好几个,跟 slf4j有点类似)
- 为日志审计而设计 - 与 Log4j 1.x 和 Logback 不同的是 Log4j 2 将不会在重新配置期间丢失事件,支持消息可方便进行审计
- 性能方面的提升(Improved Performance) - 在关键领域比 Log4j 1.x 的性能提升不少,大部分情况下性能跟 Logback 差不多
- 支持多 APIs(Support for multiple APIs) - 支持 SLF4J 和 Commons Logging API
- 自动配置重载(Automatic Reloading of Configurations)- 支持 XML 和 JSON 格式的配置
- 插件体系架构(Plugin Architecture)- 所有可配置的组件都是通过 Log4j 插件进行定义,包括 Appender, Layout, Pattern Converter, 等等
- 配置属性支持(Property Support)
注意:Apache log4j 2.0要求至少需要 JDK 5 支持。
Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:
- logback-core:logback-core是其它两个模块的基础模块。
- logback- classic:logback-classic是log4j的一个 改良版本。此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。
- logback-access:logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。
更多关于Log4j 2的内容请看 http://logging.apache.org/log4j/2.x/index.html
配置文件的读取方式
- BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。
- PropertyConfigurator.configure ( String configFilename):读取使用Java的特性文件编写的配置文件。
- DOMConfigurator.configure ( String filename ):读取XML形式的配置文件。
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)
- %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
- %%: 输出一个“%”字符
- %F: 输出日志消息产生时所在的文件名称
Log4j 配置文件(log4j.properties)的所在路径问题
一般我们直接将log4j.properties放置在src目录下,这样系统自动会找到的,其实就是放在WEB-INF/classes文件下。这个路径在classpath下,所以直接就能找到。我们写Logger的时候如下:
public class HelloLog4j {
public static Logger logger = Logger.getLogger(HelloLog4j.class);
public static void main(String[] args) {
logger.debug("This is debug message.");
logger.info("This is info message.");
logger.error("This is error message.");
xxx();
}
public static void xxx(){
logger.debug("main method has invoked xxx method.");
}
}
如果现在我们想把log4j.properties文件放置在其它目录下,例如:WEB-INF下和web.xml放在一起。这时候就需要我们手动指定log4j配置文件的路径,否则系统是找不到的。
一、首先我们在web.xml中配置好log4j.properties路径:
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
二、然后写个servlet,部分代码如下:
public void init() {
String prefix = getServletContext().getRealPath("/");
String file = getInitParameter("log4jConfigLocation");
if (file != null) {
PropertyConfigurator.configure(prefix + file);
}
}
三、在web.xml中配置servlet,并将log4jConfigLocation加入到Servlet中,让其Server启动即运行:
<servlet>
<servlet-name>your servlet</servlet-name>
<servlet-class>your servelt class</servlet-class>
<init-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
参考文献
- Log4j 2 使用教程:http://blog.csdn.net/memray/article/details/17488433
- Log4j 2 之Appenders:http://www.cnblogs.com/elaron/archive/2013/02/17/2914633.html
- http://baike.baidu.com/view/25347.htm
- http://www.cnblogs.com/suman/archive/2010/10/23/1858864.html
- http://jiangzhengjun.iteye.com/blog/526364
浙公网安备 33010602011771号