运行一个app的时候不总要报各种各样的信息,每个信息有着自己的代表意义。如果要从我的认知当中找一个跟log4功能比较接近的实体的话,我第一个想到的就是“黑匣子”,就是那个记录了飞机各种运行参数的盒子。
在飞机飞行的时候,黑匣子会定时记录飞机的一些参数,每隔半小时的语音对话,以及两小时内的飞行高度,速度,航向,爬升率,下降率,加速情况,耗油量等飞行参数。这些参数会在飞机失事的时候用以分析出事原因,或者提供给实验室做飞行实验用。
再将话题扯回到Log4j,Log4j提供的日志恢复和数据挖掘时数据提供的功能正好可以想象成黑匣子的事故分析,供给飞行实验数据这两个功能。
数据供给功能一般会与大数据做整合,涉及的内容较多,以后有机会再写。今天主要是记录下Log4j有哪些配置,配置的一个“小套路”又是什么。当然,这部分记录的主要目的还是以故障恢复为主的。
既然是以故障恢复为主,那么信息就要分等级,等级越高的故障越严重。这样真遇到问题的时候就能快速定位,省去了信息甄别的麻烦。Log4j中的信息分为以下几个级别,分别是:FATAL-0,ERROR-3,WARN-4,INFO-6,DEBUG-7。后面带的数字是它相对应的等级,一般等级越高,数字越低。此外,开发中共FATAL基本用,等级最高的一般是ERROR,一般出现这种级别的不是宕机就是起不了这样严重的问题。后面的WARN、INFO、DEBUG没有一定之规,根据公司的规定来即可。下面贴出一个表格作为参考。
级别 | 定义 |
---|---|
ERROR | 为严重错误 主要是程序的错误 |
WARN | 为一般警告,比如session丢失 |
INFO | 为一般要显示的信息,比如登录登出 |
DEBUG | 为程序的调试信息 |
不过有一点倒是值得说,那就是在实际的生产环境中,一般是不把DEBUG级别的日志打印出来。这个通过log4j.rootLogger
这个key来配置即可,下面会写到。
Log4j一个方便的地方是它基于配置文件的配置方式,这就好比技术人员想要修改黑匣子要监控的实体,没有必要把黑匣子中的相关硬件产品替换掉,只需要通过特殊的方式去改变它的监控参数即可(必应上未搜到黑匣子有控制面板或数据接口,所以这里就把它说成是特殊方式了)。
Log4j配置文件的参数是比较多的,以下介绍的几个,是其中最基本的几个,有了它们,Log4j才能正常运行,所以最后贴出的小套路的代码就是这几个基本元素的组合运用。
log4j.rootLogger
根记录器的默认级别,说人话的话就是,它这里指定的目录名才会在实际的生产中出现,而这里没有指定的,就不会出现了。
org.apache.log4j.ConsoleAppender(控制台)
相对应的还有日志输出到文件org.apache.log4j.FileAppender(文件)
Target 日志输出的地方
如果写成System.out
的话就是说明会出现在控制台。
PatternLayout 配置日志信息的格式
org.apache.log4j.PatternLayout
是说可以灵活地指定布局模式。
ConversionPattern 指定日志的输出格式
在灵活指定日志布局模式之后就可以通过这个来指定自己的日志输出的格式。
log4j.appender.error.Threshold=ERROR
这个是说会输出ERROR等级及其以上等级的日志
MaxBackupIndex 滚动文件
用于指定滚动文件的最大数
其它的还有File
是文件地址, Append
是新信息是否会追加到旧消息之下, MaxFileSize
日志文件的大小,后缀可以是KB、MB、GB。当日志文件到达该大小时会自动滚动将文件的内容添加到指定的File文件中。比如原来的File文件指定的是ilog.log
,文件满了之后会变成ilog.log.1
文件。
熟悉了这些配置之后,就可以参考下面的小套路,迅速地跑一边相应的效果了。我在套路中将log的目录设置到了D:/logs/
,即D盘的log目录下。
小套路
log4j.properties
log4j.rootLogger=DEBUG,stdout,info,debug,error,warn
log4j.logger.stdout=stdout
log4j.appender.stdout = org.apache.log4j.ConsoleAppender #输出到控制台
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
#log4j.appender.D=org.apache.log4j.RollingFileAppender
#log4j.appender.D.Threshold=DEBUG
#log4j.appender.D.File=D:/logs/d.log
#log4j.appender.D.Append=true
#log4j.appender.D.MaxFileSize=1024KB
#log4j.appender.D.MaxBackupIndex=10
#log4j.appender.D.layout=org.apache.log4j.PatternLayout
#log4j.appender.D.layout.ConversionPattern=%d - %c -%-4r [%t] %-5p %c %x - %m%n
log4j.logger.error=error
log4j.appender.error=org.apache.log4j.RollingFileAppender #输出到日志文件
log4j.appender.error.Threshold=ERROR
log4j.appender.error.File=D:/logs/error.log
log4j.appender.error.Append=true
log4j.appender.error.MaxFileSize=1024KB
log4j.appender.error.MaxBackupIndex=10
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=%d - %c -%-4r [%t] %-5p %c %x - %m%n
log4j.logger.warn=warn
log4j.appender.warn=org.apache.log4j.RollingFileAppender
log4j.appender.warn.Threshold=WARN
log4j.appender.warn.File=D:/logs/warn.log
log4j.appender.warn.Append=true
log4j.appender.warn.MaxFileSize=1024KB
log4j.appender.warn.MaxBackupIndex=10
log4j.appender.warn.layout=org.apache.log4j.PatternLayout
log4j.appender.warn.layout.ConversionPattern=%d - %c -%-4r [%t] %-5p %c %x - %m%n
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.RollingFileAppender
log4j.appender.info.Threshold=INFO
log4j.appender.info.File=D:/logs/info.log
log4j.appender.info.Append=true
log4j.appender.info.MaxFileSize=1024KB
log4j.appender.info.MaxBackupIndex=10
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d - %c -%-4r [%t] %-5p %c %x - %m%n
log4j.logger.debug=debug
log4j.appender.debug=org.apache.log4j.RollingFileAppender
log4j.appender.debug.Threshold=DEBUG
log4j.appender.debug.File=D:/logs/debug.log
log4j.appender.debug.Append=true
log4j.appender.debug.MaxFileSize=1024KB
log4j.appender.debug.MaxBackupIndex=10
log4j.appender.debug.layout=org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern=%d - %c -%-4r [%t] %-5p %c %x - %m%n
LogUtil
package com.mocha.cmcc.util;
import org.apache.log4j.Logger;
public class LogUtil {
@SuppressWarnings("rawtypes")
public static void info(Class clz, String info) {
Logger.getLogger(clz).info(info);
}
@SuppressWarnings("rawtypes")
public static void error(Class clz, String message, Exception e) {
Logger.getLogger(clz).error(message, e);
}
@SuppressWarnings("rawtypes")
public static void warn(Class clz, String message) {
Logger.getLogger(clz).warn(message);
}
@SuppressWarnings("rawtypes")
public static void debug(Class clz, String message) {
Logger.getLogger(clz).debug(message);
}
}
最后我们再来看Log4j的运行流程,很容易猜到——每次项目启动的时候会去读取配置文件里面的具体信息。然后通过LogFactory会new出一个Log实例,程序调用log实例,这样就能将要记录的信息记录到相应的文件中去。
小诀
Log4j配置先,EWID分重点。
Logger得到即可用,信息存储寻文件。