日志架構
1. 概述
一套能實作日志輸出的工具包 ;
System.out ?
1). 代碼侵入性高, 一旦編寫的輸出語句 , 該語句會一直輸出 , 直到被删除/注釋 ;
2). 輸出的資訊不詳細 , 傳遞什麼内容, 就輸出什麼内容 ;
3). 功能單一 , 隻能是往控制台輸出 ;
2. 主流日志架構
日志架構具有的能力 :
1). 定制輸出目标
2). 運作時選擇性輸出
3). 定制輸出格式
4). 靈活的配置
5). 攜帶上下文資訊
日志門面 | 日志實作 |
---|---|
JCL(apache commons-logging) | Log4j |
jboss-logging | Log4j2 |
SLF4J | Logback |
JUL(java.util.logging) |
日志門面 :
slf4j是對所有日志架構制定的一種規範、标準、接口,并不是一個架構的具體的實作,因為接口并不能獨立使用,需要和具體的日志架構實作配合使用(如 log4j、logback);
日志實作 :
1). log4j是apache實作的一個開源日志元件 ;
2). logback同樣是由log4j的作者設計完成的,擁有更好的特性,用來取代log4j的一個日志架構,是slf4j的原生實作 ;
3). Log4j2是log4j 1.x和logback的改進版,據說采用了一些新技術(無鎖異步、等等),使得日志的吞吐量、性能比log4j 1.x提高10倍,并解決了一些死鎖的bug,而且配置更加簡單靈活 ;
為什麼需要日志接口,直接使用具體的實作不就行了嗎?
接口用于定制規範,可以有多個實作,使用時是面向接口的,即直接和接口互動,不直接使用實作,是以可以任意的更換實作而不用更改代碼中的日志相關代碼。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2csATTq1EerhkWop0MapWMywEMW1mY1RzRapnTtxkb5ckYplTeMZTTINGMShUYfRHelRHLwEzX39GZhh2css2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3Pn5GcuUTMyMzNyQTM3ITMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
3. 配置使用
3.1 slf4j - log4j
3.1.1 pom. xml
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.6</version>
</dependency>
3.1.2 log4j.properties
log4j.rootLogger=info,A2
log4j.appender.A2=org.apache.log4j.ConsoleAppender
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
#for file
log4j.appender.files.layout=org.apache.log4j.PatternLayout
log4j.appender.files.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.files=org.apache.log4j.RollingFileAppender
log4j.appender.files.File=D:/example.log
log4j.appender.files.MaxFileSize=100KB
#for file every day
log4j.appender.everyday=org.apache.log4j.DailyRollingFileAppender
log4j.appender.everyday.layout=org.apache.log4j.PatternLayout
log4j.appender.everyday.File=myloggers.log
log4j.appender.everyday.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.everyday.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.everyday.MaxFileSize=1KB
#for database
#log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
#log4j.appender.DATABASE.BufferSize=10
#log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
#log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
#log4j.appender.DATABASE.user=root
#log4j.appender.DATABASE.password=2143
#log4j.appender.DATABASE.sql=INSERT INTO tbl_log VALUES ('%m')
#log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
#set log type for package
#log4j.category.cn.zsj.crm=error
#log4j.category.cn.zsj.wf=debug
3.1.3 代碼
private static Logger logger = LoggerFactory.getLogger(MainTest.class);
public static void main(String[] args) {
logger.trace("trace....");
logger.debug("debug....");
logger.info("info....");
logger.warn("warn....");
logger.error("error....");
}
3.1.4 日志級别
SLF4J 支援的日志級别 :
trace
debug
info
warn
error
日志級别, 從上到下, 越來越高 ; 控制台輸出的日志為, 設定的級别及以上級别的日志 ;
3.2 slf4j-logback
依賴
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.22</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.6</version>
</dependency>
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--根标簽-->
<!-- scan: 當此屬性設定為true時,配置檔案如果發生改變,将會被重新加載,預設值為true。 -->
<!-- scanPeriod: 設定監測配置檔案是否有修改的時間間隔,如果沒有給出時間機關,預設機關是毫秒。當scan為true時,此屬性生效。預設的時間間隔為1分鐘。 -->
<!-- debug: 當此屬性設定為true時,将列印出logback内部日志資訊,實時檢視logback運作狀态。預設值為false。 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<property scope="context" name="LOG_HOME" value="/home/kmc/kmclog" />
<!-- 控制台 appender -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<!-- file日志 file-->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天復原 daily -->
<fileNamePattern>${LOG_HOME}/kmc-log-server/kmc-log-server-%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的曆史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 隻列印錯誤日志 -->
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--日志列印的包的範圍,及分類日志檔案存儲 -->
<!-- <logger name="com.sxhyzn.kmccsp" additivity="false">-->
<!-- <level value="DEBUG" />-->
<!-- <appender-ref ref="INFO" />-->
<!-- </logger>-->
<!--控制台列印及日志檔案輸出資源加載資訊-->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="file" />
</root>
</configuration>