Log4j 随笔

对于一个Java开发者而言,Log4j是咱们的好朋友了。话说到这里,须要自我反省一下,这么久以来,凡是用到Log4j的地方,相关的配置文件都是直接拷贝过去,历来都没仔细看过。But thanks God,在刚刚的项目中,由于一些特殊的需求,有机会好好看了一下log4j,说来惭愧。java

目录sql

一、Appenders数据库

二、Layoutsapache

三、Odds and ends架构

 

1、Appendersapp

Appenders是指log4j中全部继承自Appender接口的类。他们一块儿定义了log4j须要把日志写到哪些地方,控制台?数据库或者是文件系统。他们的家族挺简单:nosql

 

与其余大型开源项目相比,Log4j的Appender可谓简洁明了。有一个抽象类AppenderSkeleton实现了Appender的大体骨架,而后众多的具体的Appender都继承自这个AppenderSkeleton. 目前为止,笔者用过的Appender也就ConsoleAppender/RollingFileAppender/SMTPAppender.ide

须要用到的Appender均可以配置在log4j.properties中,e.g.ui

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

注意,Appender的配置须要以log4j.appender开头,后面紧接着的是这个Appender的对象的名称,在上面的配置中,名称为stdout. 而后就是配置实现类,配置相关参数等等。this

Log4j的这样的Appender架构,也很方便咱们来扩展log4j,好比咱们须要把log写入到solr或者其余nosql中去,扩展Appender会是一个很好的方法。

package com.mzule.log.solr.appender;

import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.spi.LoggingEvent;

public class SolrAppender extends AppenderSkeleton {

	@Override
	public void close() {

	}

	@Override
	public boolean requiresLayout() {
		return false;
	}

	@Override
	protected void append(LoggingEvent event) {

	}

}

上面是一个自定义的Appender,能够看见,实现Appender也就三个方法:

①close方法,close方法能够用来释放资源,像SolrAppender这样不须要善后的能够直接留空。

②requiresLayout方法,requiresLayout方法标注该Appender是否须要设置layout属性,若是返回true的话,在log4j.properties中配置该appender时,就必需要提供一种layout的实现(见下文)。

③appender方法,appender方法就是进行log的核心代码了,在这儿new一个SolrServer而后add日志记录,最后commit就ok.

是否是so easy?

在coding Appender的时候,确定会但愿可以读取log4j.properties的一些参数。就像SMTPAppender须要在log4j.properties中配置to,from,smtphost等等同样。

其实很简单,对于简单的字符串数据,能够直接在Appender中定义,而后提供setters方法。再用相同的名称在log4j.properties中配置相应的值便可。

好比说在SolrAppender中,我须要一个host地址,能够这样作:

public class SolrAppender extends AppenderSkeleton {

	protected String host;
	
	...
	
	public void setHost(String host) {
		this.host = host;
	}
	
}

而后在log4j.properties配置host的值:

# Direct log messages to Solr
log4j.appender.solr=package.to.SolrAppender
log4j.appender.solr.host=http://localhost:8080/everylog/core

这样,在SolrAppender中就能够直接使用host变量了。

 

2、Layouts

Layout就是log4j.properties中的log4j.appender.stdout.layout=org.apache.log4j.PatternLayout配置,此处为PatternLayout,

 此外,并非全部的Appender都须要layout的,好比SocketAppender就不须要layout.

 3、Odds and ends

Q: 在配置Appender的时候,我怎么知道它有哪些属性能够配置的?

A: 谷歌之,或者看相应Appender的源码,源码里面的setters方法都是能够做为属性设置的。Log4j会调用PropertySetter进行赋值。

相关文章
相关标签/搜索