SLF4j API: http://www.slf4j.org/api/org/slf4j/Logger.html
log4j:参考 http://www.iteye.com/topic/378077
log4j FAQ: http://www.java2s.com/CN/Code/Java/Language-Basics/Log4j.htm
- <slf4j-api.version>1.5.11slf4j-api.version>
- <log4j.version>1.2.16log4j.version>
- <slf4j-log4j12.version>1.5.6slf4j-log4j12.version>
- <dependency>
- <groupId>com.alibaba.externalgroupId>
- <artifactId>org.slf4j.slf4j-apiartifactId>
- <version>${slf4j-api.version}version>
- dependency>
- <dependency>
- <groupId>com.alibaba.externalgroupId>
- <artifactId>jakarta.log4jartifactId>
- <version>${log4j.version}version>
- dependency>
- <dependency>
- <groupId>com.alibaba.externalgroupId>
- <artifactId>org.slf4j.slf4j-log4j12artifactId>
- <version>${slf4j-log4j12.version}version>
- dependency>
- <dependency>
- <groupId>com.alibaba.externalgroupId>
- <artifactId>jakarta.log4jartifactId>
- <version>1.2.16version>
- dependency>
知识点梳理:
(1)让下一次增加的log内容添加到log文件最后,
而不是覆盖, true"/>
(2)分别控制每个部分的输出格式:分别在每种输出格式里面说明就可以了
(3)让console和file都输出:
将文件输出样式和标准输出样式都加到root标签中。
<appender-ref ref="FILE" />
<appender-ref ref="STDOUT" />
(4)Log4j的继承
Parent类:
log4j.xml另外一个模板
< dependency >
< groupId >com.alibaba.external groupId >
< artifactId >org.slf4j.slf4j-api artifactId >
< version >1.5.11 version >
dependency >
< dependency >
< groupId >com.alibaba.external groupId >
< artifactId >jakarta.log4j artifactId >
< version >1.2.16 version >
dependency >
import org.apache.log4j.Logger;
public class Parent {
protected static Logger log = null; //不能为private
Parent(){
log= Logger.getLogger(getClass().getName());
}
public static void testParent(){
log.info( "--hello parent!--");
}
public static void main(String[] args) {
new Parent().testParent();
}
}
public class Parent {
protected static Logger log = null; //不能为private
Parent(){
log= Logger.getLogger(getClass().getName());
}
public static void testParent(){
log.info( "--hello parent!--");
}
public static void main(String[] args) {
new Parent().testParent();
}
}
Son类:
public
class Son
extends Parent {
public void testSon(){
log.info( "---hello son---"); //利用父类继承过来的log对象
}
public static void main(String[] args) {
new Son().testSon();
}
}
public void testSon(){
log.info( "---hello son---"); //利用父类继承过来的log对象
}
public static void main(String[] args) {
new Son().testSon();
}
}
(5)输出格式转换
转换模式(conversion pattern)为"%r [%t] %-5p %c - %m%n"的PatternLayout将生成类似于以下内容的输出:
176 [main] INFO org.foo.Bar - Located nearest gas station.
在上面的输出中:
* 第一个字段表示自程序开始到发出日志记录请求时所消耗的毫秒数
* 第二个字段表示发出日志记录请求的线程
* 第三个字段表示日志记录请求的Level
* 第四个字段表示发出日志记录请求的Logger的名称
* 第五个字段(-后的文本)表示日志记录请求的消息
176 [main] INFO org.foo.Bar - Located nearest gas station.
在上面的输出中:
* 第一个字段表示自程序开始到发出日志记录请求时所消耗的毫秒数
* 第二个字段表示发出日志记录请求的线程
* 第三个字段表示日志记录请求的Level
* 第四个字段表示发出日志记录请求的Logger的名称
* 第五个字段(-后的文本)表示日志记录请求的消息
log4j的配置文件如下:
xml
version
="1.0"
encoding
="GB2312"
?>
< log4j:configuration xmlns:log4j ='http://jakarta.apache.org/log4j/' >
< appender name ="LOG.DEBUG" class ="org.apache.log4j.RollingFileAppender" >
< param name ="File" value ="d:/log/debug.log" />
< param name ="MaxFileSize" value ="5120KB" />
< param name ="MaxBackupIndex" value ="10" />
< layout class ="org.apache.log4j.PatternLayout" >
< param name ="ConversionPattern" value ="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />
layout >
< filter class ="org.apache.log4j.varia.LevelRangeFilter" >
< param name ="LevelMin" value ="DEBUG" />
< param name ="LevelMax" value ="DEBUG" />
filter >
appender >
< appender name ="LOG.INFO" class ="org.apache.log4j.RollingFileAppender" >
< param name ="File" value ="d:/log/info.log" />
< param name ="MaxFileSize" value ="5120KB" />
< param name ="MaxBackupIndex" value ="10" />
< layout class ="org.apache.log4j.PatternLayout" >
< param name ="ConversionPattern" value ="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />
layout >
< filter class ="org.apache.log4j.varia.LevelRangeFilter" >
< param name ="LevelMin" value ="INFO" />
< param name ="LevelMax" value ="INFO" />
filter >
appender >
< appender name ="LOG.WARN" class ="org.apache.log4j.RollingFileAppender" >
< param name ="File" value ="d:/log/warn.log" />
< param name ="MaxFileSize" value ="5120KB" />
< param name ="MaxBackupIndex" value ="10" />
< layout class ="org.apache.log4j.PatternLayout" >
< param name ="ConversionPattern" value ="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />
layout >
< filter class ="org.apache.log4j.varia.LevelRangeFilter" >
< param name ="LevelMin" value ="WARN" />
< param name ="LevelMax" value ="WARN" />
filter >
appender >
< appender name ="LOG.ERROR" class ="org.apache.log4j.RollingFileAppender" >
< param name ="File" value ="d:/log/error.log" />
< param name ="MaxFileSize" value ="5120KB" />
< param name ="MaxBackupIndex" value ="10" />
< layout class ="org.apache.log4j.PatternLayout" >
< param name ="ConversionPattern" value ="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />
layout >
< filter class ="org.apache.log4j.varia.LevelRangeFilter" >
< param name ="LevelMin" value ="ERROR" />
< param name ="LevelMax" value ="ERROR" />
filter >
appender >
< appender name ="LOG.FATAL" class ="org.apache.log4j.RollingFileAppender" >
< param name ="File" value ="d:/log/fatal.log" />
< param name ="MaxFileSize" value ="5120KB" />
< param name ="MaxBackupIndex" value ="10" />
< layout class ="org.apache.log4j.PatternLayout" >
< param name ="ConversionPattern" value ="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />
layout >
< filter class ="org.apache.log4j.varia.LevelRangeFilter" >
< param name ="LevelMin" value ="FATAL" />
< param name ="LevelMax" value ="FATAL" />
filter >
appender >
< root >
< priority value ="DEBUG" />
< appender-ref ref ="LOG.DEBUG" />
< appender-ref ref ="LOG.INFO" />
< appender-ref ref ="LOG.WARN" />
< appender-ref ref ="LOG.ERROR" />
< appender-ref ref ="LOG.FATAL" />
root >
log4j:configuration >
< log4j:configuration xmlns:log4j ='http://jakarta.apache.org/log4j/' >
< appender name ="LOG.DEBUG" class ="org.apache.log4j.RollingFileAppender" >
< param name ="File" value ="d:/log/debug.log" />
< param name ="MaxFileSize" value ="5120KB" />
< param name ="MaxBackupIndex" value ="10" />
< layout class ="org.apache.log4j.PatternLayout" >
< param name ="ConversionPattern" value ="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />
layout >
< filter class ="org.apache.log4j.varia.LevelRangeFilter" >
< param name ="LevelMin" value ="DEBUG" />
< param name ="LevelMax" value ="DEBUG" />
filter >
appender >
< appender name ="LOG.INFO" class ="org.apache.log4j.RollingFileAppender" >
< param name ="File" value ="d:/log/info.log" />
< param name ="MaxFileSize" value ="5120KB" />
< param name ="MaxBackupIndex" value ="10" />
< layout class ="org.apache.log4j.PatternLayout" >
< param name ="ConversionPattern" value ="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />
layout >
< filter class ="org.apache.log4j.varia.LevelRangeFilter" >
< param name ="LevelMin" value ="INFO" />
< param name ="LevelMax" value ="INFO" />
filter >
appender >
< appender name ="LOG.WARN" class ="org.apache.log4j.RollingFileAppender" >
< param name ="File" value ="d:/log/warn.log" />
< param name ="MaxFileSize" value ="5120KB" />
< param name ="MaxBackupIndex" value ="10" />
< layout class ="org.apache.log4j.PatternLayout" >
< param name ="ConversionPattern" value ="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />
layout >
< filter class ="org.apache.log4j.varia.LevelRangeFilter" >
< param name ="LevelMin" value ="WARN" />
< param name ="LevelMax" value ="WARN" />
filter >
appender >
< appender name ="LOG.ERROR" class ="org.apache.log4j.RollingFileAppender" >
< param name ="File" value ="d:/log/error.log" />
< param name ="MaxFileSize" value ="5120KB" />
< param name ="MaxBackupIndex" value ="10" />
< layout class ="org.apache.log4j.PatternLayout" >
< param name ="ConversionPattern" value ="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />
layout >
< filter class ="org.apache.log4j.varia.LevelRangeFilter" >
< param name ="LevelMin" value ="ERROR" />
< param name ="LevelMax" value ="ERROR" />
filter >
appender >
< appender name ="LOG.FATAL" class ="org.apache.log4j.RollingFileAppender" >
< param name ="File" value ="d:/log/fatal.log" />
< param name ="MaxFileSize" value ="5120KB" />
< param name ="MaxBackupIndex" value ="10" />
< layout class ="org.apache.log4j.PatternLayout" >
< param name ="ConversionPattern" value ="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />
layout >
< filter class ="org.apache.log4j.varia.LevelRangeFilter" >
< param name ="LevelMin" value ="FATAL" />
< param name ="LevelMax" value ="FATAL" />
filter >
appender >
< root >
< priority value ="DEBUG" />
< appender-ref ref ="LOG.DEBUG" />
< appender-ref ref ="LOG.INFO" />
< appender-ref ref ="LOG.WARN" />
< appender-ref ref ="LOG.ERROR" />
< appender-ref ref ="LOG.FATAL" />
root >
log4j:configuration >
xml
version
="1.0"
encoding
="GB2312"
?>
< log4j:configuration xmlns:log4j ="http://jakarta.apache.org/log4j/" >
< appender name ="STDOUT" class ="org.apache.log4j.ConsoleAppender" >
< layout class ="org.apache.log4j.PatternLayout" >
< param name ="ConversionPattern"
value ="%-4r [%t] %-5p %c %x - %m%n" />
layout >
< filter class ="org.apache.log4j.varia.LevelRangeFilter" >
< param name ="levelMin" value ="INFO" />
< param name ="levelMax" value ="ERROR" />
< param name ="AcceptOnMatch" value ="true" />
filter >
appender >
< appender name ="FILE"
class ="org.apache.log4j.RollingFileAppender" >
< param name ="File" value ="all.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" />
layout >
appender >
< root >
< priority value ="INFO" />
< appender-ref ref ="FILE" />
< appender-ref ref ="STDOUT" />
root >
log4j:configuration >
< log4j:configuration xmlns:log4j ="http://jakarta.apache.org/log4j/" >
< appender name ="STDOUT" class ="org.apache.log4j.ConsoleAppender" >
< layout class ="org.apache.log4j.PatternLayout" >
< param name ="ConversionPattern"
value ="%-4r [%t] %-5p %c %x - %m%n" />
layout >
< filter class ="org.apache.log4j.varia.LevelRangeFilter" >
< param name ="levelMin" value ="INFO" />
< param name ="levelMax" value ="ERROR" />
< param name ="AcceptOnMatch" value ="true" />
filter >
appender >
< appender name ="FILE"
class ="org.apache.log4j.RollingFileAppender" >
< param name ="File" value ="all.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" />
layout >
appender >
< root >
< priority value ="INFO" />
< appender-ref ref ="FILE" />
< appender-ref ref ="STDOUT" />
root >
log4j:configuration >
【注意】
1、Log4j设置循环记录日志文件
- log4j.appender.fileout=org.apache.log4j.RollingFileAppender
- log4j.appender.fileout.File=#### 为文件名,这个存放的位置为project工程的根目录
- log4j.appender.fileout.MaxFileSize=5MB
- log4j.appender.fileout.MaxBackupIndex=50
- log4j.appender.fileout.layout=org.apache.log4j.PatternLayout
- log4j.appender.fileout.layout.ConversionPattern=%d{ABSOLUTE} %-5p %t %c{5} - %m%n
某个类输出日志到某个log文件配置
log4j.rootLogger=info, stdout,console
log4j.appender.stdout=org.apache.log4j.DailyRollingFileAppender
log4j.appender.stdout.File=../log/updater.log
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %-17c{2} - %m%n
log4j.appender.stdout.Append=true
log4j.appender.stdout.File=../log/updater.log
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %-17c{2} - %m%n
log4j.appender.stdout.Append=true
#console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %-17c{2} - %m%n
#log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %-17c{2} - %m%n
#log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n
#app log
#com.wonibo.projectx.service.index.ReadTxtDaemon类使用warn级别且使用
txtfailure类型的appender
log4j.logger.com.wonibo.projectx.service.index.ReadTxtDaemon=warn,
txtfailure
#未指定appender的则从root继承
log4j.logger.org.springframework=warn
log4j.logger.org.springframework=warn
log4j.logger.org.hibernate.ps.PreparedStatementCache=warn
log4j.logger.org.hibernate=warn
log4j.logger.org.hibernate.SQL=warn
log4j.logger.org.hibernate.type=warn
log4j.logger.org.hibernate=warn
log4j.logger.org.hibernate.SQL=warn
log4j.logger.org.hibernate.type=warn
log4j.logger.com.danga.MemCached=warn
log4j.logger.org.apache.velocity=warn
log4j.logger.org.apache.velocity=warn
log4j.appender.
txtfailure=org.apache.log4j.FileAppender
log4j.appender. txtfailure.File=../log/txtfailure.log
log4j.appender. txtfailure.layout=org.apache.log4j.PatternLayout
log4j.appender. txtfailure.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %-17c{2} - %m%n
log4j.appender. txtfailure.Append=true
log4j.appender. txtfailure.File=../log/txtfailure.log
log4j.appender. txtfailure.layout=org.apache.log4j.PatternLayout
log4j.appender. txtfailure.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %-17c{2} - %m%n
log4j.appender. txtfailure.Append=true
log4j.properties的放置位置
http://gigi-112.javaeye.com/blog/587965
- public Logger m_log = null;
- public ETrafficPlanService(){
- PropertyConfigurator.configure("data//config//log4j//log4j_etraffic.properties");
- m_log = Logger.getLogger(ETrafficPlanService.class);
- m_log.debug("debug test...........");
- }
问题总结:
1、
PropertyConfigurator.configure("src\\test\\java\\log4j.properties");//位置相对于工程根目录的位置为起点
【注意】只针对Properties文件有效,xml配置文件无效
读取XML配置文件:
DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件
- private Logger logger;
- public MyThread() {
- super();
- //PropertyConfigurator.configure(System.getProperty("user.dir") + "/src/main/java/com/alibaba/thread/log.properties");
- DOMConfigurator.configure(System.getProperty("user.dir") + "/src/main/java/com/alibaba/thread/log4j.xml");
- logger = LoggerFactory.getLogger(this.getClass().getName());
- }
【注意】
相对路径: DOMConfigurator.configure(this.getClass().getClassLoader().getResource("com/alibaba/thread/log4j.xml"));
绝对路径:
DOMConfigurator.configure(System.getProperty("user.dir") + "/src/main/java/com/alibaba/thread/log4j.xml");
2、log4j.appender.stdout.File=../log/updater.log //位置的起点为工程的根目录为起点
例如../log/updater.log:表示工程根目录的上级目录下的log,再生成updater.log文件
3、Logger
默认使用log4j.rootLogger, 也可以自定义某些包或类的logger:log4j.logger.com.alibaba.maven.hello.Simple
log的日志级别:ALL< TRACE <
DEBUG < INFO < WARN < ERROR < FATAL < OFF
常用为中间4种
4、Appender
AppenderSkeleton, AsyncAppender, ConsoleAppender, DailyRollingFileAppender, ExternallyRolledFileAppender, FileAppender, JDBCAppender, JMSAppender, LF5Appender, NTEventLogAppender, NullAppender, RollingFileAppender, SMTPAppender, SocketAppender, SocketHubAppender, SyslogAppender, TelnetAppender, WriterAppender
API: http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Appender.html
设置DailyRollingFileAppender时,可以设置之前的log修改成什么样的格式
log4j.appender.simple.DatePattern='_'yyyy-MM-dd
5、输出类型:
layout
Simple layout-- org.apache.log4j.SimpleLayout
SimpleLayout formats the output in a very simple manner, it prints the Level, then a dash '-' and then the log message.
SimpleLayout formats the output in a very simple manner, it prints the Level, then a dash '-' and then the log message.
PatternLayout --org.apache.log4j.PatternLayout
PatternLayout formats the output based on a conversion pattern specified, or if none is specified, the default conversion pattern.
PatternLayout formats the output based on a conversion pattern specified, or if none is specified, the default conversion pattern.
HTML layout-- org.apache.log4j.HTMLLayout
HTMLLayout formats the output as a HTML table.
HTMLLayout formats the output as a HTML table.
XMLLayout-- org.apache.log4j.xml.XMLLayout
XMLLayout formats the output as a XML.
XMLLayout formats the output as a XML.
6、什么情况可以使用SLF4j
如果你开发的是类库或者嵌入式组件,那么就应该考虑采用SLF4J,因为不可能影响最终用户选择哪种日志系统。在另一方面,如果是一个简单或者独立的应用,确定只有一种日志系统,那么就没有使用SLF4J的必要。假设你打算将你使用log4j的产品卖给要求使用JDK 1.4 Logging的用户时,面对成千上万的log4j调用的修改,相信这绝对不是一件轻松的事情。但是如果开始便使用SLF4J,那么这种转换将是非常轻松的事情。
< dependency >
< groupId >com.alibaba.external groupId >
< artifactId >org.slf4j.slf4j-api artifactId >
< version >1.5.11 version >
dependency >
< dependency >
< groupId >com.alibaba.external groupId >
< artifactId >jakarta.log4j artifactId >
< version >1.2.16 version >
dependency >