若系统中未显式的指定配置文件,则Logj4默认会加载log4j.xml和log4j.properties文件。
当系统调用Log4j的LoggerFactory.getLogger()方法时,调用栈如下:
在LogManager.<client>即静态块的初始块中,若系统中未定义log4j.configuration属性,则Log4j首先尝试加载log4j.xml,若加载失败,再尝试加载log4j.properties。
具体的加载方法在Loader.getResource()中,该方法首先尝试使用当前线程上下文中的ClassLoader去加载配置文件(log4j.xml或log4j.properties),若失败再使用加载Log4j的ClassLoader尝试加载资源,最后使用加载系统类的ClassLoader去加载资源。
使用默认加载方式时,需要将配置文件log4j.xml或log4j.properties放到对应ClassLoader的ClassPath中去,文件名不能使用自定义的名称。
显式指定文件路径进行加载:
public class TestLog4j{ public static void main(String[] args){ PropertyConfigurator.configure( " D:/Code/conf/log4j.properties " ); Logger logger = Logger.getLogger(TestLog4j. class ); logger.debug( " debug " ); logger.error( " error " ); } }
Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可接key=value格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。
基本格式如下:
#配置根Logger log4j.rootLogger=[ level ],appenderName1,appenderName2,... ... #配置日志信息输出目的地Appender X log4j.appender.appenderNameX=fully.qualified.name.of.appender.class log4j.appender.appenderNameX.option1=value1 ... ... log4j.appender.appenderNameX.optionN=valueN #配置日志信息的格式(布局) log4j.appender.appenderNameX.layout=fully.qualified.name.of.layout.class log4j.appender.appenderNameX.layout.option1=value1 ... ... log4j.appender.appenderNameX.layout.optionN=valueN ... ... ... ...
ConversionPattern,例如:log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
Log4j日志输出格式类似C语言中printf()函数打印格式化信息。
日志信息格式中的符号含义如下:
代码实例:
log4j.properties:
log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Sl4jLog4jTestingApp { public static final Logger logger = LoggerFactory.getLogger(Sl4jLog4jTestingApp.class); public static void main(String[] args){ logger.debug("debug!!!"); logger.info("info!!!"); logger.warn("warn!!!"); logger.error("error!!!"); } }
INFO [main] (Sl4jLog4jTestingApp.java:13) - info!!! WARN [main] (Sl4jLog4jTestingApp.java:14) - warn!!! ERROR [main] (Sl4jLog4jTestingApp.java:15) - error!!!
在配置文件 - log4j.properties 中按包名-package 或类 - class 名来定义Logger,在程序中按类名取Logger:
定义:
log4j.rootLogger =debug, stdout log4j.logger.com.mypkg =debug, base log4j.logger.com.mypkg.db =info, db log4j.logger.com.mypkg.mail =debug, mail #stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5r [%5p][%c{2}] %m%n #base log4j.appender.base=org.apache.log4j.RollingFileAppender log4j.appender.base.File=system.log log4j.appender.base.Append=true log4j.appender.base.MaxFileSize=1MB log4j.appender.base.MaxBackupIndex=1 log4j.appender.base.layout=org.apache.log4j.PatternLayout log4j.appender.base.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] - %m%n #db log4j.appender.db=org.apache.log4j.FileAppender log4j.appender.db.File=db.log log4j.appender.db.Append=true log4j.appender.db.layout=org.apache.log4j.PatternLayout log4j.appender.db.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] - %m%n #mail log4j.appender.mail=org.apache.log4j.FileAppender log4j.appender.mail.File=mail.log log4j.appender.mail.Append=true log4j.appender.mail.layout=org.apache.log4j.PatternLayout log4j.appender.mail.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] - %m%n # log4j.additivity.com.mypkg=false log4j.additivity.com.mypkg.db=false log4j.additivity.com.mypkg.mail=false
使用 - 正常使用:
package com.mypkg; public class Class1 { private static Logger logger = Logger.getLogger(Class1.class); ... if(logger.isDebugEnabled()) logger.debug("debug info"); ... } package com.mypkg.db; public class Class2 { private static Logger logger = Logger.getLogger(Class2.class); ... if(logger.isDebugEnabled()) logger.debug("debug info"); ... } package com.mypkg.mail; public class Class3 { private static Logger logger = Logger.getLogger(Class3.class); ... if(logger.isDebugEnabled()) logger.debug("debug info"); ... }
还可以为指定类配置一个logger,如为类com.mypkg.db.ConnectionPool配置一个logger:
log4j.logger.com.mypkg.db.ConnectionPool=debug,pool log4j.appender.pool=org.apache.log4j.FileAppender log4j.appender.pool.File=pool.log log4j.appender.pool.Append=true log4j.appender.pool.layout=org.apache.log4j.PatternLayout log4j.appender.pool.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] - %m%n log4j.additivity.com.mypkg.db.ConnectionPool=false
这样一来,ConnectionPool类的日志就会记入pool.log,不会记入db.log。