Log4j 随笔

2019-03-27 01:12|来源: 网路

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

目录

1、Appenders

2、Layouts

3、Odds and ends

 

一、Appenders

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

 

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

需要用到的Appender都可以配置在log4j.properties中,e.g.

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. 然后就是配置实现类,配置相关参数等等。

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变量了。

 

二、Layouts

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

 此外,并不是所有的Appender都需要layout的,比如SocketAppender就不需要layout.

 三、Odds and ends

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

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

 


转自:http://www.cnblogs.com/codeplus/p/3294134

相关问答

更多
  • 汗,随便写啊,看个书,一句喜欢的话,自己的感想,几句就凑够30字了吧! 这老师也太。。。想当初我们都是要400字的。。。 临时给你写个 早上骑车在树下经过,静静的世界,似乎听得到树叶从树枝上出头,努力生长的声音,车轮在碧绿的草地经过,让我心情也带上了初春的阳光。
  • log4j的使用步骤[2022-10-29]

    一、使用步骤:   第一步   加入log4j-1.2.8.jar(可以选择log4j的更高版本)到lib下。   第二步   在CLASSPATH下建立log4j.properties。内容如下(数字为行号):   1 log4j.rootCategory=INFO, stdout , R   2   3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender   4 log4j.appender.stdout.layout=org.apache.lo ...
  • 解决了JDBC appender,我使用了命令: log4j.appender.JDBC.sql = INSERT INTO .... 我只是将请求的参数传递给插入查询,但是我已经配置了持久性。 感谢log4j.MDC MDC教程 Solved with JDBC appender , i used the command : log4j.appender.JDBC.sql=INSERT INTO .... I just pass the requested parameters to the insert ...
  • 只有从4.0开始的Flyway命令行才支持此功能: https : //github.com/flyway/flyway/issues/1075 This is will only be supported for Flyway Command-line starting with 4.0: https://github.com/flyway/flyway/issues/1075
  • 您的配置文件未正确写入。 Appender不应该是类/包减速,而是一种你想输出消息的appender(如果你想输出到默认的appender,请保持空白) 该文件看起来应该更像: log4j.rootLogger=FATAL log4j.logger.com.A=DEBUG Your configuration file isn't properly written. Appender shouldn't be the class/package deceleration but a type of ap ...
  • 在XML配置log4j.xml中: 将debug设置为“false” 快乐的伐木:-) In the XML configuration log4j.xml: set th ...
  • 为了通过UDP进行日志记录以适用于Log4j 1.2,我们从现在放弃的(?)“Apache Receivers Companion for log4j 1.2”项目(用于从废弃的Log4j 1.3项目中移植可用代码)下载了UDPAppender的源代码并自行编译。 初步测试表明它工作正常,但希望你注意到我在上面两次使用“废弃”...... 项目页面: http : //logging.apache.org/log4j/companions/receivers/index.html 源代码(不在项目页面链接的 ...