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

Log4j 随笔的更多相关文章

  1. Spring中使用log4j随笔

    web.xml中的配置: <!--由Sprng载入的log4j配置文件位置--> <context-param> <param-name>log4jConfigLo ...

  2. spring学习总结(mybatis,事务,测试JUnit4,日志log4j&slf4j,定时任务quartz&spring-task,jetty,Restful-jersey等)

    在实战中学习,模仿博客园的部分功能.包括用户的注册,登陆:发表新随笔,阅读随笔:发表评论,以及定时任务等.Entity层设计3张表,分别为user表(用户),essay表(随笔)以及comment表( ...

  3. slf4j+log4j在Java中实现日志记录

    小Alan今天来跟大家聊聊开发中既简单又常用但必不可少的一样东西,那是什么呢?那就是日志记录,日志输出,日志保存. 后面就统一用日志记录四个字来形容啦. 日志记录是项目的开发中必不可少的一个环节,特别 ...

  4. 日志工具——log4j

    资料参考自:http://www.codeceo.com/article/log4j-usage.html 关于日志的基本概念以及从入门到实战,请参见:http://www.cnblogs.com/L ...

  5. JavaWeb应用中初始化Log4j的两种方式

    本文主要介绍了普通JavaWeb应用(基于Tomcat)中初始化Log4j的两种方式: 1.通过增加 InitServlet ,设置令其自启动来初始化 Log4j . 2.通过监听器 ServletC ...

  6. AI人工智能系列随笔

    初探 AI人工智能系列随笔:syntaxnet 初探(1)

  7. 【置顶】CoreCLR系列随笔

    CoreCLR配置系列 在Windows上编译和调试CoreCLR GC探索系列 C++随笔:.NET CoreCLR之GC探索(1) C++随笔:.NET CoreCLR之GC探索(2) C++随笔 ...

  8. C++随笔:.NET CoreCLR之GC探索(4)

    今天继续来 带大家讲解CoreCLR之GC,首先我们继续看这个GCSample,这篇文章是上一篇文章的继续,如果有不清楚的,还请翻到我写的上一篇随笔.下面我们继续: // Initialize fre ...

  9. C++随笔:从Hello World 探秘CoreCLR的内部(1)

    紧接着上次的问题,上次的问题其实很简单,就是HelloWorld.exe运行失败,而本文的目的,就是成功调试HelloWorld这个控制台应用程序. 通过我的寻找,其实是一个名为TryRun的文件出了 ...

随机推荐

  1. Linux module 添加到bashrc 和临时ifort编译器 以及python2和3的配置

    第一步vim ~/.bashrc按键盘的i然后source /home/export/online1/bjpara/para/modules/scripts/cn-module.sh最后:x! bas ...

  2. Sublime Text快捷键与插件介绍

    Sublime Text快捷键: Ctrl+Shift+P:打开命令面板Ctrl+P:搜索项目中的文件Ctrl+G:跳转到第几行Ctrl+W:关闭当前打开文件Ctrl+Shift+W:关闭所有打开文件 ...

  3. poj 3087 Shuffle'm Up (模拟过程)

    Description A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuff ...

  4. 2019swpuj2ee作业3

    静态页面: 在网站设计中,纯粹html格式的网页通常被称为“静态网页”,早期的网站一般都是由静态网页制作的.静态网页是相对于动态网页而言,是指没有后台数据库.不含程序和不可交互的网页.你编的是什么它显 ...

  5. 利用python同步windows和linux文件

    写python脚本的初衷,每次在windows编辑完文件后,想同步到linux上去,只能够登录服务器,然后再利用网络copy,重复性很大,就想着能不能写一个小脚本帮我同步 逻辑:比对本地和服务器文件的 ...

  6. 前端之html表单

    html表单 用于搜集不同类型的用户输入 表单由不同类型的标签组成   1.<form>标签 定义整体的表单区域     * action属性 定义表单数据提交地址     * metho ...

  7. PostgreSQL与PostGIS的关系

    PostgreSQL相当于PostGIS的祖先,PostGIS是在PostgreSQL的基础上发展起来的,从它们的名字上也能看出些许端倪.PostgreSQL是一个开源数据库,而PostGIS在此基础 ...

  8. git-创建新项目

    1.一般第一次使用git,需要进行全局设置,如果下次创建新项目或者fork别人的项目,则不需要再进行设置:但是如果想要提交到不同的代码管理网站,则需要再设置,比如现在我的是在gitlab.com上进行 ...

  9. openresty 安装

    1.安装环境.版本说明: 操作系统: Centos 6.5 X86_64 openresty 版本: openresty-1.13.6.1.tar.gz 2.安装 openresty(nginx) 需 ...

  10. Android开发 - 掌握ConstraintLayout(一)传统布局的问题

    在传统的Android开发中,页面布局占用了我们很多的开发时间,而且面对复杂页面的时候,传统的一些布局会显得非常复杂,每种布局都有特定的应用场景,我们通常需要各种布局结合起来使用来实现复杂的页面.随着 ...