1.log4j簡單介紹
log4j的三大組件:loggers、appenders、layout
- loggers爲日誌記錄器,負責處理日誌記錄的大部分操作。
- appenders 爲日誌信息的輸出目的地,log4j中所有繼承自Appender接口的類。他們一起定義了log4j需要把日誌寫到哪些地方,比如數據庫或者是文件。
- layout爲日誌信息的輸出格式。
log4j輸出信息的類別level爲:OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL等。常用優先級爲:ERROR>WARN>INFO>DEBUG。
舉個例子:如果配置的level級別爲WARN,那麼意味着只有WARN、ERROR、FATAL被輸出。DEBUG、INFO將被屏蔽掉。
log4j支持兩種配置文件格式,一種是XML格式的文件,一種時properties格式的文件。
2.言歸正傳,log4j.xml如何配置?
- 引入log4j的依賴
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
2.log.xml的配置
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration debug="true">
<!--輸出到控制檯-->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="com.sf.sgs.sflog.log4j.layout.SfPatternLayout"/>
</appender>
<!--輸出到文件(info)-->
<!--將生成“info.log.2014-06-11”這樣的日誌文件-->
<appender name="SYSTEM" class="com.sf.sgs.sflog.log4j.appender.SFDailyRollingFileAppender">
<!-- 設置日誌信息輸出文件路徑 -->
<param name="File" value="./log4j/logs/system.log" />
<!-- 設置日誌每天回滾一次,即產生一個新的日誌文件 -->
<param name="datePattern" value="'.'yyyy-MM-dd'.log'" />
<!-- 設置日誌輸出的樣式 -->
<layout class="com.sf.sgs.sflog.log4j.layout.SfPatternLayout">
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="INFO" />
<param name="levelMax" value="INFO" />
<param name="acceptOnMatch" value="true" />
</filter>
</appender>
<!--輸出到文件(error)-->
<appender name="ERROR" class="com.sf.sgs.sflog.log4j.appender.SFDailyRollingFileAppender">
<!-- 設置日誌每天回滾一次,即產生一個新的日誌文件 -->
<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
<param name="File" value="./log4j/logs/error.log" />
<param name="maxBackupIndex" value="3" />
<layout class="com.sf.sgs.sflog.log4j.layout.SfPatternLayout">
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="ERROR" />
<param name="levelMax" value="ERROR" />
<param name="acceptOnMatch" value="true" />
</filter>
</appender>
<logger name="org.apache" additivity="false">
<level value="ERROR" />
<appender-ref ref="console" />
</logger>
<root>
<level value="INFO" />
<appender-ref ref="SYSTEM"/>
<appender-ref ref="ERROR"/>
</root>
</log4j:configuration>
3. 測試類,程序中使用
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
/**
* log4j測試
*/
@Service
public class Log4jTest {
private Logger logger = LoggerFactory.getLogger(Log4jTest.class);
protected void TestLog() {
logger.trace("trace級別的日誌輸出");
logger.debug("debug級別的日誌輸出");
logger.info("info級別的日誌輸出");
logger.warn("warn級別的日誌輸出");
logger.error("error級別的日誌輸出");
}
}
注意:
1:當additivity="false"時,root中的配置就失靈了,不遵循缺省的繼承機制
2:logger中的name非常重要,它代表記錄器的包的形式,有一定的包含關係,試驗表明
2-1:當定義的logger的name同名時,只有最後的那一個才能正確的打印日誌
2-2:當對應的logger含有包含關係時,比如:name=com.test.log4j和 name=com.test.log4j.test11,則2-1的情況是一樣的
2-3:logger的name表示所有的包含在此名的所有記錄器都遵循同樣的配置,name的值中的包含關係是指記錄器的名稱!
3:logger中定義的level和appender中的filter定義的level的區間取交集
4:如果appender中的filter定義的 levelMin > levelMax ,則打印不出日誌信息