appender log4j 扩展_Log4j扩展使用--输出地Appender

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。关于这些我会在后面的源码系列中仔细的整理到的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2017c语言考核册答案,2017年电大《C语言程序设计》形成性考核册答案.doc

C语言程序设计形成性作业一1.?????? 在每个C语言程序中都必须包含有这样一个函数,该函数的函数名为( A )。A.main B.MAIN C.name D.funtion2.C语言原程序文件的缺省扩展名为( D )。A.cpp …

python max取下标_Python 变量类型总结

变量存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个空间。基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。因此,变量可以指定不同的数据类型,这些变量可以存储整数,小数或…

mybatis支持驼峰自动转换sql吗_SpringBoot整合mybatis——配置mybatis驼峰命名规则自动转换...

一、简述mybatis驼峰式命名规则自动转换:使用前提:数据库表设计按照规范“字段名中各单词使用下划线"_"划分”;使用好处:省去mapper.xml文件中繁琐编写表字段列表与表实体类属性的映射关系,即resultMap。示例…

c语言存储大范围整形,C语言整形数值范围问题

有符号二进制数的表示是这样的&#xff1a;如果计算机的字长为n位&#xff0c;n位二进制数的最高位为符号位。其余n-1位为数值位&#xff0c;采用补码表示法时&#xff0c;可表示的数X的范围是 -2的(n-1)次幂 < X < 2的(n-1)次幂-1。如果字长是16位&#xff0c;补码表示的…

vue修改计算属性的值_Vue语法高级之计算属性和侦听器

计算属性和侦听器都可以监听到data区数据的变化&#xff0c;当数据变化时可以触发方法的调用&#xff0c;从而在方法内部可以进行相应的逻辑处理。计算属性的语法格式是&#xff1a;computed: {}侦听器的语法格式是&#xff1a;watch: {}一、计算属性计算属性一般是为了简化模板…

三次hermite插值多项式例题_2点三次Hermite插值多项式解析.ppt

2点三次Hermite插值多项式解析1.问题的提法 分段三次Hermite插值多项式存在唯一 三.分段三次Hermite插值 2.分段三次Hermite插值的表达式 当 x∈[xi&#xff0c;xi1]时, 两点Hermite插值 ( i 0,1,2,,n-1) 定理&#xff1a; 设 f(x)在[a,b]上具有四阶连续导数&#xff0c;S3(x)是…

sqlserver查看索引_SQL Server页中行物理存储

SQL Server页有很多类型&#xff1a;1 – 数据页. 记录堆或者聚集索引叶子级的数据2 – 索引页. 用于保存聚集索引中的中间页和根页&#xff0c;或者非聚集索引的所有页3 – text mix page. A text page that holds small chunks of LOB values plus internal parts of text tr…

华为畅享max有没有人脸识别_华为手机有人脸识别功能吗?

展开全部华为5X有的1、请插e5a48de588b63231313335323631343130323136353331333365633837入手机卡&#xff0c;开启数据业务。第一次使用“人脸解锁”功能时&#xff0c;需要连接网络之后才可以激活。所以当第一次进入系统设置->安全->屏幕锁定中&#xff0c;可能会不能马…

c 语言 结构体 编程,C语言:结构体的编程问题(很简单)

C语言&#xff1a;结构体的编程问题(很简单)答案:2 信息版本&#xff1a;手机版解决时间 2020-07-25 02:18已解决2020-07-24 02:27先定义一个结构体Student&#xff0c;它包含四个成员&#xff1a;学号(number)、姓名(name)、电话(telphone)、地址(address)&#xff0c;然后定…

gin 怎么通过 post 发送结构体_Go Web 框架 Gin 实践12—优化配置结构及实现图片上传...

Go语言中文网&#xff0c;致力于每日分享编码、开源等知识&#xff0c;欢迎关注我&#xff0c;会有意想不到的收获&#xff01;项目地址&#xff1a;https://github.com/EDDYCJY/go-gin-example如果对你有所帮助&#xff0c;欢迎点个 Star 前言一天&#xff0c;产品经理突然跟你…

python次方运算_neg__python 魔术方法1 运算符重载

python中存在一些特殊的方法&#xff0c;这些方法通常采用格式&#xff1a;__method__()。这些方法会在特定的情况下自动调用。例如&#xff1a;__new__()、__init__()、__del__() 等生命周期方法。正是这些特殊方法&#xff0c;构建了python的语言风格。特殊方法有很多&#x…

resnet50网络结构_AAAI2020 | 利用网络结构关系加速NAS+Layer

这是我在海康威视研究院实习的工作&#xff0c;被AAAI-2020接收为Spotlight。论文地址&#xff1a;http://xxx.itp.ac.cn/pdf/2002.12580v1引子上一个阶段的网络结构搜索(NAS)研究&#xff0c;主要在两个方面。1)各类搜索方法&#xff0c;从强化学习、进化算法等到梯度下降&…

python 去除nan inf_Python实现半自动评分卡建模(附代码)

作者&#xff1a;Summer Memories个人公众号&#xff1a;风控汪的数据分析之路知乎专栏&#xff1a;小鑫的数据分析笔记这次分享一个自己写的python脚本&#xff0c;可以实现半自动化的评分卡建模。运行脚本时需要input已经预处理好的训练集和测试集数据&#xff0c;所以建模前…

国嵌c语言深度,国嵌C语言3部全

课程目录&#xff1a;国嵌 C语言深度剖析班&#xff1a;1课-基本数据类型分析2 auto,register,static分析3 if,switch,do,while,for分析4 goto,void,extern,sizeof分析5 const和volatile分析6 struct和union分析7课-enum和typedef分析8 注释符号9 接续符和转义符10 单引号和双引…

linux如何判断网线插入_“Linux”中如何判断哪个网卡连接网线?

展开全部【解决方法】1、ifconfig查看现在使用的网e68a84e8a2ad3231313335323631343130323136353331333365633935卡。2、ethtool命令查看网卡的具体信息,如eth0是连接状态&#xff0c;则正常使用。2、在ifconfig中可以看到有eth2这个网卡&#xff0c;但不知道是否连线&#xff…

单调有界定理适用于函数吗_《实变函数》——论有界变差函数

一日不见如隔三秋&#xff0c;本人觉得有界变差函数是实变函数中最容易理解且和高等数学联系最紧密的一个概念&#xff0c;其在概率论中也有非常广泛的应用&#xff0c;也和勒贝格空间有着千丝万缕的联系。什么叫有界变差函数&#xff1f;若在区间(a&#xff0c;b)中&#xff0…

msp430 c语言开发环境,如何使用C语言来编写MSP430的高质量代码

微处理器一般用于特定环境和特定用途,出于成本、功耗和体积的考虑&#xff0c;一般都要求尽量节省使用资源&#xff0c;并且&#xff0c;由于微处理器硬件一般都不支持有符号数、浮点数的运算&#xff0c;且运算位有限&#xff0c;因此&#xff0c;分配变量时必须仔细。另外要说…

oracle 增量设为3 循环_Oracle 差异性增量 和 累计增量 原理(转)

RMAN一个强大的功能是支持增量备份&#xff0c;增量备份中心思想就是减少备份的数据量&#xff0c;我们不需要在从头开始备份了&#xff0c;只需要备份自上次已备份之后的数据块即可。Oracle 9i 共有五种级别 0 1 2 3 4&#xff0c;0级最高-4级最低&#xff0c;0级是1级的基础以…

springboot redis 断线重连_Redis(9)——史上最强【集群】入门实践教程

一、Redis 集群概述Redis 主从复制到 目前 为止&#xff0c;我们所学习的 Redis 都是 单机版 的&#xff0c;这也就意味着一旦我们所依赖的 Redis 服务宕机了&#xff0c;我们的主流程也会受到一定的影响&#xff0c;这当然是我们不能够接受的。所以一开始我们的想法是&#xf…

智能指针的释放_看完这篇,别再说不会智能指针了

C智能指针一、智能指针的作用上一篇介绍了内存池的原理和实现&#xff0c;详情请见内存池设计与实现&#xff1b;内存池可以帮助我们有效的对内存进行管理&#xff0c;智能指针可以很方便的管理指针&#xff0c;避免出现内存泄漏&#xff1b;智能指针的作用智能指针的作用&…