OK,现在我们来研究输出低Appended。

  • Appender控制日志输出的位置

Log4j日志系统允许把日志输出到不同的地方,如控制台(Console)、文件(Files)、根据天数或者文件大小产生新的文件、以流的形式发送到其它地方等等。

Log4j内置了常用的输出地,一般情况下配置一下即可使用,所有的Appender都实现了自org.apache.log4j.Appender接口。在log4j.properties中,Appended都使用log4j.appender.*配置。



  • 常用的输出位置有如下几个:

ConsoleAppender(控制台)

FileAppender(文件)

RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)

DailyRollingFileAppender(每天产生一个日志文件)

JDBCAppender(输出到JDBC数据库)

SocketAppender(远程日至服务器)     

WriterAppender(将日志信息以流格式发送到任意指定的地方)

SMTPAppender(发送邮件)

  • 配置时使用方式为:

log4j.appender.appenderName=fully.qualified.name.of.appender.class

log4j.appender.appenderName.option1=value1

…log4j.appender.appenderName.optionN=valueN

也可以自己实现Appender接口, 这样就为日志的输出提供了相当大的便利。





这里我们来举几个例子,熟悉下常用的日志输出。



  • 1,输出到控制台

控制台是最常用的输出地,前面的一系列博客我们用的例子都是在控制台输出。控制台输出实现类为org.apache.log4j.ConsoleAppender。

下面是一份比较完整的log4j.properties配置文件:

og4j.rootLogger=DEBUG,console

# 以下是rootLogger的配置,子类默认继承,但是子类重写下面配置=rootLogger+自己配置,我晕
#输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
#设置输出样式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
#日志输出信息格式为
log4j.appender.console.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n
#DEBUG以上级别输出,Threshold,入口,临界值
#log4j.appender.console.Threshold=DEBUG
#日志编码方式
#log4j.appender.console.Encoding=UTF-8
#是否立即输出
#log4j.appender.console.ImmediateFlush=true
#使用System.error作为输出
#log4j.appender.console.Target=System.error

关于上面这份配置文件,有3点解释:

1,我们在实际的配置文件中,"#"注释必须另起一行

2,控制台输出需要配置layput属性,最常用的就是正则表达式格式。还有一些可选的属性,一般实际中不会怎么用到,Encoding设置编码方式,ImmediateFlush设置是否缓存,Target设置输出到System.out还是System.err。

3,Threshold用来设置该Appender的级别,只对本Appender生效。所有的Appender都可通过设置Threshold来设置本Appender的启用级别。



  • 2,输出到文件

文件输出FileAppender把日志输出到指定的文件中,文件输出的实现类为org.apache.log4j.FileAppender,配置时候需要用File指定文件名称。当然,这个路径可以使用相对路径,也可以使用绝对路径。

下面一份文件输出的log4j.properties的配置文件:

log4j.category.org.linkinpark.commons.logtest1=ERROR,file
log4j.rootLogger=DEBUG,console # 以下是rootLogger的配置,子类默认继承,但是子类重写下面配置=rootLogger+自己配置,我晕
#输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
#设置输出样式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
#日志输出信息格式为
log4j.appender.console.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n
#DEBUG以上级别输出,Threshold,入口,临界值
#log4j.appender.console.Threshold=DEBUG
#日志编码方式
#log4j.appender.console.Encoding=UTF-8
#是否立即输出
#log4j.appender.console.ImmediateFlush=true
#使用System.error作为输出
#log4j.appender.console.Target=System.error #输出到文件(这里默认为追加方式)
log4j.appender.file=org.apache.log4j.FileAppender
#输出文件位置
log4j.appender.file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/log4j.log
log4j.appender.file.Append=true
#样式为TTCCLayout
#log4j.appender.file.layout=org.apache.log4j.TTCCLayout
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n

关于上面的配置文件我这里解释一下:

1,可选参数Append配置是否在源文件内容的基础上追加日志。如果是false,Logger初始化会先情清掉文件内容,也就是说每次重启程序,原来的日志就会丢失。如果为true,日志文件就会越来越大。默认为true。

2,我们上面用category属性来重新定义我们的自己的logtest1包下面的日志输出,然后指定日志输出到/Users/LinkinPark/WorkSpace/linkin-log-test/log/log4j.log文件中。

现在我们来检查下控制台输出没有问题,category继承了默认的rootLogger在控制台输出了,而且还在我们上面指定的路径下的日志文件中追加进去了日志内容。

➜  WorkSpace  cd linkin-log-test
➜ linkin-log-test ls
pom.xml src target
➜ linkin-log-test pwd
/Users/LinkinPark/WorkSpace/linkin-log-test
➜ linkin-log-test ls
log pom.xml src target
➜ linkin-log-test cd log
➜ log ls
log4j.log
➜ log more log4j.log
[2016-02-23 09:52:48]-[main-ERROR]-[org.linkinpark.commons.logtest1.Log4jTest1-logTest(30)]: error级别的日志输出
[2016-02-23 09:52:48]-[main-FATAL]-[org.linkinpark.commons.logtest1.Log4jTest1-logTest(31)]: fatal级别的日志输出
[2016-02-23 09:52:48]-[main-ERROR]-[org.linkinpark.commons.logtest1.Log4jTest1-logTest(38)]: 人工抛出一个异常
  • 3,输出到按大小滚动文件

按大小滚动文件输出RollingFileAppender把日志输出到指定的文件,文件达到指定的大小时,就会自动更名。按尺寸滚动文件输出类为org.apache.log4j.RollingFileAppender,需配置文件名称,文件的最大尺寸。

下面是一份配置文件:

log4j.category.org.linkinpark.commons.logtest1=ERROR,file,rolling_file
log4j.rootLogger=DEBUG,console # 以下是rootLogger的配置,子类默认继承,但是子类重写下面配置=rootLogger+自己配置,我晕
#输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
#设置输出样式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
#日志输出信息格式为
log4j.appender.console.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n
#DEBUG以上级别输出,Threshold,入口,临界值
#log4j.appender.console.Threshold=DEBUG
#日志编码方式
#log4j.appender.console.Encoding=UTF-8
#是否立即输出
#log4j.appender.console.ImmediateFlush=true
#使用System.error作为输出
#log4j.appender.console.Target=System.error #输出到文件(这里默认为追加方式)
log4j.appender.file=org.apache.log4j.FileAppender
#输出文件位置
log4j.appender.file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/log4j.log
#是否在原日志基础上追加输出日志。true,默认,追加。false,清掉原来日志重新添加
log4j.appender.file.Append=true
#样式为TTCCLayout
#log4j.appender.file.layout=org.apache.log4j.TTCCLayout
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n #按大小滚动文件(这里默认为追加方式)
log4j.appender.rolling_file=org.apache.log4j.RollingFileAppender
#输出文件位置
log4j.appender.rolling_file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/rolling_log4j.log
log4j.appender.rolling_file.Append=true
#文件达到最大值自动更名
log4j.appender.rolling_file.MaxFileSize=1KB
#最多备份100个文件
log4j.appender.rolling_file.MaxBackupIndex=100
log4j.appender.rolling_file.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling_file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n

关于上面的配置文件解释如下:

1,配置的滚动文件名为rolling_log4j,该文件在/Users/LinkinPark/WorkSpace/linkin-log-test/log/rolling_log4j.log路径中,我们设置了文件最大为1K。当rolling_log4j.log达到1K时,就会自动更名为rolling_log4j.log.1,rolling_log4j.log.2,rolling_log4j.log.3....直到rolling_log4j.log.100。

2,Logger支持多个Appender,用逗号将多个Appender名字隔开即可。

多次运行我们自己写的测试类,会发现rolling_log4j.log文件在滚动。下面我贴出具体的文件日志输出:

➜  linkin-log-test  cd log
➜ log ls -l
total 16
-rw-r--r-- 1 LinkinPark staff 1110 2 23 10:17 log4j.log
-rw-r--r-- 1 LinkinPark staff 364 2 23 10:17 rolling_log4j.log
➜ log ls -l
total 16
-rw-r--r-- 1 LinkinPark staff 1850 2 23 10:18 log4j.log
-rw-r--r-- 1 LinkinPark staff 0 2 23 10:18 rolling_log4j.log
-rw-r--r-- 1 LinkinPark staff 1092 2 23 10:18 rolling_log4j.log.1
➜ log ls -l
total 24
-rw-r--r-- 1 LinkinPark staff 2220 2 23 10:18 log4j.log
-rw-r--r-- 1 LinkinPark staff 364 2 23 10:18 rolling_log4j.log
-rw-r--r-- 1 LinkinPark staff 1092 2 23 10:18 rolling_log4j.log.1
➜ log ls -l
total 24
-rw-r--r-- 1 LinkinPark staff 2590 2 23 10:19 log4j.log
-rw-r--r-- 1 LinkinPark staff 728 2 23 10:19 rolling_log4j.log
-rw-r--r-- 1 LinkinPark staff 1092 2 23 10:18 rolling_log4j.log.1
➜ log ls -l
total 24
-rw-r--r-- 1 LinkinPark staff 2960 2 23 10:19 log4j.log
-rw-r--r-- 1 LinkinPark staff 0 2 23 10:19 rolling_log4j.log
-rw-r--r-- 1 LinkinPark staff 1092 2 23 10:19 rolling_log4j.log.1
-rw-r--r-- 1 LinkinPark staff 1092 2 23 10:18 rolling_log4j.log.2



  • 4,输出到按日志滚动文件

按日期滚动文件输出DailyRollingFileAppender将日志输出到指定的文件,当日期发生变化时,会将文件按照指定的日期格式自动改名。日期滚动文件输出类为org.apache.log4j.DailyRollingFileAppender。

配置文件如下:

log4j.category.org.linkinpark.commons.logtest1=ERROR,file,rolling_file,daily_rolling_file
log4j.rootLogger=DEBUG,console # 以下是rootLogger的配置,子类默认继承,但是子类重写下面配置=rootLogger+自己配置,我晕
#输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
#设置输出样式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
#日志输出信息格式为
log4j.appender.console.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n
#DEBUG以上级别输出,Threshold,入口,临界值
#log4j.appender.console.Threshold=DEBUG
#日志编码方式
#log4j.appender.console.Encoding=UTF-8
#是否立即输出
#log4j.appender.console.ImmediateFlush=true
#使用System.error作为输出
#log4j.appender.console.Target=System.error #输出到文件(这里默认为追加方式)
log4j.appender.file=org.apache.log4j.FileAppender
#输出文件位置
log4j.appender.file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/log4j.log
#是否在原日志基础上追加输出日志。true,默认,追加。false,清掉原来日志重新添加
log4j.appender.file.Append=true
#样式为TTCCLayout
#log4j.appender.file.layout=org.apache.log4j.TTCCLayout
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n #按大小滚动文件(这里默认为追加方式)
log4j.appender.rolling_file=org.apache.log4j.RollingFileAppender
#输出文件位置
log4j.appender.rolling_file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/rolling_log4j.log
log4j.appender.rolling_file.Append=true
#文件达到最大值自动更名
log4j.appender.rolling_file.MaxFileSize=1KB
#最多备份100个文件
log4j.appender.rolling_file.MaxBackupIndex=100
log4j.appender.rolling_file.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling_file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n #按日期滚动文件
log4j.appender.daily_rolling_file=org.apache.log4j.DailyRollingFileAppender
#输出文件位置
log4j.appender.daily_rolling_file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/daily_rolling_log4j.log
#文件滚动日期格式
log4j.appender.daily_rolling_file.DatePattern=.yyyy-MM-dd
log4j.appender.daily_rolling_file.layout=org.apache.log4j.PatternLayout
log4j.appender.daily_rolling_file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n

关于上面的配置文件解释如下:

1,上面的配置中,我们新添加DailyRollingFileAppender类型的Appender。我们的日志文件名称为daily_rolling_file,日期格式为yyyy-MM-dd。进入到新的一天后,文件就会被自动更名,格式为daily_rolling_file.2008-08-08。

每天:’.’YYYY-MM-dd(默认)

2.       每星期:’.’YYYY-ww

3.       每月:’.’YYYY-MM

4.       每隔半天:’.’YYYY-MM-dd-a

5.       每小时:’.’YYYY-MM-dd-HH

6.       每分钟:’.’YYYY-MM-dd-HH-mm

2,这种配置也是可能我们在实际编码中最常用到的,项目发布到服务器上然后每天生成一个日志文件。



OK,上面我整理了最常用的几种Appender,他们就是ConsoleAppender(控制台),FileAppender(文件),RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),DailyRollingFileAppender(每天产生一个日志文件)。剩下的几种我们一般不会用到,这里也就不做赘述了。现在我们来整理下这4种Appender的关系。

上面的4种Appender都实现了Appender接口,然后ConsoleAppender和FileAppender同级别,FileAppender之下衍生出了2个子类RollingFileAppender,DailyRollingFileAppender。关于这些我会在后面的源码系列中仔细的整理到的。



Log4j扩展使用--输出地Appender的更多相关文章

  1. Log4j详细介绍(五)----输出地Appender

    Appender表示日志输出到什么地方,常用的输出地有控制台,文件,数据库,远程服务器等.Log4j中内置了常用的输出地,一般情况下配置一下即可使用.所有的Appender都实现自org.apache ...

  2. Log4j扩展使用--日志记录器Logger

    OK,现在我们认真的研究下Logger的配置,进行相关配置扩展. Log4j有三个主要的组件:Loggers(记录器),Appenders(输出源)和Layouts(布局).其中,Logger负责记录 ...

  3. Log4j扩展使用--自定义输出

    写在前面的话 log4j支持自定义的输出.所有的输出都实现了自Appender接口.一般来说,自定义输出值需要继承AppenderSkeleton类,并实现几个方法就可以了. 写这篇博客,我主要也是想 ...

  4. Log4j源码解析--Appender接口解析

    本文转自上善若水的博客,原文出处:http://www.blogjava.net/DLevin/archive/2012/07/10/382676.html.感谢作者的无私的分享. Appender负 ...

  5. Log4j扩展使用--日志格式化器Layout

    Layout:格式化输出日志信息 OK,前面我已经知道了.Appender必须使用一个与之相关联的Layout,这样才能知道怎样格式化输出日志信息. 日志格式化器Layout负责格式化日志信息,方法l ...

  6. 如何自建appender扩展Log4j框架

    1.log4j 概述 log4j 环境包括三个主要组件: logger(日志记录器):控制要启用或禁用哪些日志记录语句.可以对日志记录器指定如下级别: ALL . DEBUG . INFO . WAR ...

  7. log4j配置日志文件log4j.appender.R.File相对路径方法

    方法一. 解决的办法自然是用相对路径代替绝对路径,其实log4j的FileAppender本身就有这样的机制,如:log4j.appender.logfile.File=${WORKDIR}/logs ...

  8. 扩展Log4j支持JNDI数据源

    log4j.properties配置文件: log4j.rootLogger=INFO,db #使用log4j扩展支持JNDI数据源 log4j.appender.db=com.qdgswx.log4 ...

  9. log4j.appender.file.DatePattern

    DailyRollingFileAppender是日志记录软件包Log4J中的一个Appender,它能够按一定的频度滚动日志记录文件. 我们可以按下面的方式配置DailyRollingFileApp ...

随机推荐

  1. 安卓电量优化之JobScheduler使用介绍

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.JobScheduler概述 JobScheduler是安卓5.0版本推出的API,允许开发者在符合某些条件时创建执行在后台的任务.在Andro ...

  2. 【转】Jenkins 安装与配置

    基本配置: 1.Linux安装配置jdk环境 1.1.上传到 Linux 服务器:例如: 上传至: cd /usr/local 1.2.解压: rpm -ivh jdk-8u111-linux-x64 ...

  3. HashMap源码阅读

    HashMap是Map家族中使用频度最高的一个,下文主要结合源码来讲解HashMap的工作原理. 1. 数据结构 HashMap的数据结构主要由数组+链表+红黑树(JDK1.8后新增)组成,如下图所示 ...

  4. myeclipse 扩展内存大小

    工具中修改设置Default VM ArgumentsWindows-> Preferences->Java->Installed JREs,点击右侧的jdk,然后点击"E ...

  5. request拿各种东西

    例如 : http://localhost:8080/projectName/aaa/bbb?name=zhangsan获取项目名(目录) /projectNameString uri = reque ...

  6. JAVA入门 面向对象

    主要内容 1.类和对象的概念 2.什么是面向对象 3.什么对象的属性方法 4.何谓对象引用 5.实例化 类和对象的概念 万物皆对象,客观存在的事物皆为对象.我们大到名胜古迹,小道生活中的一件物品,例如 ...

  7. 用Windbg来分析.Net程序的dump

    介绍 1. 什么是Windbg WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件. WinDbg是微 ...

  8. Android 屏幕刷新机制

    这次就来梳理一下 Android 的屏幕刷新机制,把我这段时间因为研究动画而梳理出来的一些关于屏幕刷新方面的知识点分享出来,能力有限,有错的地方还望指点一下.另外,内容有点多,毕竟要讲清楚不容易,所以 ...

  9. 连接WiFi工具类

    public class WifiConnect { WifiManager wifiManager; // 构造函数 public WifiConnect(WifiManager wifiManag ...

  10. CSS3中nth-of-type和nth-last-of-type

    1.使用nth-child和nth-last-child时会产生的问题 在使用nth-child和nth-last-child时,其计算子元素是奇数个元素还是第偶数个元素时,是连同父元素中的所有子元素 ...