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. Visual Studio 中添加SQLite数据源

    相关下载:https://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki 在Visual Studio中要支持访问SQLi ...

  2. 【Dijkstra堆优化】洛谷P2243电路维修

    题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和James,可是一直也没能给 ...

  3. windows 下进程池的操作

    在Windows上创建进程是一件很容易的事,但是在管理上就不那么方便了,主要体现在下面几个方面: 1. 各个进程的地址空间是独立的,想要在进程间共享资源比较麻烦 2. 进程间可能相互依赖,在进程间需要 ...

  4. cyclictest 简介

    1. cyclictest 简介以及安装 1.1 cyclictest 简介 cyclictest 是什么? 看名字应该就能大致猜出来它是一种 test 程序,Cyclictest的维基主页这么介绍它 ...

  5. cs231n spring 2017 lecture15 Efficient Methods and Hardware for Deep Learning 听课笔记

    1. 深度学习面临的问题: 1)模型越来越大,很难在移动端部署,也很难网络更新. 2)训练时间越来越长,限制了研究人员的产量. 3)耗能太多,硬件成本昂贵. 解决的方法:联合设计算法和硬件. 计算硬件 ...

  6. 让两个数x,y一直保持互质的模版

    int gcd(int x,int y) { )return x; else return gcd(y,x%y); }

  7. Codeforces Round #356 (Div. 1) C. Bear and Square Grid

    C. Bear and Square Grid time limit per test 3 seconds memory limit per test 256 megabytes input stan ...

  8. Scrum已经俘获中国开发者的心? ——从《2017年开发者调查报告》看真相!

    云栖社区通过为期两个月,对7032份有效调查问卷分析统计,2017年12月发布了首份<2017中国开发者调查报告>.报告显示,37.3%的开发者表示,协作工具主要来自企业内部自研的协作工具 ...

  9. PHP性能分析工具xhprof的安装使用与注意事项

    前言 xhprof由facebook开源出来的一个PHP性能监控工具,占用资源很少,甚至能够在生产环境中进行部署. 它可以结合graphviz使用,能够以图片的形式很直观的展示代码执行耗时. 下面主要 ...

  10. 坑爹的file_exists

       介绍   我发现了一个问题,今天与大家分享.我把整个过程描述一下.   问题   公司有个框架是基于smarty写的,我负责php的升级,维护人员把新环境布上来之后,测试人员找我提出经常报错(错 ...