1. Java常用日志輸出
java中進行日志打印的方法有很多種,主要分為以下幾類:
1 最簡單的system.print.out、err之類的打印
2 java.util.logging ; 在JDK 1.4 版本之后,提供了日志的API ,可以往文件中寫日志了
3 log4j , 最強大的記錄日志的方式。 可以通過配置 .properties 或是 .xml 的文件, 配置日志的目的地,格式等等
4 commons-logging, 最綜合和常見的日志記錄方式, 經常是和log4j 結合起來使用
當然這里並不打算介紹每一種日志輸出,而是着重講一下log4j日志打印。
2. log4j
log4j作為之前比較流行的日志打印插件,可以在控制台打印信息,並將信息記錄到文件里面。但隨着log4j2的出現,log4j逐漸被舍棄。
3. log4j2
log4j2和log4j同屬一個作者開發,log4j2是后來重新架構的一款日志組件,拋棄了之前log4j的不足,以及吸取了優秀的logback的設計重新推出的一款新組件。
3.1. log4j2和slf4j
一般來說log4j2是和slf4j搭配使用,主要原因如下:
log4j2是一個日志框架,slf4j是日志框架接口,之所以使用log4j2和slf4j搭配使用是為了以后如果項目對日志有其它要求而需要更換日志框架時可以不改動代碼,只需要把依賴的jar包換掉就可以了。
3.2. 依賴jar包
// log4j2依賴
log4j-api-2.8.2.jar
log4j-core-2.8.2.jar
// log4j2和slf4j橋接依賴
log4j-slf4j-impl-2.8.2.jar
// slf4j依賴
slf4j-api-1.7.25.jar
3.3. 配置文件
新建一個log4j2.xml文件置於src文件夾下面。相關知識了解:
使用log4j2之前需要在classpath下新建一個配置文件。需要注意的是log4j 2.x版本不再支持像1.x中的.properties后綴的文件配置方式,2.x版本配置文件后綴名只能為”.xml”,”.json”或者”.jsn”。
系統選擇配置文件的優先級(從先到后)如下:
classpath下的名為log4j2-test.json 或者log4j2-test.jsn的文件
classpath下的名為log4j2-test.xml的文件
classpath下名為log4j2.json 或者log4j2.jsn的文件
classpath下名為log4j2.xml的文件
示例:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!--Configuration后面的status,這個用於設置log4j2自身內部的信息輸出,可以不設置,當設置成trace時,你會看到log4j2內部各種詳細輸出--> 3 <!--monitorInterval:Log4j能夠自動檢測修改配置 文件和重新配置本身,設置間隔秒數--> 4 <configuration monitorInterval="5"> 5 <!--日志級別以及優先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> 6 7 <!--變量配置--> 8 <Properties> 9 <!-- 格式化輸出:%date表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度 %msg:日志消息,%n是換行符--> 10 <!-- %logger{36} 表示 Logger 名字最長36個字符 --> 11 <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" /> 12 <!-- 定義日志存儲的路徑,不要配置相對路徑 --> 13 <property name="FILE_PATH" value="log/error_log" /> 14 <property name="FILE_NAME" value="mycollection" /> 15 </Properties> 16 17 <appenders> 18 19 <console name="Console" target="SYSTEM_OUT"> 20 <!--輸出日志的格式--> 21 <PatternLayout pattern="${LOG_PATTERN}"/> 22 <!--控制台只輸出level及其以上級別的信息(onMatch),其他的直接拒絕(onMismatch)--> 23 <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> 24 </console> 25 26 <!--文件會打印出所有信息,這個log每次運行程序會自動清空,由append屬性決定,適合臨時測試用--> 27 <File name="Filelog" fileName="${FILE_PATH}/test.log" append="false"> 28 <PatternLayout pattern="${LOG_PATTERN}"/> 29 </File> 30 31 <!-- 這個會打印出所有的info及以下級別的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面並進行壓縮,作為存檔--> 32 <RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz"> 33 <!--控制台只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)--> 34 <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> 35 <PatternLayout pattern="${LOG_PATTERN}"/> 36 <Policies> 37 <!--interval屬性用來指定多久滾動一次,默認是1 hour--> 38 <TimeBasedTriggeringPolicy interval="1"/> 39 <SizeBasedTriggeringPolicy size="10MB"/> 40 </Policies> 41 <!-- DefaultRolloverStrategy屬性如不設置,則默認為最多同一文件夾下7個文件開始覆蓋--> 42 <DefaultRolloverStrategy max="15"/> 43 </RollingFile> 44 45 <!-- 這個會打印出所有的warn及以下級別的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面並進行壓縮,作為存檔--> 46 <RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz"> 47 <!--控制台只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)--> 48 <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/> 49 <PatternLayout pattern="${LOG_PATTERN}"/> 50 <Policies> 51 <!--interval屬性用來指定多久滾動一次,默認是1 hour--> 52 <TimeBasedTriggeringPolicy interval="1"/> 53 <SizeBasedTriggeringPolicy size="10MB"/> 54 </Policies> 55 <!-- DefaultRolloverStrategy屬性如不設置,則默認為最多同一文件夾下7個文件開始覆蓋--> 56 <DefaultRolloverStrategy max="15"/> 57 </RollingFile> 58 59 <!-- 這個會打印出所有的error及以下級別的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面並進行壓縮,作為存檔--> 60 <RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz"> 61 <!--控制台只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)--> 62 <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> 63 <PatternLayout pattern="${LOG_PATTERN}"/> 64 <Policies> 65 <!--interval屬性用來指定多久滾動一次,默認是1 hour--> 66 <TimeBasedTriggeringPolicy interval="1"/> 67 <SizeBasedTriggeringPolicy size="10MB"/> 68 </Policies> 69 <!-- DefaultRolloverStrategy屬性如不設置,則默認為最多同一文件夾下7個文件開始覆蓋--> 70 <DefaultRolloverStrategy max="15"/> 71 </RollingFile> 72 73 </appenders> 74 75 <!--Logger節點用來單獨指定日志的形式,比如要為指定包下的class指定不同的日志級別等。--> 76 <!--然后定義loggers,只有定義了logger並引入的appender,appender才會生效--> 77 <loggers> 78 79 <!--過濾掉spring和mybatis的一些無用的DEBUG信息--> 80 <logger name="org.mybatis" level="info" additivity="false"> 81 <AppenderRef ref="Console"/> 82 </logger> 83 <!--監控系統信息--> 84 <!--若是additivity設為false,則 子Logger 只會在自己的appender里輸出,而不會在 父Logger 的appender里輸出。--> 85 <Logger name="org.springframework" level="info" additivity="false"> 86 <AppenderRef ref="Console"/> 87 </Logger> 88 89 <root level="info"> 90 <appender-ref ref="Console"/> 91 <appender-ref ref="Filelog"/> 92 <appender-ref ref="RollingFileInfo"/> 93 <appender-ref ref="RollingFileWarn"/> 94 <appender-ref ref="RollingFileError"/> 95 </root> 96 </loggers> 97 98 </configuration>
3.4. 測試類
1 import org.junit.Test; 2 import org.slf4j.Logger; 3 import org.slf4j.LoggerFactory; 4 5 /** 6 * StackTest 7 * 8 * @author limingcheng 9 * @Date 2019/12/9 10 */ 11 public class StackTest { 12 private static final Logger logger = LoggerFactory.getLogger(StackTest.class); 13 /** 14 * 測試數組棧 15 */ 16 @Test 17 public static void ArrayStackTest(){ 18 ArrayStack arr = new ArrayStack(5); 19 arr.push("aa"); 20 arr.push("bb"); 21 arr.push("cc"); 22 arr.push("dd"); 23 arr.push("ee"); 24 System.out.println("結果:"+arr.pop()); 25 26 logger.debug("結果:"+arr.pop()); 27 logger.trace("結果:"+arr.pop()); 28 logger.error("結果:"+arr.pop()); 29 logger.warn("結果:"+arr.pop()); 30 31 } 32 33 34 public static void main(String[] args) { 35 ArrayStackTest(); 36 } 37 }
3.5. ssm框架配置
在ssm框架項目里面需要在web.xml里面再配置一下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns="http://java.sun.com/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 5 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 6 version="3.0"> 7 <welcome-file-list> 8 <welcome-file>/login.jsp</welcome-file> 9 </welcome-file-list> 10 <context-param> 11 <param-name>contextConfigLocation</param-name> 12 <param-value>classpath:spring/spring.xml</param-value> 13 </context-param> 14 <listener> 15 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 16 </listener> 17 <listener> 18 <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> 19 </listener> 20 <listener> 21 <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class> 22 </listener> 23 <servlet> 24 <servlet-name>spring-mvc</servlet-name> 25 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 26 <init-param> 27 <param-name>contextConfigLocation</param-name> 28 <param-value>classpath:spring/spring-mvc.xml</param-value> 29 </init-param> 30 </servlet> 31 <servlet-mapping> 32 <servlet-name>spring-mvc</servlet-name> 33 <url-pattern>/</url-pattern> 34 </servlet-mapping> 35 </web-app>