1. 配置效果
下面的log4j日志配置最终能达到的效果是对于全局日志可以根据级别输入到对应级别的日志文件中,注意低级别的日志文件会同时包含高级别的日志信息,例如info级别的日志文件会包含info,warn,error信息,对于一些重要的模块,可以单独输出到独立的文件夹文件中,同时对单独模块也可以像全局日志那样根据日志级别输入到对应文件中 也可以配置该模块日志信息是否同时输入到全局日志中
2. 样板Log4j配置示例
这段配置的效果是配置3个全局的输出目的地,分别输出到控制台,和两个文件中,控制台的输出级别是info,两个文件的输出级别分别是info和error,配置一个login(登录)模块的日志输出到文件中,并且配置该模块日志信息不输出到全局日志中,在该模块中日志同样按照级别输出到不同文件
log4j.rootLogger=DEBUG,console, infofile, errorfile
#日志文件输出目录
basedir=${catalina.home}/logs/basemvc
#登录模块日志输出目录
logindir=${basedir}/login
#控制台日志-输出info以上
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=info
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-ddHH\:mm\:ss}[%-5p]%m%n%n
#文件中info级别以上日志
log4j.appender.infofile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.infofile.Append=true
log4j.appender.infofile.DatePattern='.'yyyy-MM-dd
log4j.appender.infofile.File=${basedir}/info.log
log4j.appender.infofile.Threshold=info
log4j.appender.infofile.layout=org.apache.log4j.PatternLayout
log4j.appender.infofile.layout.ConversionPattern=%d{yyyy-MM-ddHH\:mm\:ss}[%-5p]%m%n%n
#文件中error级别以上日志
log4j.appender.errorfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorfile.Append=true
log4j.appender.errorfile.DatePattern='.'yyyy-MM-dd
log4j.appender.errorfile.File=${basedir}/error.log
log4j.appender.errorfile.Threshold=ERROR
log4j.appender.errorfile.layout=org.apache.log4j.PatternLayout
log4j.appender.errorfile.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} [%-5p] %m%n%n
#--------------------以下login模块相关日志--------------------
#login模块输出
#INFO及以上级别的log进行输出
log4j.logger.login=INFO,logininfofile,loginerrorfile
#login模块文件中存储info级别以上日志
log4j.appender.logininfofile.Threshold=INFO
#以文件类型输出
log4j.appender.logininfofile=org.apache.log4j.DailyRollingFileAppender
#输出路径
log4j.appender.logininfofile.File=${logindir}/info_login.log
#配置文件输出的文件命名,这种格式文件会在凌晨生成一个文件,想在其他时间生成新文件可以查看DatePattern的相关配置
log4j.appender.logininfofile.DatePattern='_'yyyy-MM-dd'.log'
#输出格式
log4j.appender.logininfofile.layout=org.apache.log4j.PatternLayout
log4j.appender.logininfofile.layout.ConversionPattern=%d %p [%c] - %m%n
#login模块文件中存储error级别以上日志
log4j.appender.loginerrorfile.Threshold=ERROR
#以文件类型输出
log4j.appender.loginerrorfile=org.apache.log4j.DailyRollingFileAppender
#输出路径
log4j.appender.loginerrorfile.File=${logindir}/error_login.log
#配置文件输出的文件命名,这种格式文件会在凌晨生成一个文件,想在其他时间生成新文件可以查看DatePattern的相关配置
log4j.appender.loginerrorfile.DatePattern='_'yyyy-MM-dd'.log'
#输出格式
log4j.appender.loginerrorfile.layout=org.apache.log4j.PatternLayout
log4j.appender.loginerrorfile.layout.ConversionPattern=%d %p [%c] - %m%n
#设置这个子Logger输出日志不在父级别logger里面输出
log4j.additivity.login=false
#--------------------以上login模块相关日志--------------------
3. 配置简要解释
3.1 关于全局日志的配置
关于日志的输出级别
log4j日志级别分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG。通过在配置文件中配置,可以控制到应用程序中相应级别的日志信息的开关。比如在配置文件中定义了log4j.rootLogger为INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来,也是说大于等于的级别的日志才输出。全局日志配置 log4j.rootLogger
这个是用来定义日志全局的输出级别以及输出的目的地,这里我定义的是log4j.rootLogger=info, console, infofile, errorfile,这里定义了全局输出的日志为INFO级别,也就是说能输出的日志级别一定不低于INFO级别,即DEBUG级别的日志将不会输出,输出到哪呢?输出到紧接其后定义的目的地 console, infofile, errorfile,这个3个目的地可以随意命名,在每个目的地中可以具体细化日志的配置,即他们可以再次对日志的级别进行过滤,对日志输出格式进行细化,对日志输出端类型进行指定。-
指定日志输出目的地中输出端 log4j.appender.目的地名称
就是配置输出到这个目的地的日志,他是在控制台中输出,还是以文件的形式输出,如果以文件的形式输出,那么其文件产生时机是什么时候org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方) 指定日志输出目的地中日志输出级别 log4j.appender.interceptor.Threshold
通过该属性可以指定目的地中日志输出的级别,相当于对全局配置的日志级别再次做一次过滤
3.2 关于单独模块日志配置
log4j.logger.login.模块名
这一句配置相当于新添了一个日志模块,他的值与rootLogger代表意义相同,即指定相对该模块下全局日志级别及对应的输出目的地,其余对应目的地的配置和全局日志相同log4j.additivity.模块名
设置这个子Logger输出日志是否在父级别logger里面输出,true表示同时在父级的日志输出,这里的模块名可以换为模块下的目的地名称,效果是一样的
4. java中使用日志
对于在java中使用,单独日志模块要想独立输出获取日志对象时在方法参数中要传入模块名称,对于全局日志对象只需传入当前类的class对象即可,代码示例如下:
public class UserAction {
//登录模块使用的日志对象
private Logger loginLogger = Logger.getLogger("login");
//全局日志对象
private Logger logger = Logger.getLogger(UserAction.class);
public void detail(){
logger.debug("user_product----"+"debug");
logger.info("user_product----"+"info");
logger.warn("user_product----"+"warn");
logger.error("user_product----"+"error");
}
public void login(){
loginLogger.debug("user_product----"+"debug");
loginLogger.info("user_product----"+"info");
loginLogger.warn("user_product----"+"warn");
loginLogger.error("user_product----"+"error");
}