zoukankan      html  css  js  c++  java
  • Log4j 随笔

    对于一个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进行赋值。

  • 相关阅读:
    网站架构(页面静态化,图片服务器分离,负载均衡)方案全解析
    ant例子
    poj 3744 概率dp+矩阵快速幂
    hdu 4284 状态压缩dp
    hdu 4276 树形dp
    hdu 3586 树形dp+二分
    hdu 3001 三进制状压
    hdu 1561 树形dp+分组背包
    hdu 2196 树形dp
    poj 1485 dp
  • 原文地址:https://www.cnblogs.com/codeplus/p/3294134.html
Copyright © 2011-2022 走看看