一般的應用都會記錄日志,Java圈里面用得最多就屬log4j了,比較規范一點就是使用log4j.xml進行配置Log輸出。這里就比較有疑問,多數情況是使用log4j.properties文件吶,前面也說了,規范一點就用log4j.xml進行配置,他們之間究竟有哪些區別呢,在百度知道里面有人這么回答,個人覺得還是有點道理的,廣大博友可以自由備注。
區別不大,只是在項目中配置的文件形式不一樣。功能上沒區別。 推薦用xml 方式。
有web 項目中log4.properties不能使用Filter攔截日志級別,而log4j.xml可以,這點感覺log4j.xml要強大些
log4j.xml插入數據庫的時候sql寫在layout屬性的ConversionPattern參數中,而log4.properties則有單獨的sql屬性接受配置文件中的sql語句
雖然沒有人點贊,但是有點道理哦。有這么一個場景:某一個模塊中,我想把很重要的業務日志分離出來,保存在單獨的一個文件中,不和其他普通的日志打在一起,后續用來做統計也比較方便(我廠大部分應用都是將日志統統地打印在一起,然后通過一個日志收集平台收集到MQ、HDFS中去做統計分析,然后統計分析的時候又要對這些日志做過濾只關心特殊的業務日志,個人認為這樣很不好,不僅給后續統計分析帶來復雜度,同時也給浪費大量收集平台的網絡、IO等資源。)這里給出一個log4j.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> <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{dd/MM/yy HH:mm:ss:sss}] %t %5p %c{2}: %m%n"/> </layout> </appender> <!--自定義appender--> <appender name="logmodel1" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="logs/model1.log"/> <!--日志路徑--> <param name="Append" value="false"/> <!--是否追加--> <param name="MaxBackupIndex" value="3"/> <!--最大roll的文件數--> <param name="MaxFileSize" value="10240"/> <!--文件size上限--> <layout class="org.apache.log4j.PatternLayout"> <!--日志輸出格式--> <param name="ConversionPattern" value="[%d{dd/MM/yy HH:mm:ss:sss}] %5p %c: %m%n"/> </layout> </appender> <!--自定義logger,additivity: 是否遵循缺省的繼承機制--> <logger name="model1" additivity="false"> <level value="DEBUG"/> <appender-ref ref="logmodel1"/> </logger> <root> <level value="INFO"/> <appender-ref ref="CONSOLE"/> </root> </log4j:configuration>
簡單的模塊樣例代碼:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Log4JTest { /** * root logger */ private static final Logger LOG = LoggerFactory.getLogger(Log4JTest.class); /** * 自定義model1 logger */ private static final Logger MODEL_LOG1 = LoggerFactory.getLogger("model1"); public static void printLog(int i) { LOG.info("log something....." + i); } public static void printModelLog1(int i) { MODEL_LOG1.info("log info model1 something....." + i); MODEL_LOG1.debug("log debug model1 something....." + i); } public static void main(String[] args) throws InterruptedException { for (int i=10; i < 20; i++) { printLog(i); printModelLog1(i); Thread.sleep(1000); } } }
然后,普通的日志就直接輸出在Console上了,比較核心的printModelLog1中通過MODEL_LOG1將日志輸出到logs/model1.log文件中。具體log4j支持哪些appender以及ConversionPattern網上一搜一大把,不再贅述。