如何自建log4j2 扩展 appenderr扩展Log4j框架

java自定义日志输出文件(log4j日志文件输出多个自定义日志文件)
字体:[ ] 类型:转载 时间:
打印日志的在程序中是必不可少的,如果需要将不同的日志打印到不同的地方,则需要定义不同的Appender,然后定义每一个Appender的日志级别、打印形式和日志的输出路径,下面看一个示例吧
log4j输出多个自定义日志文件如果在实际应用中需要输出独立的日志文件,怎样才能把所需的内容从原有日志中分离,形成单独的日志文件呢?
先看一个常见的log4j.properties文件,它是在控制台和test.log文件中记录日志:
代码如下:log4j.rootLogger=DEBUG, stdout, logfile&
log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n&
log4j.appender.logfile=org.apache.log4j.RollingFileAppenderlog4j.appender.logfile.File=log/test.loglog4j.appender.logfile.MaxFileSize=128MBlog4j.appender.logfile.MaxBackupIndex=3log4j.appender.logfile.layout=org.apache.log4j.PatternLayoutlog4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n
如果在同一类中需要输出多个日志文件呢?其实道理是一样的,先在Test.java中定义:
代码如下:private static Log logger1 = LogFactory.getLog("mylogger1");
private static Log logger2 = LogFactory.getLog("mylogger2");
log4j.properties中配置如下:
代码如下:log4j.logger.mylogger1=DEBUG,test1log4j.appender.test1=org.apache.log4j.FileAppenderlog4j.appender.test1.File=log/test1.loglog4j.appender.test1.layout=org.apache.log4j.PatternLayoutlog4j.appender.test1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n
log4j.logger.mylogger2=DEBUG,test2log4j.appender.test2=org.apache.log4j.FileAppenderlog4j.appender.test2.File=log/test2.loglog4j.appender.test2.layout=org.apache.log4j.PatternLayoutlog4j.appender.test2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n
不同日志要使用不同的logger(如输出到test1.log的要用("abc"))。
还有一个问题,就是这些自定义的日志默认是同时输出到log4j.rootLogger所配置的日志中的,如何能只让它们输出到自己指定的日志中呢?别急,这里有个开关:
log4j.additivity. mylogger1 = false
它用来设置是否同时输出到log4j.rootLogger所配置的日志中,设为false就不会输出到其它地方了。
但是这种方式有个小缺陷,那就是打印的日志中类名只能是mylogger或者mylogger2。
2 动态配置路径若程序需要的日志路径需要不断的变化,而又不可能每次都去改配置文件,此时可以利用环境变量来解决。
log4j的配置如下:
代码如下:log4j.rootLogger=DEBUG,INFOLOG,DEBUGLOG
#info logLOG =org.apache.log4j.DailyRollingFileAppenderLOG.File= ${log.dir}/${.file}LOG.DatePattern=.yyyy-MM-ddLOG.Threshold=INFOLOG.layout=org.apache.log4j.PatternLayoutLOG.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n #debug loglog4j.appender.DEBUGLOG =org.apache.log4j.RollingFileAppenderlog4j.appender.DEBUGLOG.File= ${log.dir}/${log.debug.file}log4j.appender.DEBUGLOG.Threshold=DEBUGlog4j.appender.DEBUGLOG.MaxFileSize=128MBlog4j.appender.DEBUGLOG.MaxBackupIndex=3log4j.appender.DEBUGLOG.layout=org.apache.log4j.PatternLayoutlog4j.appender.DEBUGLOG.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n
此时,在使用log打印日志之前,需要利用System定义日志的输出路径和文件名的环境变量:
代码如下:System.setProperty(“log.dir”, logDir);
System.setProperty(“.file”, infoLogFileName);
System.setProperty(“log.debug.file”, debugLogFileName);
附:Pattern参数的格式含义
%c 输出日志信息所属的类的全名
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },输出类似:- 22:10:28
%f 输出日志信息所属的类的类名
%l 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行
%m 输出代码中指定的信息,如log(message)中的message
%n 输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n”
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推
%r 输出自应用启动到输出该日志信息所耗费的毫秒数
%t 输出产生该日志事件的线程名
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具如何自建appender扩展Log4j框架_百度知道
如何自建appender扩展Log4j框架
提问者采纳
如果它丢失或者被破坏对于Windows 7来说将是灾难性的。
6.0进行测试。毫无疑问。笔者用Acronis Disk Director Suite 10,将Win7的引导文件保存在一个隐藏分区中无疑加强了其安全性,该隐藏分区中保存了系统的引导文件和磁盘的主引导分区信息,在Windows7的用户和组(lusrmgr。操作方法是、该分区中都有什么呢为了一探究竟。这是非常好理解的。由此可见。
4,没有磁盘卷标也没有分配驱动器号。然后又尝试了为administrator赋予“完全控制权限”;更改卷的驱动器号”。笔者以administrator登录系统,其磁盘状态描述为,这个大小为100MB或者200MB的隐藏分区对于Windows7至关重要.msc)中是没有该用户的。在删除的过程中发现,利用该工具删除了分区及其上面的数据、删除分区中是否影响系统启动呢通过磁盘管理器,笔者尝试“格式化”。该用户是Windows 7中特有的。重启系统。总的来说,另外还有两个隐藏文件bootmgr和BOOTSECT,我们刚才删除的文件与系统启动无关。既然系统工具不行,尝试“更改”或者“删除”驱动器号都显示“无法删除&#47。总结,然后点击其后的下拉列表从中选择F,为启动分区重新分配盘符的操作并没有修改系统的引导文件。
3,看看上述操作(添加盘符)是否会影响到Windows 7的启动,没有问题系统正常启动,右键单击选择“更改驱动器号和路径”弹出更改向导,为Windows 7中的这个特殊的隐藏分区添加驱动器号的过程是不可逆的、主分区,那试试第三方工具,其任务是单一的与系统安装有关。但是,系统无法启动、活动,在删除了该分区中的某些文件之后是否会影响系统启动,因为目标单一也容易成为攻击的对象,一定是出于对引导文件的保护。右键单击该分区选择“更改驱动器号和路径”。由此可见,Windows 7在该隐藏分区中保存了系统的引导文件。接下来打开“计算机”可看到一个新的磁盘分区F。因此:系统。显示“BOOTMBR is missing”即主引导扇区丢失。因为没有驱动器号.BAK,显示“文件正在使用”或者提示“没有删除权限”,其原因是改卷是系统或者启动卷,也没有修改磁盘引导扇区。
5,其中有些文件是无法删除的,而真正与系统启动相关的文件是无法删除的。可见,结果被拒绝。测试结果系统正常启动,笔者为其分配了一个驱动器号F、添加分区号后是否会影响系统启动呢接下来我们重启系统。下面我们看看,微软之所以将Windows 7的引导文件放在一个独立的隐藏分区中,它保存了系统引导文件和磁盘引导扇区的信息、“删除卷”均不能成功、能否将分区返回到隐藏模式呢既然隐藏分区是为了保护系统引导文件,所以在资源管理器中是不可见的。
2,最后“确定”退出即可,可见Windows 7对该分区的保护是做得很不错的:在磁盘管理器中选中该分区、删除分区中的文件是否影响系统启动呢下面我们尝试删除该分区中的系统引导文件会怎样,然后重启系统。经过测试发现就连system没有完全控制权限,建议大家不要为该隐藏分区分配驱动器号。可见。单击 “添加”按钮在弹出的对话框中点选“分配以下驱动器号”,下面我们进行测试看是否可以取消刚才为其赋予的驱动器号,进入该分区发现有两隐藏目录Boot和System Volume Information,进入F分区然后进行文件删除:通过上面的测试揭开了这个隐藏分区的神秘面纱,可见上述修改不会影响系统启动,只有TrusterInstaller用户才有完全控制权限、分区状态该分区的格式为NTFS热心网友 1,这样就能够在较大程度上杜绝人为或者病毒木马对其造成破坏
知道智能回答机器人
根据知道用户的观点和内容总结出特定问题的答案,为知道用户提供更好的问答体验。
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Log4j配置详解之log4j.xml - IT民工 - ITeye技术网站
博客分类:
Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可接key=value格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。
一、log4j.jar包下载地址:
二、配置文件类型:log4j配置文件可以是log4j.xml也可以是log4j.properties
log4j.xml配置说明
&?xml version="1.0" encoding="UTF-8"?&
&!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"&
&log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' &
&appender name="myConsole" class="org.apache.log4j.ConsoleAppender"&
&layout class="org.apache.log4j.PatternLayout"&
&param name="ConversionPattern"
value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" /&
&!--过滤器设置输出的级别--&
&filter class="org.apache.log4j.varia.LevelRangeFilter"&
&param name="levelMin" value="debug" /&
&param name="levelMax" value="warn" /&
&param name="AcceptOnMatch" value="true" /&
&/appender&
&appender name="myFile" class="org.apache.log4j.RollingFileAppender"&
&param name="File" value="D:/output.log" /&&!-- 设置日志输出文件名 --&
&!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 --&
&param name="Append" value="true" /&
&param name="MaxBackupIndex" value="10" /&
&layout class="org.apache.log4j.PatternLayout"&
&param name="ConversionPattern" value="%p (%c:%L)- %m%n" /&
&/appender&
&appender name="activexAppender" class="org.apache.log4j.DailyRollingFileAppender"&
&param name="File" value="E:/activex.log" /&
&param name="DatePattern" value="'.'yyyy-MM-dd'.log'" /&
&layout class="org.apache.log4j.PatternLayout"&
&param name="ConversionPattern"
value="[%d{MMdd HH:mm:ss SSS\} %-5p] [%t] %c{3\} - %m%n" /&
&/appender&
&!-- 指定logger的设置,additivity指示是否遵循缺省的继承机制--&
&logger name="com.runway.bssp.activeXdemo" additivity="false"&
&priority value ="info"/&
&appender-ref ref="activexAppender" /&
&!-- 根logger的设置--&
&priority value ="debug"/&
&appender-ref ref="myConsole"/&
&appender-ref ref="myFile"/&
&/log4j:configuration&
(1). 输出方式appender一般有5种:
org.apache.log4j.RollingFileAppender(滚动文件,自动记录最新日志)
org.apache.log4j.ConsoleAppender (控制台)
org.apache.log4j.FileAppender (文件)
org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件)
org.apache.log4j.WriterAppender (将日志信息以流格式发送到任意指定的地方)
(2). 日记记录的优先级priority,优先级由高到低分为
OFF ,FATAL ,ERROR ,WARN ,INFO ,DEBUG ,ALL。
Log4j建议只使用FATAL ,ERROR ,WARN ,INFO ,DEBUG这五个级别。
(3). 格式说明layout中的参数都以%开始,后面不同的参数代表不同的格式化信息(参数按字母表顺序列出):
输出所属类的全名,可在修改为 %d{Num} ,Num类名输出的维(如:"org.apache.elathen.ClassName",%C{2}将输出elathen.ClassName)
输出日志时间其格式为 %d{yyyy-MM-dd HH:mm:ss,SSS},可指定格式 如 %d{HH:mm:ss}
输出日志事件发生位置,包括类目名、发生线程,在代码中的行数
输出代码指定信息,如info(“message”),输出message
输出优先级,即 FATAL ,ERROR 等
输出从启动到显示该log信息所耗费的毫秒数
输出产生该日志事件的线程名
log4j.xml配置文件节点详解
xml declaration and DTD
xml配置文件的头部包括两个部分:xml声明和DTD声明。头部的格式如下:
&?xml version="1.0" encoding="UTF-8" ?&
&!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"&
log4j:configuration (root element)
xmlns:log4j [#FIXED attribute] : 定义log4j的名字空间,取定值"http://jakarta.apache.org/log4j/"
appender [* child] : 一个appender子元素定义一个日志输出目的地
logger [* child] : 一个logger子元素定义一个日志写出器
root [? child] : root子元素定义了root logger
appender元素定义一个日志输出目的地。
name [#REQUIRED attribute] : 定义appender的名字,以便被后文引用
class [#REQUIRED attribute] : 定义appender对象所属的类的全名
param [* child] : 创建appender对象时传递给类构造方法的参数
layout [? child] : 该appender使用的layout对象
layout元素定义与某一个appender相联系的日志格式化器。
class [#REQUIRED attribute] : 定义layout对象所属的类的全名
param [* child] : 创建layout对象时传递给类构造方法的参数
logger元素定义一个日志输出器。
name [#REQUIRED attribute] : 定义logger的名字,以便被后文引用
additivity [#ENUM attribute] : 取值为"true"(默认)或者"false",是否继承父logger的属性
level [? child] : 定义该logger的日志级别
appender-ref [* child] : 定义该logger的输出目的地
root元素定义根日志输出器root logger。
param [* child] : 创建root logger对象时传递给类构造方法的参数
level [? child] : 定义root logger的日志级别
appender-ref [* child] : 定义root logger的输出目的地
level元素定义logger对象的日志级别。
class [#IMPLIED attribute] : 定义level对象所属的类,默认情况下是"org.apache.log4j.Level类
value [#REQUIRED attribute] : 为level对象赋值。可能的取值从小到大依次为"all"、"debug"、"info"、"warn"、"error"、"fatal"和"off"。当值为"off"时表示没有任何日志信息被输出
param [* child] : 创建level对象时传递给类构造方法的参数
appender-ref
appender-ref元素引用一个appender元素的名字,为logger对象增加一个appender。
ref [#REQUIRED attribute] : 一个appender元素的名字的引用
appender-ref元素没有子元素
param元素在创建对象时为类的构造方法提供参数。它可以成为appender、layout、filter、errorHandler、level、categoryFactory和root等元素的子元素。
name and value [#REQUIRED attributes] : 提供参数的一组名值对
param元素没有子元素
在xml文件中配置appender和layout
创建不同的Appender对象或者不同的Layout对象要调用不同的构造方法。可以使用param子元素来设定不同的参数值。
创建ConsoleAppender对象
ConsoleAppender的构造方法不接受其它的参数。
... ... ... ...
&appender name="console.log" class="org.apache.log4j.ConsoleAppender"&
&layout ... &
&/appender&
... ... ... ...
创建FileAppender对象
可以为FileAppender类的构造方法传递两个参数:File表示日志文件名;Append表示如文件已存在,是否把日志追加到文件尾部,可能取值为"true"和"false"(默认)。
... ... ... ...
&appender name="file.log" class="org.apache.log4j.FileAppender"&
&param name="File" value="/tmp/log.txt" /&
&param name="Append" value="false" /&
&layout ... &
&/appender&
... ... ... ...
创建RollingFileAppender对象
除了File和Append以外,还可以为RollingFileAppender类的构造方法传递两个参数:MaxBackupIndex备份日志文件的个数(默认是1个);MaxFileSize表示日志文件允许的最大字节数(默认是10M)。
... ... ... ...
&appender name="rollingFile.log" class="org.apache.log4j.RollingFileAppender"&
&param name="File" value="/tmp/rollingLog.txt" /&
&param name="Append" value="false" /&
&param name="MaxBackupIndex" value="2" /&
&param name="MaxFileSize" value="1024" /&
&layout ... &
&/appender&
... ... ... ...
创建PatternLayout对象
可以为PatternLayout类的构造方法传递参数ConversionPattern。
... ... ... ...
&layout class="org.apache.log4j.PatternLayout&
&param name="Conversion" value="%d [%t] %p - %m%n" /&
... ... ... ...
验证中.....
浏览 16720
zengxiantao
浏览: 19690 次
来自: 天津Log4j 2.x架构 - ImportNew
| 标签: ,
Log4j 2中所使用的类如下图所示。ImportNew注:如果你对Log4j 2不了解,建议阅读这篇文章《》。
使用Log4J 2 API的程序可以根据特定名称向LogManager请求Logger。LogManager将会定位到合适的LoggerContext,然后从中取得Logger。如果需要创建Logger,创建过程会关联到一个特定的LoggerConfig,这个LoggerConfig的名字a)与Logger相同,b)与Logger所属包的名字相同,c)与根层LoggerConfig名字相同。LoggerConfig对象根据配置中的Logger声明创建而成,与传输LogEvent的Appender关联在一起。
Logger层级
相比于一般的System.out.println, 任何日志API首要的优点在于它能够禁用特定的日志语句同时还不影响其它的打印功能。这种功能假设的前提是日志空间,即所有可能的日志语句的空间,按照开发者选定的标准来分类。
Logger 层级在Log4j 1.x中通过Logger之间的关系来维护。在Log4j 2中 不再使用这种关系,替代它的是通过LoggerConfig对象之间的关系来维护Logger层级。
Loggers 和 LoggerConfigs 是带有名字的实体。Logger名字对大小写敏感,遵循下列层级命名规则:
如果一个LoggerConfig的名字加点号(.)是另一个LoggerConfig名字的前缀,那么前一个LoggerConfig就是后一个LoggerConfig 的祖先。如果一个LoggerConfig和它的子层之间没有其他祖先,那么就称它是这个子层的父亲。
例如,名字为“com.foo”的LoggerConfig是名字为“com.foo.Bar”的LoggerConfig的父层。类似地,”Java”是”Java.util”的父层同时还是“java.util.Vector”的祖先层。大多数的开发人员应该很熟悉这种命名框架。
根层LoggerConfig处于LoggerConfig层级的顶端。它的独特之处在于一直存在而且是每个层级的一部分。与根层LoggerConfig关联的Logger可以这样获得:
Logger logger = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
其它的Logger都可以通过将期望的Logger的名字传入静态方法来获取。可以从获取更多日志API的信息。
LoggerContext
LoggerContext在日志系统中起锚的作用。根据具体情况,程序中有可能使用多个激活的LoggerContext。 从查看关于LoggerContext的详细信息。
Configuration
每个LoggerContext有一个活动的Configuration与之对应。这个Configuration包含多有的Appender、上下文 Filter、LoggerConfig还包括对StrSubstitutor的引用。在重新配置过程中,会有两个Configuration对象同时存在。一旦所有Loggers重定向到新的Configuration,旧的Configuration就会停止和丢弃。
正如前文所述,Logger通过调用 创建。Logger本身不执行直接动作,仅仅只有一个名字与一个LoggerConfig关联,继承 并实现了所需的方法。当Configuration改变时,Logger有可能关联到另一个不同的LoggerConfig,如此一来,就会导致它们的行为发生变化。
获得Logger
使用相同的名字调用getLogger方法总是返回同一个Logger对象的引用。
Logger x = Logger.getLogger(&wombat&);
Logger y = Logger.getLogger(&wombat&);
x 和 y 完全指向同一个Logger对象。
Log4j环境配置在程序初始化时就已经完成。 首选的配置方式是读取配置文件。中讨论。
借助Log4j可以很容易使用组件来给Logger命名。在每个类中使用此类的全名来实例化一个Logger就可以实现这个目的。这种定Logger的方法既有用又直观明了。由于输出的日志包含创建Logger所用的名字,所以通过这种命名策略很容易就区分出日志信息的来源。虽然这种方式很常用,但这只是给Logger命名的一种方式。Log4j对Logger的设置没有任何限制。程序员可以按照自己的方式来给Logger命名。
然而,根据Logger所在类的名字来命名看起来是目前为止最好的方式。
LoggerConfig
在logging配置中声明Logger后,LoggerConfig对象就被创建出来,其中包含一组过滤器,LogEvent在传入任何Appander之前会经过这些过滤器。LoggerConfig还包含了Appender集合的引用,这些Appander用来处理事件。
LoggerConfigs 会指定一个日志等级。等级集合包括(TRACE、DEBUG、INFO、WARN、ERROR和FATAL)。需要注意的是,在Log4j2中,Level是枚举类型不能被继承。对于那些对日志粒度更高的用户,建议采用Marker。
Log4j 1.x和Logback都有“层级继承”的概念。在Log4j 2中,由于Logger和LoggerConfig是两个不同的对象,因此“层级继承”的实现也有所不同。每个Logger引用适当的LoggerConfig,后者可以依次引用它的父层,从而达到相同的效果。
下面5个表格包括了各种等级(Level)值和与记录器(Logger)相关联的结果等级(resulting level)。需要注意的是,对于所有这些情况如果跟层LoggerConfig没有进行设置,那么会指定一个默认等级。
Logger名称
指定的LoggerConfig
上面的例1只对root logger配置并指定Log等级。其它的Logger都引用此 root LoggerConfig并使用这个Log等级。
Logger名称
指定的LoggerConfig
例2中,所有的logger都配置了LoggerConfig,分别在这些LoggerConfig中设置了各自的Log等级。
Logger名称
指定的LoggerConfig
例3中,root、X 和 X.Y.Z每个都配置了相同名字的LoggerConfig。Logger X.Y没有与其名字相匹配的LoggerConfig,之所以使用 LoggerConfig X作为配置,因为这个LoggerConfig的名字(X )是Logger名字(X.Y)的起始最长匹配。
Logger 名称
指定的LoggerConfig
例4中,记录器(Logger) root and X 都配置了相同名字的LoggerConfig。而记录器(Logger) X.Y 和 X.Y.Z 与其名字相匹配的LoggerConfig,之所以从LoggerConfig X 中获取自己等级,因为这个LoggerConfig的名字(X )是这两个记录器(Logger)名字(X.Y和X.Y.Z )的起始最长匹配。
Logger 名称
指定的LoggerConfig
例5中,记录器(Logger)root.X, X.Y
都有相同名字的LoggerConfig。而记录器(Logger) X.YZ 与其名字相匹配的LoggerConfig,之所以从LoggerConfig X 中获取自己等级,因为这个LoggerConfig的名字(X )是它的名字(X.YZ)的起始最长匹配。没有使用LoggerConfig X.Y 作为配置,是因为点之后(向右)的匹配必须准确无误。
接下来的表格阐述Lever过滤器如何工作。竖直方向抬头Event等级,水平方向抬头是与适当LoggerConfig相关的等级。交点表示LogEvent是否继续接受处理(Yes)还是丢弃(No)。
Event Level
LoggerConfig Level
前面描述了自动日志等级过滤如何进行,除此之外Log4j还提供了其它的过滤器,这些过滤器可以在下面情况下使用到 :控制权交给任何LoggerConfig之前,控制权交给LoggerConfig之后任何Appender调用之前,控制权交给LoggerConfig之后任何Appender调用之前以及每个Appender调用的时候。 工作方式与防火墙过滤器非常类似,有三种返回值:接受、拒绝或者中立 ,每个过滤器返回其中之一。接受表示表示不应该再调用其他的过滤器并且继续处理该事件。拒绝表示时间立即忽略该事件并且把控制权交还给调用者。中立表示应该把该事件传递个其他过滤器。如果没有别的过滤器可用,就将其处理。
尽管事件能被过滤器接收,但也可能没有记录下来。当之前的LoggerConfig过滤器接受了 一个事件,而LoggerConfig或所有的Appender拒绝了此事件,这种情况就会发生。
基于Logger能够选择性地启用或禁止日志请求只是Appender蓝图的一部分。Log4j允许日志请求打印到多个目标,Log4j中的Appender正是所谓的输出目标。目前,Appender已应用于控制台、文件、远程套接字服务器、Apache Flume、JMS以及远程UNIX系统日志守护进程。多个Appender可以依附到同一个过滤器中。
通过调用当前配置的 方法可以将Appender加入Logger中。如果没有与Logger的名字相匹配的LoggerConfig存在创建一个,Appender就依附在这个LoggerConfig上,然后通知所有的Logger更新他们引用的LoggerConfig。
对于给定的Logger,每个活动日志请求都会交给这个Logger的LoggerConfig以及它父层的所有appender。也就是说,Appender是从LoggerConfig层级相加继承而来。例如,如果在根层Logger中加入控制台appender,那么所有活动日志请求至少都会打印到控制台。在此基础上,如果在名字为C的LoggerConfig加入文件appender,那么对C以及C的子层所有活动日志请求都会打印到文件和控制台。通过在配置文件的Logger声明里设置additivity=”false”可以改变默认行为,从而使得Appender积累不再具备可加性。
控制appender可加性的规则总结如下:
Appender 可加性
记录器(Logger)L日志语句将输出到L所关联的LoggerConfig以及这个LoggerConfig祖先的所有Appender。这就是“appender可加性”的含义。但是,如果L所关联的LoggerConfig的祖先P的可加性标志设置为false,那么L将直接输出到L所关联的LoggerConfig以及其祖先一直到P的所有appender,但不会输出到P的祖先的任何Appender。
Logger的可加性标志默认为 true
下表可以作为一个示例:
Logger名称
添加的Appenders
Additivity标志
not applicable 不可用
The root logger has no parent so additivity does not apply to it. 根层Logger没有父层,因此没有可加性。
A-x1, A-x2
A1, A-x1, A-x2
Appenders of “x” and root “x” 根层root 的 Apender.
A1, A-x1, A-x2
Appenders of “x” and root. “x” 和root的Appender. 定义了Logger却不指定Appender,这种情况比较少见。
A1, A-x1, A-x2, A-xyz1
Appenders of “x.y.z”, ”x” and root “x.y.z”, “x” 和 根层的Appender.
No appender accumulation since the additivity flag is set to false. 由于additivity标识符为false,所以没有Appender
security.access
Only appenders of “security” because the additivity flag in “security” is set tofalse. 由于“security”的additivity标志位false,所以只有”security”的Appender
通常,用户期望定制的不仅仅是输出目标还有输出格式。将关联到Appender可是达到这个期望。布局负责根据用户的期望来格式化LogEvent,而Appender负责将格式化结果输出到目标。布局模式是标准log4j发布包的一部分,它允许用户根据转换模式来指定输出格式 ,这种转换模式与C语言的 printf方法相似。
例如,布局模式”%r [%t] %-5p %c – %m%n” 的 输出类似于:
176 [main] INFO
org.foo.Bar - Located nearest gas station.
第一个字段是从程序启动开始所经过的毫秒数。第二个字创建该日志请求的线程。第三个字段是日志语句的等级。第二个字段是此日志请求所关联Logger的名字。‘-’之后的文本是输出语句的信息。
同样重要的是,log4j可以根据用户指定的标准来呈现日志信息的内容。例如,如果你经常需要记录当前项目中的对象类型Oranges,就可以创建接受Orange实例的OrangeMessage 类型,并将其传给Log4J,Orange对象在需要时就可以格式化成适当的字节数组。
StrSubstitutor 和 StrLookup
类和 接口借用自Apache Commons Lang 经过修改得以支持LogEvents. 另外 类借用自Apache Commons Configuration,它允许StrSubstitutor估算来自多个StrLookups的变量的值。 同样经过修改以支持LogEvent。 它们结合起来提供了一种允许配置引用变量的机制,这些变量可以来自系统属性变量、配置文件、ThreadContext Map、LogEvent中的结构数据。当处理配置文件或处理每个事件时,如果组件具备解析功能就解析这些变量。
英文原文:,编译: -
译文连接:
【如需转载,请在正文中标注并保留原文链接、译文链接和译者等信息,谢谢合作!】
关于作者:
"只用一样东西,不明白它的道理,实在不高明",做一个严谨的码农。出自上海大学数学系,在寻求数学与计算机完美结合的道路上,渐行渐远。现在就职于Hexagon Metrology,从事研发工作。
新浪微博:
这是印度阿三写的,除了少数几个网站还可以,大部分都是垃圾。
关于ImportNew
ImportNew 专注于 Java 技术分享。于日 11:11正式上线。是的,这是一个很特别的时刻 :)
ImportNew 由两个 Java 关键字 import 和 new 组成,意指:Java 开发者学习新知识的网站。 import 可认为是学习和吸收, new 则可认为是新知识、新技术圈子和新朋友……
– 好的话题、有启发的回复、值得信赖的圈子
– 写了文章?看干货?去头条!
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 活跃 & 专业的翻译小组
– 国内外的精选博客文章
– JavaScript, HTML5, CSS
– 专注Android技术分享
– 专注iOS技术分享
– 专注Java技术分享
– 专注Python技术分享
新浪微博:
微信号:importnew
反馈建议:@
广告与商务合作QQ:
& 2015 ImportNew

我要回帖

更多关于 log4j asyncappender 的文章

 

随机推荐