欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Apache log4j-1.2.17问答式学习笔记

程序员文章站 2022-07-13 15:10:28
...

 

(1)Apache log4j-1.2.17源码学习笔记 http://blog.csdn.net/zilong_zilong/article/details/78715500
(2)Apache log4j-1.2.17问答式学习笔记 http://blog.csdn.net/zilong_zilong/article/details/78916626 
(3)JDK Logging源码学习笔记  http://aperise.iteye.com/blog/2411850 

    本文主要回答了关于log4j-1.2.17的如下问题:

    1.为什么大部分人使用log4j-1.2.17都是配置log4j.properties文件?log4j.properties文件找不到是否影响日志输出?是否影响正常业务代码运行?

    2.log4j-1.2.17是如何解析配置文件的?log4j-1.2.17提供了哪些解析器?

    3.log4j-1.2.17是在哪个地方读取配置文件进行初始化的?

    4.log4j-1.2.17中log4j.properties有哪些配置项?各自作用?

    5.配置中log4j-1.2.17中log4j.properties中配置项区分大小写吗?

    6.log4j-1.2.17里有哪些日志级别?

    7.如何让log4j-1.2.17打印它自己的日志?

    8.log4j-1.2.17中日志logger有哪几种?如何获取?各自区别?是单例还是每次创建?

    9.如何将某些日志(接口访问记录、登录日志记录)打印在一个独立日志文件中,里面不包含INFO WARN ERROR这些日志?

    10.log4j-1.2.17如何让日志不再输出?   

    11.过滤器Filter如何使用?如何控制只打印日志级别为WARN的日志?如何拒绝所有日志?如何控制只打印日志级别在INFO和ERROR的日志?如何控制打印只包含Chinese字符串的日志?

    12.为什么日志会在2个文件中都输出?如何避免?

    13.log4j-1.2.17日志格式化ConversionPattern参数有哪些?含义是啥?

    14.log4j-1.2.17提供了哪些appender?

    15.如何使用ConsoleAppender将日志输出到命令窗口?它的所有配置项有哪些?使用的哪种IO流?

    16.如何使用FileAppender将日志输出到文件?它的所有配置项有哪些?使用的哪种IO流?

    17.如何使用DailyRollingFileAppender将日志输出到文件?它的所有配置项有哪些?每月输出一个文件?每周输出一个文件?每半天(12小时)输出一个文件?每小时输出一个文件?每分钟输出一个文件?使用的哪种IO流?

    18.如何使用RollingFileAppender将日志输出到文件?它的所有配置项有哪些?使用的哪种IO流?

    19.如何使用JDBCAppender将日志输出到数据库mysql?它的所有配置项有哪些?

    20.如何使用JMSAppender将日志输出到JMS?它的所有配置项有哪些?

    21.如何使用SocketAppender将日志输出到socket?它的所有配置项有哪些?

    22.如何使用SMTPAppender将日志通过邮件通知运维人员?它的所有配置项有哪些?

    23.如何使用SyslogAppender将日志写入到linux的syslog?它的所有配置项有哪些?

    24.如何使用TelnetAppender将日志写入到linux的telnet?它的所有配置项有哪些?

    25.log4j-1.2.17日志输出对正常业务处理有性能影响吗?哪些地方有影响?如何避免和优化?

 

1.为什么大部分人使用log4j-1.2.17都是配置log4j.properties文件?log4j.properties文件找不到是否影响日志输出?是否影响正常业务代码运行?

       答:首先通过一张图来了解下log4j-1.2.17加载配置文件的过程和先后顺序:

Apache log4j-1.2.17问答式学习笔记
            
    
    博客分类: 日志框架Apache log4j log4jlog4j-1.2.17

       上图说明:

  • 如果操作系统的环境变量log4j.configuration有值,那么优先以此配置代表的文件来初始化log4j;
  • 如果操作系统环境变量log4j.configuration无值,那么默认加载项目的资源文件中的log4j.xml来初始化log4j;
  • 如果找不到log4j.xml,那么默认加载项目的资源文件中的log4j.properties文件来初始化log4j;
  • 如果找不到log4j.properties,那么就放弃初始化log4j,也即项目中log4j将不生效,不会产生任何日志,也不会影响正常项目的业务逻辑处理。

       了解了上述加载顺序后,不难理解为什么大部分人都直接配置log4j.properties这个文件了,这算是使得log4j-1.2.17生效的最后防线了,如果连log4j.properties都找不到,那么无非就是无法打印日志而已,也不会影响正常的业务代码的运行

       这里以一张图来诠释log4j.properties配置内容:

Apache log4j-1.2.17问答式学习笔记
            
    
    博客分类: 日志框架Apache log4j log4jlog4j-1.2.17

       上面log4j.properties配置文件对应的logger及其输出位置用图表示如下:

Apache log4j-1.2.17问答式学习笔记
            
    
    博客分类: 日志框架Apache log4j log4jlog4j-1.2.17

 

2.log4j-1.2.17是如何解析配置文件的?log4j-1.2.17提供了哪些解析器?

       答:首先回答第一个问题:

       1)如果操作系统没有配置环境变量log4j.configuratorClass,并且配置文件的结尾是".xml",那么就以org.apache.log4j.xml.DOMConfigurator解析器来解析配置文件;

       2)如果配置了操作系统的环境变量log4j.configuratorClass,那么首先反射log4j.configuratorClass对应的类的无参构造函数创建解析器对象,然后解析配置文件,如果反射失败,就直接退出,也即项目中log4j将不生效,不会产生任何日志,也不会影响正常项目的业务逻辑处理;

       3)如果操作系统没有配置环境变量log4j.configuratorClass,并且配置文件的结尾不是是".xml",那么就以org.apache.log4j.PropertyConfigurator解析器来解析配置文件;

       第一个问题回答完毕,这里也告诉我们,如果我们使用log4j.yaml可以么,当然可行,前提是你得自己写个YamlConsigurator类用于解析log4j.yaml文件,然后配置环境变量如下:

log4j.configuration=/opt/log4j.yaml
log4j.configuratorClass=com.yourcompany.xxx.xxx.YamlConsigurator

 

       开始回答第二个问题,log4j-1.2.17提供了四个解析器实现,分别是:

       1)org.apache.log4j.PropertyConfigurator

       2)org.apache.log4j.lf5.DefaultLF5Configurator

       3)org.apache.log4j.xml.DOMConfigurator

       4)org.apache.log4j.varia.ReloadingPropertyConfigurator

       其类继承关系和能解析的文件格式如下图所示:

Apache log4j-1.2.17问答式学习笔记
            
    
    博客分类: 日志框架Apache log4j log4jlog4j-1.2.17

 

3.log4j-1.2.17是在哪个地方读取配置文件进行初始化的?

       答:log4j-1.2.17在org.apache.log4j.LogManager类的static静态代码块里读取配置文件进行初始化的,想了解详细过程参见我的另外一篇博客 Apache log4j-1.2.17源码学习笔记

 

4.log4j-1.2.17中log4j.properties有哪些配置项?各自作用?

       答:

配置项前缀 分类 作用
log4j.debug log4j自身日志控制开关

1)格式:log4j.debug=true/false

 

2)log4j.debug=true,开启log4j自身日志,

开启后能查看log4j加载配置文件,解析配置文件,

打印日志等操作相关日志

 

3)默认为false,表示未开启log4j自身日志

log4j.configDebug log4j自身日志控制开关

1)格式:log4j.configDebug=true/false

 

2)作用和log4j.debug类似,

当前已被标记为deprecated,建议改用log4j.debug

 

3)log4j.configDebug=true,开启log4j自身日志,

开启后能查看log4j加载配置文件,解析配置文件,

打印日志等操作相关日志

 

4)默认为false,表示未开启log4j自身日志;

 

5)优先使用log4j.debug,

无配置log4j.debug再使用log4j.configDebug

     
log4j.reset rootLogger设置

1)格式:log4j.reset=true/false

 

2)log4j.reset=true,会重置rootLogger的日志级别为DEBUG,

重置rootLogger的threshold为ALL

 

3)默认为false

log4j.threshold rootLogger设置

1)格式:log4j.threshold=ALL/TRACE/DEBUG/INFO/WARN/ERROR/FATAL/OFF

 

2)ALL/TRACE/DEBUG/INFO/WARN/ERROR/FATAL/OFF

是日志级别,默认代表的值从小到大,默认值为ALL

 

3)日志事件级别小于threshold的将被禁止打印,也即不输出

比如log4j.threshold=INFO,logger.debug("debug")不会打印;

比如log4j.threshold=INFO,logger.info("info")会打印;

log4j.rootLogger rootLogger设置

1)格式:log4j.rootLogger=日志级别

(ALL/TRACE/DEBUG/INFO/WARN/ERROR/FATAL/OFF),appenderName1,appenderName2,......

 

2)用于设置rootLogger配置,log4j里的日志分为rootLogger和logger,

这是两类不同日志,以log4j.logger打头的为用户logger,其parent属性

指向rootLogger,意图是防止用户logger未配置appender时,默认将所有日志事件传播给rootLogger的appender执行

 

3)日志事件大于或者等于日志级别的才会被打印

比如log4j.rootLogger=INFO,apname1,log.debug("debug")不会打印;

比如log4j.rootLogger=INFO,appname1,log.info("info")会被打印;

 

4)log4j.rootLogger和log4j.rootCategory作用一样,只需配置一个即可;

默认先使用log4j.rootLogger,如果log4j.rootLogger找不到才使用log4j.rootCategory

log4j.rootCategory rootLogger设置

1)格式:log4j.rootCategory=日志级别

(ALL/TRACE/DEBUG/INFO/WARN/ERROR/FATAL/OFF),appenderName1,appenderName2,......

 

2)用于设置rootLogger配置,log4j里的日志分为rootLogger和logger,

这是两类不同日志,以log4j.logger打头的为用户logger,其parent属性

指向roogLogger,意图是防止用户logger未配置appender时,默认将所有日志事件传播给rootLogger的appender执行

 

3)日志事件大于或者等于日志级别的才会被打印

比如log4j.rootCategory=INFO,apname1,log.debug("debug")不会打印;

比如log4j.rootCategory=INFO,appname1,log.info("info")会被打印;

 

4)log4j.rootLogger和log4j.rootCategory作用一样,只需配置一个即可;

默认先使用log4j.rootLogger,如果log4j.rootLogger找不到才使用log4j.rootCategory

 
log4j.appender.*.* appender配置

1)格式:log4j.appender.appenderName.attribute-key=attribute-value

 

2)attribute-key是不同的appender实现类的具体属性,

属性名不要大小写随便写,必须遵循JavaBean规范,默认是通过反射机制调用setXXX进行设置

 

3)attribute-key有3个属性必须小写,这三个属性如下:

log4j.appender.appenderName.layout  

log4j.appender.appenderName.errorhandler  

log4j.appender.appenderName.filter  

 

4)每个appender的实现类不同,其配置属性也各不相同,属性个数也不同,视具体实现类而定

 
log4j.loggerFactory logger工厂类配置

1)格式:log4j.loggerFactory=com.xxx.xxx.MyLoggerFactory

 

2)默认值为org.apache.log4j.DefaultCategoryFactory

 

3)这个参数主要是为了让用户自己可以定义自己的logger工厂类实现

 

4)log4j.loggerFactory和log4j.factory作用一样,只需配置一个即可;

默认先使用log4j.loggerFactory,如果log4j.loggerFactory找不到才使用log4j.factory

log4j.factory logger工厂类配置

1)格式:log4j.factory=com.xxx.xxx.MyLoggerFactory

 

2)默认值为org.apache.log4j.DefaultCategoryFactory

 

3)这个参数主要是为了让用户自己可以定义自己的logger工厂类实现

 

4)log4j.loggerFactory和log4j.factory作用一样,只需配置一个即可; 默认先使用log4j.loggerFactory,如果log4j.loggerFactory找不到才使用log4j.factory

 

 
log4j.category.* 用户logger设置

1)格式:log4j.category.loggerName=日志级别

(ALL/TRACE/DEBUG/INFO/WARN/ERROR/FATAL/OFF),appenderName1,appenderName2,......

 

2)用于设置用户logger配置,log4j里的日志分为rootLogger和logger,

这是两类不同日志,以log4j.logger打头的为用户logger,其parent属性

指向rootLogger,意图是防止用户logger未配置appender时,默认将所有日志事件传播给rootLogger的appender执行

 

3)日志事件大于或者等于日志级别的才会被打印

比如log4j.category.loggerName=INFO,apname1,log.debug("debug")不会打印;

比如log4j.category.loggerName=INFO,appname1,log.info("info")会被打印;

 

4)log4j.category.和log4j.logger.作用一样,只需配置一个即可;

默认先使用log4j.category.,如果log4j.category.找不到才使用log4j.logger.

root.logger.* 用户logger设置

1)格式:log4j.logger.loggerName=日志级别

(ALL/TRACE/DEBUG/INFO/WARN/ERROR/FATAL/OFF),appenderName1,appenderName2,......

 

2)用于设置用户logger配置,log4j里的日志分为rootLogger和logger,

这是两类不同日志,以log4j.logger打头的为用户logger,其parent属性

指向rootLogger,意图是防止用户logger未配置appender时,默认将所有日志事件传播给rootLogger的appender执行

 

3)日志事件大于或者等于日志级别的才会被打印

比如log4j.logger.loggerName=INFO,apname1,log.debug("debug")不会打印;

比如log4j.logger.loggerName=INFO,appname1,log.info("info")会被打印;

 

4)log4j.category.和log4j.logger.作用一样,只需配置一个即可;

默认先使用log4j.category.,如果log4j.category.找不到才使用log4j.logger.

log4j.additivity. 用户logger设置

1)格式:log4j.additivity.loggerName=true/false

 

2)默认log4j.additivity.loggerName=true,用户logger的parent属性指向rootLogger,日志事件经用户logger后都会传播给rootLogger,会造成日志打印两遍,可以设置log4j.additivity.loggerName=false,告诉名字为loggerName的用户logger不要将日志事件传播给rootLogger

 
log4j.renderer. render设置

1)格式:

log4j.render.myrender1

log4j.render.A

myrender1=com.xxx.xxx.MyObjectRender

A=com.xxx.xxx.MyObjectRender

 

2)对于日志事件log.info(Object),log4j并不知道Object的类型,log4j需要将Object转为String,这时候的处理逻辑先去查找是否有Object对应的Render转换类,比如A.classs对应Render类为com.xxx.MyObjectRender,此时就调用MyObjectRender.doRender方法返回字符串String,如果找不到,那么就调用A.class的toString方法,毕竟toString是所有类的父类Object的方法

 

3)默认com.xxx.xxx.MyObjectRender必须实现接口org.apache.log4j.or.ObjectRenderer

log4j.throwableRenderer render设置

1)格式:log4j.throwableRenderer=com.xxx.xxx.MyThrowableRenderer

 

2)默认会将rootLogger的throwableRenderer=null,如果用户配置了log4j.throwableRenderer,那么会将此值设置给rootLogger的throwableRenderer,当有异常发生时会调用throwableRenderer的

public String[] doRender(Throwable t)将异常转换为String数组

 

3)com.xxx.xxx.MyThrowableRenderer必须实现接口org.apache.log4j.spi.ThrowableRenderer

 

5.配置中log4j-1.2.17中log4j.properties中配置项区分大小写吗?

       答:在上面的"4.log4j-1.2.17中log4j.properties有哪些配置项?各自作用?"中已经介绍了关于log4j的所有配置项,大小写有些地方是区分的,有些地方不区分,原则如下:

       1)配置项前缀必须全部小写,配置项前缀参见"4.log4j-1.2.17中log4j.properties有哪些配置项?各自作用?"中表格里的配置项前缀;

 

       2)3个配置项必须全部小写:

       log4j.appender.appenderName.layout              layout必须小写

       log4j.appender.appenderName.errorhandler    errorhandler必须小写

       log4j.appender.appenderName.filter                 filter必须小写

 

       3)除了上述2个原则,其他的配置属性遵从如下规则:

  • 属性名为null或者为空白字符,直接返回属性名;
  • 属性名长度大于或者等于2,并且属性名的前2位都是大写,那么直接返回属性名;
  • 非上面两种情况,则直接将首字母转换为小写然后返回属性名。

       举例如下:

       log4j.appender.appenderName.File会将“File”先转为file,然后找设值方法setFile;

       log4j.appender.appenderName.file会将“file”先转为file,然后找设值方法setFile;

       log4j.appender.appenderName.FILE会将“FILE”先转为FILE,然后找设值方法setFILE;

       所以appenderName这个对应的appender对象必须有setFile或者setFILE方法,否则java反射就会失败

 

6.log4j-1.2.17里有哪些日志级别?

       答:

  level levelStr syslogEquivalent
Level.ALL -2147483648 ALL 7
Level.TRACE 5000 TRACE 7
Level.DEBUG 10000 DEBUG 7
Level.INFO 20000 INFO 6
Level.WARN 30000 WARN 4
Level.ERROR 40000 ERROR 3
Level.FATAL 250000 FATAL 0
Level.OFF 2147483647 OFF

Apache log4j-1.2.17问答式学习笔记
            
    
    博客分类: 日志框架Apache log4j log4jlog4j-1.2.17


7.如何让log4j-1.2.17打印它自己的日志?

       答:log4j-1.2.17可以打印自己解析log4j.properties过程相关日志,开启这个功能只需在配置文件log4j.properties中添加log4j.debug=true或者log4j.configDebug=true,当前log4j.configDebug=true已经不建议使用,建议使用log4j.debug=true,配置文件解析时候也是优先使用log4j.debug=true,当log4j.debug=true找不到才使用log4j.configDebug=true。

       举例如下,在log4j.properties中添加log4j.debug=true,log4j.properties配置内如如下:

#enable log4j-1.2.17 it'self log
log4j.debug=true

# OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL
log4j.rootLogger=INFO,DebugFile,InfoFile,WarnFile

log4j.appender.DebugFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DebugFile.File=${log4j.dir}/test_log4j/debug.log
log4j.appender.DebugFile.DatePattern=yyyy-MM-dd'.log'
log4j.appender.DebugFile.layout=org.apache.log4j.PatternLayout
log4j.appender.DebugFile.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
log4j.appender.DebugFile.Threshold=DEBUG

log4j.appender.InfoFile=org.apache.log4j.RollingFileAppender
log4j.appender.InfoFile.File=${log4j.dir}/test_log4j/info.log
log4j.appender.InfoFile.MaxFileSize=100MB 
log4j.appender.InfoFile.MaxBackupIndex=20 
log4j.appender.InfoFile.layout=org.apache.log4j.PatternLayout
log4j.appender.InfoFile.layout.ConversionPattern=%m%n
log4j.appender.InfoFile.Threshold=INFO

log4j.appender.WarnFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.WarnFile.File=${log4j.dir}/test_log4j/warning.log
log4j.appender.WarnFile.DatePattern=yyyy-MM-dd'.log'
log4j.appender.WarnFile.layout=org.apache.log4j.PatternLayout
log4j.appender.WarnFile.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
log4j.appender.WarnFile.Threshold=WARN

       测试类如下:

import org.apache.log4j.Logger;

public class Log4jTest {
	private static Logger logger = Logger.getLogger(Log4jTest.class);
	public static void main(String[] args) {
		logger.info("log4j error test");
	}
}

       测试后打印的log4j-1.2.17自身日志如下:

log4j: Parsing for [root] with value=[INFO,DebugFile,InfoFile,WarnFile].
log4j: Level token is [INFO].
log4j: Category root set to INFO
log4j: Parsing appender named "DebugFile".
log4j: Parsing layout options for "DebugFile".
log4j: Setting property [conversionPattern] to [[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n].
log4j: End of parsing for "DebugFile".
log4j: Setting property [threshold] to [DEBUG].
log4j: Setting property [file] to [/test_log4j/debug.log].
log4j: Setting property [datePattern] to [yyyy-MM-dd'.log'].
log4j: setFile called: /test_log4j/debug.log, true
log4j: setFile ended
log4j: Appender [DebugFile] to be rolled at midnight.
log4j: Parsed "DebugFile" options.
log4j: Parsing appender named "InfoFile".
log4j: Parsing layout options for "InfoFile".
log4j: Setting property [conversionPattern] to [%m%n].
log4j: End of parsing for "InfoFile".
log4j: Setting property [threshold] to [INFO].
log4j: Setting property [maxBackupIndex] to [20].
log4j: Setting property [maxFileSize] to [100MB ].
log4j: Setting property [file] to [/test_log4j/info.log].
log4j: setFile called: /test_log4j/info.log, true
log4j: setFile ended
log4j: Parsed "InfoFile" options.
log4j: Parsing appender named "WarnFile".
log4j: Parsing layout options for "WarnFile".
log4j: Setting property [conversionPattern] to [[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n].
log4j: End of parsing for "WarnFile".
log4j: Setting property [file] to [/test_log4j/warning.log].
log4j: Setting property [threshold] to [WARN].
log4j: Setting property [datePattern] to [yyyy-MM-dd'.log'].
log4j: setFile called: /test_log4j/warning.log, true
log4j: setFile ended
log4j: Appender [WarnFile] to be rolled at midnight.
log4j: Parsed "WarnFile" options.
log4j: Finished configuring.

       所以,如果想了解log4j-1.2.17如何解析配置文件log4j.properties的过程,可以开启log4j.debug=true来查看相关日志。

 

8.log4j-1.2.17中日志logger有哪几种?如何获取?各自区别?是单例还是每次创建?

       答:1)log4j-1.2.17中分为2种:

       第一类为rootLogger,也即根节点日志,这个一般是在log4j.properties中通过关键字log4j.rootLogger配置;

       第二类为logger,也称之为用户日志,默认用户logger的parent属性指向rootLogger,并且用户logger的属性additivity=true,意思是所有用户logger相关日志事件都会像流感病毒一样传送给rootLogger,这里也是有些日志在不同的文件都记录问题产生的根本原因,不想日志事件传播给rootLogger,那么就配置log4j.additivity.用户logger名=false,即可关闭传播这种特性。

 

       2)开始回答第二个问题和第三个问题,获取logger有以下几种方法:

获取途径 日志分类 作用与区别

log4j.properties

中配置log4j.rootLogger

rootLogger

(1)rootLogger是所有用户logger的父节点,默认用户logger所有

日志事件都会传播给rootLogger,这是为了防止用户logger

在未设置appender时,日志能转交给rootLogger进行输出;

(2)这种方式产生的是rootLogger,其父节点为null

(3)区别是在log4j中哈希表中记录的该logger的key=root;

(4)默认在log4j.properties都会配置appender;

log4j.properties

中配置log4j.logger.*

用户logger

(1)这种方式主要用于将一些日志(接口访问记录、登录日志记录)

单独记录在某个独立的文件,单独进行管理;

(2)这种方式产生的仍然是用户logger,其父节点为rootLogger

(3)区别是在log4j中哈希表中记录的该logger的key=log4j.properties配置的logger名;

(4)默认在log4j.properties都会配置appender;

java 类中

Logger.getLogger(Test.class)

用户logger

(1)这种方式产生的仍然是用户logger,其父节点为rootLogger;

(2)区别是在log4j中哈希表中记录的该logger的key=com.xxx.Test;

(3)默认没有自己的appender,只能依赖rootLogger的appender输出日志;

java 类中Logger.getLogger("test")获取的logger 用户logger

(1)这种方式产生的仍然是用户logger,其父节点为rootLogger

(2)区别是在log4j中哈希表中记录的该logger的key=test;

(3)默认没有自己的appender,只能依赖rootLogger的appender输出日志,除非在log4j.properties文件中以log4j.logger.test配置了独立的appender;

       

       3)回答第4个问题,所有的logger,不管是rootLogger还是logger,都是单例的,不会每次都创建,只会创建一次,创建完毕后通过key-value方式存储在哈希表中,其中key是logger的名字,名字规则如下:

       log4j.properties中log4j.rootLogger配置的rootLogger的key=root;

       log4j.properties中log4j.logger.loggername配置的logger的key=loggername;

       java 类中Logger.getLogger(Test.class)获取的logger的key=com.xxx.xxx.Test;

       java 类中Logger.getLogger("test")获取的logger的key=test

 

9.如何将某些日志(接口访问记录、登录日志记录)打印在一个独立日志文件中,里面不包含INFO WARN ERROR这些日志?

       答:在上面的问题8中这个已经有部分回答了,在问题8中我们已经知道所有在java类中获取的用户logger都是没有自己的appender的,那么就意味着这些logger都没有自己的日志输出能力,都是转交给rootLogger的appender进行输出,要做到日志文件独立,那么就需要在log4j.properties文件中配置log4j.logger.*,独立配置其appender,举例如下:

       目标:将所有接口访问日志记录全部记录到文件interface.log文件,每天产生一个文件,这部分日志不要在其他日志文件中进行输出

       实现:

       (1)在log4j.properties文件中添加如下内容:

#配置一个名字叫interface的用户logger,其appender名字叫interfaceappender
log4j.logger.interface=INFO,interfaceappender
#配置名字叫interfaceappender的appender的相关属性
log4j.appender.interfaceappender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.interfaceappender.File=${log4j.dir}/interfacelog.log
log4j.appender.interfaceappender.DatePattern=yyyy-MM-dd'.log'
log4j.appender.interfaceappender.layout=org.apache.log4j.PatternLayout
log4j.appender.interfaceappender.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %m%n
log4j.appender.interfaceappender.Threshold=INFO
#名字叫interface的用户logger的日志事件不要传播给rootLogger处理
log4j.additivity.interface=false

       (2)测试代码如下:

import org.apache.log4j.Logger;

public class Log4jTest {
	private static Logger interfaceLogger = Logger.getLogger("interface");
	public static void main(String[] args) {
		interfaceLogger.info("ip methord request response");
	}
}

 

10.log4j-1.2.17如何让日志不再输出?

       答:前面在问题6中已经提到过log4j-1.2.17的日志级别,如果不想让日志或者某个级别的日志输出,正是通过修改log4j.properties文件中的相应日志级别控制的,相应设置参见下图:

Apache log4j-1.2.17问答式学习笔记
            
    
    博客分类: 日志框架Apache log4j log4jlog4j-1.2.17

 

11.过滤器Filter如何使用?如何控制只打印日志级别为WARN的日志?如何拒绝所有日志?如何控制只打印日志级别在INFO和ERROR的日志?如何控制打印只包含Chinese字符串的日志?

       答:这几个问题都可以通过log4j-1.2.17的appender里的filter实现,举例如下:

       (1)LevelMatchFilter控制只打印日志级别为WARN的日志

log4j.appender.Info.filter=org.apache.log4j.varia.LevelMatchFilter
log4j.appender.Info.filter.levelToMatch=WARN
log4j.appender.Info.filter.acceptOnMatch=true

       上面配置针对appender=Info,启用了类型为LevelMatchFilter的过滤器,设置了过滤器LevelMatchFilter的属性levelToMatch=WARN且acceptOnMatch=true,含义是这个appender只打印级别为WARN的日志。

 

       (2)DenyAllFilter控制拒绝所有日志

log4j.appender.Info.filter=org.apache.log4j.varia.DenyAllFilter

       上面配置针对appender=Info,启用了类型为DenyAllFilter的过滤器,含义是这个appender对于一切日志都不打印,如果某天你不想打印日志了,那么这个配置能帮上你大忙哦。

 

       (3)LevelRangeFilter控制打印日志级别INFO和ERROR的日志

log4j.appender.Info.filter=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.Info.filter.levelMin=INFO
log4j.appender.Info.filter.levelMax=ERROR
log4j.appender.Info.filter.acceptOnMatch=true

       上面配置针对appender=Info,启用了类型为LevelRangeFilter的过滤器,设置了过滤器LevelRangeFilter的属性levelMin=INFO且levelMax=ERROR且acceptOnMatch=true,含义是这个appender只打印级别在INFO到ERROR这个范围的日志,也即级别为INFO、WARN和ERROR的日志。

 

       (4)StringMatchFilter控制打印日志中包含字符Chinese的日志

log4j.appender.Info.filter=org.apache.log4j.varia.StringMatchFilter
log4j.appender.Info.filter.stringToMatch=Chinese
log4j.appender.Info.filter.acceptOnMatch=true

       上面配置针对appender=Info,启用了类型为StringMatchFilter的过滤器,设置了过滤器StringMatchFilter的属性stringToMatch=Chinese且acceptOnMatch=true,含义是这个appender只处理日志中包含字符串"Chinese"的日志事件。

 

12.为什么日志会在2个文件中都输出?如何避免?

       答:(1)回答第一个问题,碰到这种问题首先对于log4j-1.2.17中的两类日志认识不够,第一类是rootLogger,通过log4j.rootLogger配置,它是所有其他logger的父logger;第二类是用户logger,通过log4j.logger.loggername或者java代码中通过Logger.getLogger生成,这种logger的属性parent默认指向rootLogger。

       碰到这种问题其次是对log4j-1.2.17中日志事件传播属性additivity了解不深,默认所有的用户logger的属性additivity=true,意思是日志事件不仅会用用户logger处理,还会像流感病毒一样传播给rootLogger处理,所以用户logger的appender会在对应的日志中输出一次,也会转交给rootLogger的appender进行再次输出。

 

       (2)第二个问题,解决的办法是设置用户logger的属性additivity=false,禁止日志事件向外传播,配置如下:

#配置一个名字叫interface的用户logger,其appender名字叫interfaceappender
log4j.logger.interface=INFO,interfaceappender
#名字叫interface的用户logger的日志事件不要传播给rootLogger处理
log4j.additivity.interface=false

       如果是通过java类中Logger.getLogger(Test.class)获取logger,那么其对应的logger的名字为com.xxx.xxx.Test,这种情况下禁用日志传播属性的配置如下:

log4j.additivity.com.xxx.xxx.Test=false

 

13.log4j-1.2.17日志格式化ConversionPattern参数有哪些?含义是啥?

       答:在log4j-1.2.17的源代码org.apache.log4j.PatternLayout中对于ConversionPattern参数解释如下:

转换字符 作用
c Used to output the category of the logging event. The category conversion specifier can be optionally followed by precision specifier, that is a decimal constant in brackets.

If a precision specifier is given, then only the corresponding number of right most components of the category name will be printed. By default the category name is printed in full.

For example, for the category name "a.b.c" the pattern %c{2} will output "b.c".

C【请慎用】 Used to output the fully qualified class name of the caller issuing the logging request. This conversion specifier can be optionally followed by precision specifier, that is a decimal constant in brackets.

If a precision specifier is given, then only the corresponding number of right most components of the class name will be printed. By default the class name is output in fully qualified form.

For example, for the class name "org.apache.xyz.SomeClass", the pattern %C{1} will output "SomeClass".

WARNING Generating the caller class information is slow. Thus, use should be avoided unless execution speed is not an issue.

注意:使用此种转换字符获取打印日志所在类名会拖慢正常的业务处理,毕竟日志对于正常代码处理还是有影响的,请慎用。

d Used to output the date of the logging event. The date conversion specifier may be followed by a date format specifier enclosed between braces. For example, %d{HH:mm:ss,SSS} or %d{dd MMM yyyy HH:mm:ss,SSS}. If no date format specifier is given then ISO8601 format is assumed.

The date format specifier admits the same syntax as the time pattern string of the java.text.SimpleDateFormat. Although part of the standard JDK, the performance of SimpleDateFormat is quite poor.

For better results it is recommended to use the log4j date formatters. These can be specified using one of the strings "ABSOLUTE", "DATE" and "ISO8601" for specifying AbsoluteTimeDateFormatDateTimeDateFormat and respectively ISO8601DateFormat. For example, %d{ISO8601} or %d{ABSOLUTE}.

These dedicated date formatters perform significantly better than java.text.SimpleDateFormat.

注意:这里告诉我们其实还有比java的SimpleDateFormat更好的日期格式化工具类,似乎无意中又学习到了新知识

F【请慎用】 Used to output the file name where the logging request was issued.

WARNING Generating caller location information is extremely slow and should be avoided unless execution speed is not an issue.

注意:使用此种转换字符获取打印日志所在源代码文件名比如Myclass.java会严重拖慢正常的业务处理,毕竟日志对于正常代码处理还是有影响的,请慎用。

l Used to output location information of the caller which generated the logging event.

The location information depends on the JVM implementation but usually consists of the fully qualified name of the calling method followed by the callers source the file name and line number between parentheses.

The location information can be very useful. However, its generation is extremely slow and should be avoided unless execution speed is not an issue.

L【请慎用】 Used to output the line number from where the logging request was issued.

WARNING Generating caller location information is extremely slow and should be avoided unless execution speed is not an issue.

注意:使用此种转换字符获取源代码里调用打印日志是哪一行代码发起的会严重拖慢正常的业务处理,毕竟日志对于正常代码处理还是有影响的,请慎用。

m Used to output the application supplied message associated with the logging event.
M【请慎用】 Used to output the method name where the logging request was issued.

WARNING Generating caller location information is extremely slow and should be avoided unless execution speed is not an issue.

注意:使用此种转换字符获取源代码里调用打印日志是哪个方法发起的会严重拖慢正常的业务处理,毕竟日志对于正常代码处理还是有影响的,请慎用。

n Outputs the platform dependent line separator character or characters.

This conversion character offers practically the same performance as using non-portable line separator strings such as "\n", or "\r\n". Thus, it is the preferred way of specifying a line separator.

p Used to output the priority of the logging event.
r Used to output the number of milliseconds elapsed from the construction of the layout until the creation of the logging event.
t Used to output the name of the thread that generated the logging event.
x Used to output the NDC (nested diagnostic context) associated with the thread that generated the logging event.
X

Used to output the MDC (mapped diagnostic context) associated with the thread that generated the logging event. The X conversion character must be followed by the key for the map placed between braces, as in %X{clientNumber} where clientNumber is the key. The value in the MDC corresponding to the key will be output.

See MDC class for more details.

% The sequence %% outputs a single percent sign.

       用网友的翻译如下:

Apache log4j-1.2.17问答式学习笔记
            
    
    博客分类: 日志框架Apache log4j log4jlog4j-1.2.17

14.log4j-1.2.17提供了哪些appender?

       答:log4j-1.2.17提供的appender如下图所示,如果感兴趣可以参见我的另外一篇关于log4j-1.2.17源代码分析的博客  Apache log4j-1.2.17源码学习笔记

Apache log4j-1.2.17问答式学习笔记
            
    
    博客分类: 日志框架Apache log4j log4jlog4j-1.2.17

 

15.如何使用ConsoleAppender将日志输出到命令窗口?它的所有配置项有哪些?使用的哪种IO流?

       答:ConsoleAppender使用优先使用java里已经打开的流System.errSystem.out,这两个类型对应的IO流为java.io.PrintStream,如果配置了属性follow=false就是用java的IO流java.io.OutputStream;

       使用ConsoleAppender将日志输出到命令窗口的完整配置如下:

#配置rootLogger的日志级别为DEBUG,其下有一个名字为console的appender
log4j.rootLogger=DEBUG,console

#名字为console的appender对应的类型为org.apache.log4j.ConsoleAppender
log4j.appender.console=org.apache.log4j.ConsoleAppender

#来自类org.apache.log4j.AppenderSkeleton的属性layout、threshold、errorHandler和closed
#使用日志格式化布局org.apache.log4j.PatternLayout
log4j.appender.console.layout=org.apache.log4j.PatternLayout
#名字为console的appender对应的日志级别为INFO,大于或者等于此日志级别的日志才会输出
log4j.appender.console.Threshold=INFO
#名字为console的appender对应的异常处理类为org.apache.log4j.helpers.OnlyOnceErrorHandler
log4j.appender.console.errorHandler=org.apache.log4j.helpers.OnlyOnceErrorHandler
#名字为console的appender默认是开启的,不用关闭
log4j.appender.console.closed=false

#来自类WriterAppender的属性immediateFlush和encoding
#immediateFlush = true,意思是每次有日志事件都立即触发flush写数据
log4j.appender.console.immediateFlush = true
#名字为console的appender默认编码格式为UTF-8
log4j.appender.console.encoding=UTF-8

#来自类ConsoleAppender的属性target和follow
#名字为console的appender默认采用System.out向终端输出日志,还可以设置System.err
log4j.appender.console.target=System.out
#默认java里已经存在两个打开的流System.err和System.out
#follow=false,直接采用采用System.err或者System.out输出日志
#follow=true,采用新建的SystemErrStream或者SystemOutStream输出日志
log4j.appender.console.follow=false

 

16.如何使用FileAppender将日志输出到文件?它的所有配置项有哪些?使用的哪种IO流?

       答:FileAppender使用的是java的IO流java.io.Writer;

       使用FileAppender将日志输出到文件的完整配置如下:

#配置rootLogger的日志级别为DEBUG,其下有一个名字为file的appender
log4j.rootLogger=DEBUG,file

#名字为file的appender对应的类型为org.apache.log4j.FileAppender
log4j.appender.file=org.apache.log4j.FileAppender

#来自类org.apache.log4j.AppenderSkeleton的属性layout、threshold、errorHandler和closed
#使用日志格式化布局org.apache.log4j.PatternLayout
log4j.appender.file.layout=org.apache.log4j.PatternLayout
#名字为file的appender对应的日志级别为INFO,大于或者等于此日志级别的日志才会输出
log4j.appender.file.Threshold=INFO
#名字为file的appender对应的异常处理类为org.apache.log4j.helpers.OnlyOnceErrorHandler
log4j.appender.file.errorHandler=org.apache.log4j.helpers.OnlyOnceErrorHandler
#名字为file的appender默认是开启的,不用关闭
log4j.appender.file.closed=false

#来自类WriterAppender的属性immediateFlush和encoding
#immediateFlush = true,意思是每次有日志事件都立即触发flush写数据
log4j.appender.file.immediateFlush = true
#名字为file的appender默认编码格式为UTF-8
log4j.appender.file.encoding=UTF-8

#来自类FileAppender的属性fileAppend、fileName、bufferedIO和bufferSize
#Append=true在文件的末尾追加内容,Append=false就是覆盖了
log4j.appender.file.Append=true
#日志输出到文件/opt/file.log
log4j.appender.file.File=/opt/file.log 
#默认不开启缓冲区
log4j.appender.file.BufferedIO=false 
#缓冲区大小为8KB
log4j.appender.file.BufferSize=8192 

 

17.如何使用DailyRollingFileAppender将日志输出到文件?它的所有配置项有哪些?每月输出一个文件?每周输出一个文件?每半天(12小时)输出一个文件?每小时输出一个文件?每分钟输出一个文件?使用的哪种IO流?

       答:DailyRollingFileAppender使用的java的IO流java.io.Writer;

       DailyRollingFileAppender的属性datePattern控制着文件按月,按周,按半天,按小时,按分钟进行拆分,这个属性说明见下表:

DatePattern 文件分割规则 举例
'.'yyyy-MM 按照月份存储文件 At midnight of May 31st, 2002 /foo/bar.log will be copied to /foo/bar.log.2002-05. Logging for the month of June will be output to /foo/bar.log until it is also rolled over the next month.
'.'yyyy-ww 按照周存储文件,每周的第一由当前系统的时区决定,比如美国以SUNDAY为一周第一天 Assuming the first day of the week is Sunday, on Saturday midnight, June 9th 2002, the file /foo/bar.log will be copied to /foo/bar.log.2002-23. Logging for the 24th week of 2002 will be output to /foo/bar.log until it is rolled over the next week.
'.'yyyy-MM-dd 按照天存储文件,每天晚上的12点会变更文件名字 At midnight, on March 8th, 2002, /foo/bar.log will be copied to /foo/bar.log.2002-03-08. Logging for the 9th day of March will be output to /foo/bar.log until it is rolled over the next day.
'.'yyyy-MM-dd-a 按照半天存储文件,中午的12点和晚上的12点时候会变更文件名字 At noon, on March 9th, 2002, /foo/bar.log will be copied to /foo/bar.log.2002-03-09-AM. Logging for the afternoon of the 9th will be output to /foo/bar.log until it is rolled over at midnight.
'.'yyyy-MM-dd-HH 按照小时存储文件 At approximately 11:00.000 o'clock on March 9th, 2002, /foo/bar.log will be copied to /foo/bar.log.2002-03-09-10. Logging for the 11th hour of the 9th of March will be output to /foo/bar.log until it is rolled over at the beginning of the next hour.
'.'yyyy-MM-dd-HH-mm 按照分钟存储文件 At approximately 11:23,000, on March 9th, 2001, /foo/bar.log will be copied to /foo/bar.log.2001-03-09-10-22. Logging for the minute of 11:23 (9th of March) will be output to /foo/bar.log until it is rolled over the next minute.

 

       使用DailyRollingFileAppender将日志输出到文件的完整配置如下:

#配置rootLogger的日志级别为DEBUG,其下有一个名字为file的appender
log4j.rootLogger=DEBUG,file

#名字为file的appender对应的类型为org.apache.log4j.DailyRollingFileAppende
log4j.appender.file=org.apache.log4j.DailyRollingFileAppende

#来自类org.apache.log4j.AppenderSkeleton的属性layout、threshold、errorHandler和closed
#使用日志格式化布局org.apache.log4j.PatternLayout
log4j.appender.file.layout=org.apache.log4j.PatternLayout
#名字为file的appender对应的日志级别为INFO,大于或者等于此日志级别的日志才会输出
log4j.appender.file.Threshold=INFO
#名字为file的appender对应的异常处理类为org.apache.log4j.helpers.OnlyOnceErrorHandler
log4j.appender.file.errorHandler=org.apache.log4j.helpers.OnlyOnceErrorHandler
#名字为file的appender默认是开启的,不用关闭
log4j.appender.file.closed=false

#来自类WriterAppender的属性immediateFlush和encoding
#immediateFlush = true,意思是每次有日志事件都立即触发flush写数据
log4j.appender.file.immediateFlush = true
#名字为file的appender默认编码格式为UTF-8
log4j.appender.file.encoding=UTF-8

#来自类FileAppender的属性fileAppend、fileName、bufferedIO和bufferSize
#Append=true在文件的末尾追加内容,Append=false就是覆盖了
log4j.appender.file.Append=true
#日志输出到文件/opt/file.log
log4j.appender.file.File=/opt/file.log 
#默认不开启缓冲区
log4j.appender.file.BufferedIO=false 
#缓冲区大小为8KB
log4j.appender.file.BufferSize=8192 

#来自类DailyRollingFileAppende的属性datePattern
#按月拆分文件file.log,比如2017-12-28 19:53:00,在2017-12-31 23:59:59时会被拆分的文件为file.log.2017-12
#log4j.appender.file.datePattern='.'yyyy-MM

#按周拆分文件file.log,比如2017-12-28 19:53:00为2017年第52周,在周六2017-12-30 23:59:59时会被拆分的文件为file.log.2017-52,默认周日为一周第一天
#log4j.appender.file.datePattern='.'yyyy-ww

#按天拆分文件file.log,比如2017-12-28 19:53:00,在2017-12-28 23:59:59时会被拆分的文件为file.log.2017-12-28
#log4j.appender.file.datePattern='.'yyyy-MM-dd

#按半天拆分文件file.log,比如2017-12-28 09:53:00,在2017-12-28 11:59:59时会被拆分的文件为file.log.2017-12-28-AM
#按半天拆分文件file.log,比如2017-12-28 19:53:00,在2017-12-28 23:59:59时会被拆分的文件为file.log.2017-12-28-PM
#log4j.appender.file.datePattern='.'yyyy-MM-dd-a

#按小时拆分文件file.log,比如2017-12-28 19:53:00,在2017-12-28 19:59:59时会拆分的文件为file.log.2017-12-28-19
#log4j.appender.file.datePattern='.'yyyy-MM-dd-HH

#按分钟拆分文件file.log,比如2017-12-28 19:53:00,在2017-12-28 19:53:59时拆分的文件为file.log.2017-12-28-19-53
log4j.appender.file.datePattern='.'yyyy-MM-dd-HH-mm

 

18.如何使用RollingFileAppender将日志输出到文件?它的所有配置项有哪些?使用的哪种IO流?

       答:RollingFileAppender使用的java的IO流为java.io.writer;

        使用RollingFileAppender将日志输出到文件的完整配置如下:

#配置rootLogger的日志级别为DEBUG,其下有一个名字为file的appender
log4j.rootLogger=DEBUG,file

#名字为file的appender对应的类型为org.apache.log4j.RollingFileAppender
log4j.appender.file=org.apache.log4j.RollingFileAppender

#来自类org.apache.log4j.AppenderSkeleton的属性layout、threshold、errorHandler和closed
#使用日志格式化布局org.apache.log4j.PatternLayout
log4j.appender.file.layout=org.apache.log4j.PatternLayout
#名字为file的appender对应的日志级别为INFO,大于或者等于此日志级别的日志才会输出
log4j.appender.file.Threshold=INFO
#名字为file的appender对应的异常处理类为org.apache.log4j.helpers.OnlyOnceErrorHandler
log4j.appender.file.errorHandler=org.apache.log4j.helpers.OnlyOnceErrorHandler
#名字为file的appender默认是开启的,不用关闭
log4j.appender.file.closed=false

#来自类WriterAppender的属性immediateFlush和encoding
#immediateFlush = true,意思是每次有日志事件都立即触发flush写数据
log4j.appender.file.immediateFlush = true
#名字为file的appender默认编码格式为UTF-8
log4j.appender.file.encoding=UTF-8

#来自类FileAppender的属性fileAppend、fileName、bufferedIO和bufferSize
#Append=true在文件的末尾追加内容,Append=false就是覆盖了
log4j.appender.file.Append=true
#日志输出到文件/opt/file.log
log4j.appender.file.File=/opt/file.log 
#默认不开启缓冲区
log4j.appender.file.BufferedIO=false 
#缓冲区大小为8KB
log4j.appender.file.BufferSize=8192 

#来自类RollingFileAppender的属性MaxFileSize、MaxBackupIndex  
#MaximumFileSize和MaxFileSize都可以设置最大文件的大小  
#MaxFileSize可以携带单位KB MB GB,RollingFileAppender会自己解析转换  
#MaximumFileSize则直接设置最大文件的大小,不带单位,也即默认单位为Byte
log4j.appender.file.MaxFileSize=10MB   
log4j.appender.file.MaximumFileSize=10485760   
log4j.appender.file.MaxBackupIndex=10   

 

19.如何使用JDBCAppender将日志输出到数据库mysql?它的所有配置项有哪些?

       答:使用JDBCAppender将日志输出到数据库mysql的完整配置如下:

#配置rootLogger的日志级别为DEBUG,其下有一个名字为mysql的appender
log4j.rootLogger=DEBUG,mysql

#名字为mysql的appender对应的类型为org.apache.log4j.RollingmysqlAppender
log4j.appender.mysql=org.apache.log4j.RollingmysqlAppender

#来自类org.apache.log4j.AppenderSkeleton的属性layout、threshold、errorHandler和closed
#使用日志格式化布局org.apache.log4j.PatternLayout
log4j.appender.mysql.layout=org.apache.log4j.PatternLayout
#名字为mysql的appender对应的日志级别为INFO,大于或者等于此日志级别的日志才会输出
log4j.appender.mysql.Threshold=INFO
#名字为mysql的appender对应的异常处理类为org.apache.log4j.helpers.OnlyOnceErrorHandler
log4j.appender.mysql.errorHandler=org.apache.log4j.helpers.OnlyOnceErrorHandler
#名字为mysql的appender默认是开启的,不用关闭
log4j.appender.mysql.closed=false

#来自类org.apache.log4j.jdbc.JDBCAppender的属性databaseURL databaseUser databasePassword sqlStatement bufferSize locationInfo
log4j.appender.mysql.driver=com.mysql.jdbc.Driver
log4j.appender.mysql.URL=jdbc:mysql://192.168.29.24:3306/signal?useUnicode=true&characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull
log4j.appender.mysql.user=mysql
log4j.appender.mysql.password=mysql
log4j.appender.mysql.sql=INSERT INTO LOG4J (Date, Logger, Priority, Thread, Message) VALUES ('%d', '%c', '%p', '%t', '%m')
log4j.appender.mysql.bufferSize=1
log4j.appender.mysql.locationInfo=false

 

20.如何使用JMSAppender将日志输出到JMS?它的所有配置项有哪些?

       答:使用JDBCAppender将日志输出到JMS的完整配置如下:

#配置rootLogger的日志级别为DEBUG,其下有一个名字为jms的appender
log4j.rootLogger=DEBUG,jms

#名字为jms的appender对应的类型为org.apache.log4j.net.JMSAppender
log4j.appender.jms=org.apache.log4j.net.JMSAppender

#来自类org.apache.log4j.AppenderSkeleton的属性layout、threshold、errorHandler和closed
#使用日志格式化布局org.apache.log4j.PatternLayout
log4j.appender.jms.layout=org.apache.log4j.PatternLayout
#名字为jms的appender对应的日志级别为INFO,大于或者等于此日志级别的日志才会输出
log4j.appender.jms.Threshold=INFO
#名字为jms的appender对应的异常处理类为org.apache.log4j.helpers.OnlyOnceErrorHandler
log4j.appender.jms.errorHandler=org.apache.log4j.helpers.OnlyOnceErrorHandler
#名字为jms的appender默认是开启的,不用关闭
log4j.appender.jms.closed=false

#来自类org.apache.log4j.net.JMSAppender的属性tcfBindingName,topicBindingName,initialContextFactoryName,providerURL,urlPkgPrefixes,securityCredentials,securityPrincipalName,userName,password,locationInfo
log4j.appender.jms.topicConnectionFactoryBindingName=JNDI_JMS_Connection_Factory
log4j.appender.jms.topicBindingName=JNDI_LOG_TOPIC
log4j.appender.jms.initialContextFactoryName=weblogic.jndi.WLInitialContextFactory
log4j.appender.jms.providerURL=t3://192.168.23.112:51880
log4j.appender.jms.URLPkgPrefixes=
log4j.appender.jms.securityCredentials=
log4j.appender.jms.securityCredentials=
log4j.appender.jms.userName=jms
log4j.appender.jms.password=jms
log4j.appender.jms.locationInfo=false

 

21.如何使用SocketAppender将日志输出到socket?它的所有配置项有哪些?

       答:使用SocketAppender将日志输出到socket的完整配置如下:

#配置rootLogger的日志级别为DEBUG,其下有一个名字为socket的appender
log4j.rootLogger=DEBUG,socket

#名字为socket的appender对应的类型为org.apache.log4j.net.SocketAppender
log4j.appender.socket=org.apache.log4j.net.SocketAppender

#来自类org.apache.log4j.AppenderSkeleton的属性layout、threshold、errorHandler和closed
#使用日志格式化布局org.apache.log4j.PatternLayout
log4j.appender.socket.layout=org.apache.log4j.PatternLayout
#名字为socket的appender对应的日志级别为INFO,大于或者等于此日志级别的日志才会输出
log4j.appender.socket.Threshold=INFO
#名字为socket的appender对应的异常处理类为org.apache.log4j.helpers.OnlyOnceErrorHandler
log4j.appender.socket.errorHandler=org.apache.log4j.helpers.OnlyOnceErrorHandler
#名字为socket的appender默认是开启的,不用关闭
log4j.appender.socket.closed=false

#来自类org.apache.log4j.net.SocketAppender的属性advertiseViaMulticastDNS,remoteHost,port,locationInfo,application,reconnectionDelay
log4j.appender.socket.advertiseViaMulticastDNS=false
log4j.appender.socket.remoteHost=192.168.29.24
log4j.appender.socket.port=2004
log4j.appender.socket.locationInfo=false
log4j.appender.socket.application=socketAppName
log4j.appender.socket.reconnectionDelay=30000

 

22.如何使用SMTPAppender将日志通过邮件通知运维人员?它的所有配置项有哪些?

       答:使用SMTPAppender将日志通过邮件通知运维人员的完整配置如下:

#配置rootLogger的日志级别为DEBUG,其下有一个名字为mail的appender
log4j.rootLogger=DEBUG,mail

#名字为mail的appender对应的类型为org.apache.log4j.net.SMTPAppender
log4j.appender.mail=org.apache.log4j.net.SMTPAppender

#来自类org.apache.log4j.AppenderSkeleton的属性layout、threshold、errorHandler和closed
#发送邮件的格式使用org.apache.log4j.HTMLLayout
log4j.appender.mail.layout=org.apache.log4j.HTMLLayout 
#名字为mail的appender对应的日志级别为INFO,大于或者等于此日志级别的日志才会输出
log4j.appender.mail.Threshold=INFO
#名字为mail的appender对应的异常处理类为org.apache.log4j.helpers.OnlyOnceErrorHandler
log4j.appender.mail.errorHandler=org.apache.log4j.helpers.OnlyOnceErrorHandler
#名字为mail的appender默认是开启的,不用关闭
log4j.appender.mail.closed=false

#来自类org.apache.log4j.net.mailAppender的属性
#发送邮件的邮箱
log4j.appender.mail.from=xxx.xxx@126.com
#回复的邮箱
log4j.appender.mail.replyTo=
#邮件主题  
log4j.appender.mail.subject=
#默认缓冲512日ERROR级别以上的日志才发一次邮件 
log4j.appender.mail.bufferSize=512
#发送邮件的服务器  
log4j.appender.mail.smtpHost=smtp.126.com  
#接收邮件的邮箱 
log4j.appender.mail.to=xxx.xxx@163.com
log4j.appender.mail.evaluator=实现org.apache.log4j.spi.TriggeringEventEvaluator接口的类,默认为org.apache.log4j.net.DefaultEvaluator,日志时间中级别大于或者等于ERROR才发送邮件
log4j.appender.mail.locationInfo=false
#抄送的邮箱
log4j.appender.mail.cc=xxx.xxx@189.com
#保密抄送的邮箱
log4j.appender.mail.bcc=xxx.xxx@186.com
#发送邮件箱的密码  
log4j.appender.mail.SMTPPassword=password
#发送邮件箱的用户  
log4j.appender.mail.SMTPUsername=username
log4j.appender.mail.SMTPDebug=false
#默认协议SMTP
log4j.appender.mail.SMTPProtocol=smtp
#默认SMTP端口110
log4j.appender.mail.SMTPPort=110
log4j.appender.mail.sendOnClose=false

 

23.如何使用SyslogAppender将日志写入到linux的syslog?它的所有配置项有哪些?

       答:syslogd是UNIX系统的一个常见的组件,用于执行系统日志记录活 动。syslogd从一组日志源(如:/dev/log和/dev/klog)中读取数据,并按/etc/syslog.conf中的说明处理这些日志消 息。通过syslog()调用,将应用程序日志消息记录到syslog中。

       使用SyslogAppender将日志写入到linux的syslog的完整配置如下:

#配置rootLogger的日志级别为DEBUG,其下有一个名字为syslog的appender
log4j.rootLogger=DEBUG,syslog

#名字为syslog的appender对应的类型为org.apache.log4j.net.SyslogAppender
log4j.appender.syslog=org.apache.log4j.net.SyslogAppender

#来自类org.apache.log4j.AppenderSkeleton的属性layout、threshold、errorHandler和closed
#发送邮件的格式使用org.apache.log4j.HTMLLayout
log4j.appender.syslog.layout=org.apache.log4j.HTMLLayout 
#名字为syslog的appender对应的日志级别为INFO,大于或者等于此日志级别的日志才会输出
log4j.appender.syslog.Threshold=INFO
#名字为syslog的appender对应的异常处理类为org.apache.log4j.helpers.OnlyOnceErrorHandler
log4j.appender.syslog.errorHandler=org.apache.log4j.helpers.OnlyOnceErrorHandler
#名字为syslog的appender默认是开启的,不用关闭
log4j.appender.syslog.closed=false

#来自类org.apache.log4j.net.SyslogAppender的属性
#linux服务器IP
log4j.appender.syslog.syslogHost=192.168.29.24
#KERN USER MAIL DAEMON AUTH SYSLOG LPR NEWS UUCP CRON AUTHPRIV LOCAL0 LOCAL1 LOCAL2 LOCAL3 LOCAL4 LOCAL5 LOCAL6 LOCAL7中的值之一
log4j.appender.syslog.facility=LOCAL5
log4j.appender.syslog.facilityPrinting=false
log4j.appender.syslog.false=false

 

24.如何使用TelnetAppender将日志写入到linux的telnet?它的所有配置项有哪些?

       答:默认是将log4j日志输出到其所在linux服务器的端口23.

       使用TelnetAppender将日志写入到linux的telnet的完整配置如下:

#配置rootLogger的日志级别为DEBUG,其下有一个名字为 telnet的appender
log4j.rootLogger=DEBUG, telnet

#名字为 telnet的appender对应的类型为org.apache.log4j.net.TelnetAppender
log4j.appender.telnet=org.apache.log4j.net.TelnetAppender

#来自类org.apache.log4j.AppenderSkeleton的属性layout、threshold、errorHandler和closed
#发送邮件的格式使用org.apache.log4j.HTMLLayout
log4j.appender.telnet.layout=org.apache.log4j.HTMLLayout 
#名字为 telnet的appender对应的日志级别为INFO,大于或者等于此日志级别的日志才会输出
log4j.appender.telnet.Threshold=INFO
#名字为 telnet的appender对应的异常处理类为org.apache.log4j.helpers.OnlyOnceErrorHandler
log4j.appender.telnet.errorHandler=org.apache.log4j.helpers.OnlyOnceErrorHandler
#名字为 telnet的appender默认是开启的,不用关闭
log4j.appender.telnet.closed=false

#来自类org.apache.log4j.net. telnetAppender的属性
#linux服务器IP
log4j.appender.telnet.port=23

 

25.log4j-1.2.17日志输出对正常业务处理有性能影响吗?哪些地方有影响?如何避免和优化?

       答:第一个问题,日志输出是肯定影响正常业务代码的总体性能的,一个庞大的业务系统会产生成千上万的日志,每个日志处理都会消耗CPU或者磁盘IO,但log4j-1.2.17的设计原则是速度第一,灵活第二,一般日志输出相对于正常的业务代码逻辑处理来说,影响相当小,就那输出日志到linux的文件来说,当前linux的服务器写文件的能力已经达到100万行每秒,所以日志输出占据的时间很小。

 

       第二个问题,哪些地方对性能有影响呢?

       (1)有人测试过如果完全通过log4j.properties关闭掉所有日志输出,但是里面的log.debug("debug")在233 MHz的奔腾II处理器上耗时大概在5~50纳秒

       (2)以logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]))来讲,log4j消耗的时间在于将整数i转为String,将entry[i]转为String,然后将这些字符串拼接,如果日志量相当大,耗时会更大

       (3)PatternLayout中对于ConversionPattern参数中%C、%F、%L、%M分别用于获取logger对象所在类的完整包名路径、logger对象所在java源代码文件的文件名、logger对象被调用所在代码的行数、logger对象被调用所在的方法名,这四个在log4j-1.2.17的源代码PatternLayout是明确指出消耗性能的,不推荐使用;

       (4)代码中有logger.debug,但是日志级别是INFO以上,那么每次debug还是会执行,这里建议代码里先判断logger.isDebugEnabled()的值是否为true,否则频繁的debug被执行也是一笔开销

 

       第三个问题,从第二个问题的分析中我们已经知道响应举措:

       (1)不要将多个对象转string的动作交给log4j进行转换,更不要将多个string交给log4j进行拼接,原则上交给log4j的已经是String类型

       (2)如果你的日志中已经有logger.debug这类日志操作,那么切记这么干:

if(logger.isDebugEnabled() {
  logger.debug("debug");
}

       调用debug之前都提前做个判断

       (3)尽量不要使用PatternLayout中的ConversionPattern的参数%C、%F、%L、%M,PatternLayout能省则省,能简单则简单,不要过多打印你不需要的信息

       (4)尽量给每个产生的logger一个默认的日志级别,否则logger找不到日志级别的时候,会去默认寻找其父logger的日志级别;

       

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • Apache log4j-1.2.17问答式学习笔记
            
    
    博客分类: 日志框架Apache log4j log4jlog4j-1.2.17
  • 大小: 44.7 KB
  • Apache log4j-1.2.17问答式学习笔记
            
    
    博客分类: 日志框架Apache log4j log4jlog4j-1.2.17
  • 大小: 159.2 KB
  • Apache log4j-1.2.17问答式学习笔记
            
    
    博客分类: 日志框架Apache log4j log4jlog4j-1.2.17
  • 大小: 1.1 MB
  • Apache log4j-1.2.17问答式学习笔记
            
    
    博客分类: 日志框架Apache log4j log4jlog4j-1.2.17
  • 大小: 2.3 MB
  • Apache log4j-1.2.17问答式学习笔记
            
    
    博客分类: 日志框架Apache log4j log4jlog4j-1.2.17
  • 大小: 108 KB
  • Apache log4j-1.2.17问答式学习笔记
            
    
    博客分类: 日志框架Apache log4j log4jlog4j-1.2.17
  • 大小: 87.1 KB
  • Apache log4j-1.2.17问答式学习笔记
            
    
    博客分类: 日志框架Apache log4j log4jlog4j-1.2.17
  • 大小: 2 MB
相关标签: log4j log4j-1.2.17