日志的配置文件有兩種:
第一
### 設置### 1p:表示日志的輸出級別,2p:定義了一個名稱用來代表輸出到控制台的,....3p:全局的日志類型
log4j.rootLogger = debug,cansole
### 輸出信息到控制抬 ###
log4j.appender.cansole = org.apache.log4j.ConsoleAppender
log4j.appender.cansole.Target = System.out
log4j.appender.cansole.layout = org.apache.log4j.PatternLayout
log4j.appender.cansole.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 自定義的日志類型:sceneTest1, SceneTest1:是索引的值
log4j.logger.SceneTest1= debug,sceneTest1
log4j.appender.sceneTest1=org.apache.log4j.FileAppender
log4j.appender.sceneTest1.File =F://logs/sceneTest1.log
log4j.appender.sceneTest1.layout = org.apache.log4j.PatternLayout
log4j.appender.sceneTest1.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 自定義的日志類型:sceneTest2, SceneTest2:是索引的值
log4j.logger.SceneTest2= debug,sceneTest2
log4j.appender.sceneTest2=org.apache.log4j.FileAppender
log4j.appender.sceneTest2.File =F://logs/sceneTest2.log
log4j.appender.sceneTest2.layout = org.apache.log4j.PatternLayout
log4j.appender.sceneTest2.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
不使用類,而是使用loggerName來創建日志:
#json是用java代碼創建logger時用name,而不是jsonlog,注意,不需要在rootLogger中再配置,否則其它無關信息也將輸出到jsonlog中
log4j.logger.json=DEBUG,jsonlog
log4j.additivity.json=false
log4j.appender.jsonlog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.jsonlog.File = logs/jsonlog.log
log4j.appender.jsonlog.Append = true
log4j.appender.jsonlog.Threshold = INFO
log4j.appender.jsonlog.layout = org.apache.log4j.PatternLayout
log4j.appender.jsonlog.layout.ConversionPattern =%5p %d %C: %m%n
java創建日志的方法
1
|
Logger logger=Logger.getLoger(
"json"
);
|
第二中、xml的配置:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <!-- * 1. 一個appender子元素定義一個日志輸出目的地 * 2. 一個logger子元素定義一個日志寫出器 --> <!-- catalina.out --> <appender name="consoleAppend" class="org.apache.log4j.ConsoleAppender" > <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} [%5p][%t][%c{1}]-[%M] %m%n" /> </layout> </appender> <!-- error log --> <appender name="errorAppend" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="${webapp.root}/logs/SceneTest1.log" /> <param name="Append" value="true" /> <param name="MaxBackupIndex" value="10" /> <param name="MaxFileSize" value="4000000" /> <param name="encoding" value="utf-8"/> <layout class="org.apache.log4j.PatternLayout" > <param name="PatternConverter" value="%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n"/> </layout> </appender> <!-- logger的作用: 1.[name屬性]:指定你定義Logger對象時候的name 2. additivity : children-logger是否使用 rootLogger的配置, additivity在log4j默認為true。這解釋了為什么有些時候,一個日志信息在屏幕上會有多次輸出。 3.還可以指定level(輸出級別)、appender-ref(指定哪個append) --> <!-- loggers 定義的日志場景SceneTest1 --> <logger name="SceneTest1" additivity="true"> <!-- 如果1個包想對應多個 Appender 就這樣,對於每個Appender自定義的日志級別可以在Appender上加上filter --> <appender-ref ref="errorAppend" /> </logger> <!-- root的作用(相當於全局的意思): 1.[priority ]:指定默認的全局輸出級別 2.[appender-ref ]:指定一些默認的append(沒有指出特殊包或者類,即那些沒有指定<logger>元素的append)的輸出; --> <root> <priority value="INFO" /> <!-- 將 logger 中 additivity=true 的日志或者沒有指定<logger>的append輸出到控制台 --> <appender-ref ref="consoleAppend" /> <!-- 將全局的 error 日志輸出到error文件中 --> <!--<appender-ref ref="errorAppend" />--> </root> </log4j:configuration>
這兩種方式大同小異。稍微做下對比就可以知道了。
除了配置文件的形式配置日志,還能通過代碼動態的配置屬性和文件
比如,1、動態的初始化配置代碼
/* * 動態獲取配置信息 */ public static Properties getProperties(){ Properties pp = new Properties(); pp.put("log4j.rootLogger", "info"); pp.put("log4j.logger.SceneTest2","debug,sceneTest2"); pp.put("log4j.appender.sceneTest2", "org.apache.log4j.FileAppender"); pp.put("log4j.appender.sceneTest2.File", "${webapp.root}/logs/SceneTest2.log"); pp.put("log4j.appender.sceneTest2.layout", "org.apache.log4j.PatternLayout"); pp.put("log4j.appender.sceneTest2.layout.ConversionPattern", "%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m -(:%L)%n"); return pp; } PropertyConfigurator.configure(CoustomLogger.getProperties());
2、可以往這個logger里面添加Appender,應用於多個功能或者場景下輸出到不同的日志文件等。
public static Appender getAppender(){ Layout layout = new PatternLayout("%d %p [%c] - %m%n"); Appender appender = null; try { appender= new FileAppender(layout,"F://logs/sceneTest3.log"); } catch (IOException e) { e.printStackTrace(); } return appender; }
3、最后添加這個控制台,和xml配置的<logger/>標簽很類似。
PropertyConfigurator.configure(CoustomLogger.getProperties()); Logger logger = Logger.getLogger("SceneTest2"); logger.addAppender(CoustomLogger.getAppender()); logger.debug("debug logger out ");
總結,配置log4j可以通過動態和靜態配置。可以實現不同的功能模塊輸出logger到不同的控制器
如果采用靜態配置文件的形式配置的話,啟動方式有:
1、如果是xml配置文件,可通過web.xml的相關配置來初始化配置
,也可以在在spring bean容器中配置:
<bean id="log4jInitialization" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetClass" value="org.springframework.util.Log4jConfigurer" /> <property name="targetMethod" value="initLogging" /> <property name="arguments"> <list> <value>classpath:log4j.xml</value> </list> </property> </bean>
2、如果是properties文件,則在web.xml中配置初始化