今天中午就不休息了,把剩餘的草稿寫完~java
Java自帶的日誌處理api位於java.util.logging
包下,該包下只有少數的一些類,以下圖:api
其實結構很是地簡單,主要由如下三個組件組成:bash
Logger
組件:logger組件定義了一些日誌的基本操做,如log
輸出日誌,getName
獲取該日誌對象的名稱,setLevel()
設置日誌級別等等,就是一些基本的操做啦!Handler
組件:Handler
就是定義一些日誌處理嘛!好比你想將日誌輸出到文件,可以使用FileHandler
,想將日誌輸出到控制檯,可以使用ConsoleHandler
等Formatter
組件:很顯然就是對日誌輸出的格式進行定義嘛!Level
組件:日誌的級別,最基本的級別INFO
、WARNING
filter
組件:過濾器,容許你對輸出日誌的一個過濾對於Java api
的日誌體系,下面我寫了一個小栗子進行總結:app
package com.wokao66.logger;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.logging.FileHandler;
import java.util.logging.Filter;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
public class JavaLogger {
static Logger logger = Logger.getLogger(JavaLogger.class.getName());
public static void HandlerFilter() throws SecurityException, IOException {
//首先我聲明一個文件處理器,由於我打算將日誌輸出到一個文件當中,即保存在E盤的a.txt文件
FileHandler handler = new FileHandler("E://a.txt");
//我自定義一個Formatter,用於對每條輸出日誌進行格式化,你也能夠不指定,則默認使用SimpleFormatter
handler.setFormatter(new Formatter() {
@Override
public String format(LogRecord record) {
//這就是我自定義的格式
return "[" + new SimpleDateFormat().format(record.getMillis()) + "]-[" + record.getLevel()
+ "]-" + record.getSourceClassName() + "-" + "[" + record.getMessage() + "]\n";
}
});
//固然,我也能夠設置一個過濾器
handler.setFilter(new Filter() {
@Override
public boolean isLoggable(LogRecord record) {
//當日志內容與"this is a unloged message!"相同時,則不輸出該日誌,固然這裏只是測試,實際項目這個規則是不存在的
return !record.getMessage().equals("this is a unloged message!");
}
});
//給Logger設置Handler
logger.addHandler(handler);
//默認是ConsoleHandler,禁用以後纔不會輸出到控制檯,而是輸出到文件中
logger.setUseParentHandlers(false);
}
public static void main(String[] args) throws SecurityException, IOException {
HandlerFilter();
logger.log(Level.INFO, "this is a info message!");
logger.log(Level.OFF, "this is a OFF message!");
logger.log(Level.SEVERE, "this is a SEVERE message!");
logger.log(Level.WARNING, "this is a WARNING message!");
logger.log(Level.INFO, "this is a unloged message!");//這一句將不會被記錄到文件中
}
}
複製代碼
logback
這個傢伙在企業中的使用很頻繁。我先講下logback的一些經常使用的組件和配置,而後再來個栗子做爲演示。koa
logback
由三大基本模塊組成,分別是logback-core
,logback-access
,logback-classic
.其中core
是核心模塊,是其餘兩模塊的基礎。ide
logback
由三大組件組成,分別是Logger
,Appender
,Layout
.其中logger
屬於classic
模塊,appender,layout
屬於core
模塊,core
模塊沒有logger
的概念!Appender
其實就是表示一個日誌輸出的目的地,能夠是控制檯,也能夠是文件。學習
logback
擁有本身的命名規範,通常logger
是按照層次命名的,具備繼承關係,以.
來做爲分割,擁有祖先和父節點的概念,好比一個logger
被命名爲com.wokao666.www
,那麼com
就是wokao666
的父節點,com
是www
的祖先節點。測試
root
屬於全部logger
的根節點,以org.slf4j.Logger.ROOT_LOGGER_NAME
做爲root
的名字。ui
logback
會默認在類路徑下查找名爲logback-test.xml
、logback.groovy
或者是logback.xml
的配置文件。this
日誌的打印是向上傳遞的,什麼意思呢?好比你打印了一個info級別的日誌(輸出到控制檯),同時也打印了一個error的日誌,那麼控制檯會同時輸出info和error兩條日誌,由於error的級別比info高。
很簡單吧!因此說你要使用logback
,主要有如下三大步驟:
logback.xml
,並作好相關配置。LoggerFactory.getLogger()
方法並傳遞一個名稱或類進去得到一個Logger
對象Logger
對象,調用相應的日誌級別方法,如info()
,error()
好了,我很少說了,基本的就這些,下面我經過問題和栗子來演示一波:
先看看個人配置文件logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 表示啓動配置文件掃描,每隔30秒掃描一次,什麼意思?就是說它會去檢查你的配置文件在運行過程當中配置是否有變化 -->
<configuration scan="true" scanPeriod="30 seconds">
<!-- 配置一個存放日誌文件的地方,注意這裏是一個變量來着,之後能夠經過${變量名}來獲取變量的值 -->
<property name="log.base" value="/logs" />
<!-- 這裏又定義一個變量 -->
<property name="log.controller" value="${log.base}/controller" />
<!-- 輸出到控制檯 -->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 聲明瞭一個存放info消息的appender -->
<!-- 啓動日誌回滾appender,就是說有一些規則,好比說規定一個文件大小達到10M以後輸出到一個新的文件中去 -->
<appender name="controller-info"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${log.controller}/current-info.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.controller}/controller_info_%d{yyyyMMdd_HH}.%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>%msg%n</pattern>
</encoder>
</appender>
<!-- 聲明瞭一個存放error消息的appender -->
<appender name="controller-error"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${log.controller}/current-error.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.controller}/controller_error_%d{yyyyMMdd_HH}.%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>%msg%n</pattern>
</encoder>
</appender>
<!-- 這裏我定義一個logger,該logger會跟蹤club.wokao666包下的日誌打印語句,可是它不會對日誌進行輸出,由於你沒有關聯任何的appender,雖然沒有關聯,可是默認會繼承自父logger的相應配置,即club包下的配置,因爲咱們也沒有對club進行相應的配置,因此它默認會繼承自下面的 root logger -->
<logger name="club.wokoa666" level="info"></logger>
<logger name="club.wokao666.controller" additivity="false" level="WARN">
<appender-ref ref="controller-error" /><!-- 關聯咱們的Appender,表示日誌輸出的地址 -->
</logger>
<!-- 這就是咱們的根logger -->
<root level="info">
<appender-ref ref="controller-info" />
</root>
</configuration>
複製代碼
日誌分類實例,添加相應的過濾器
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<property name="log.base" value="/logs" />
<property name="log.controller" value="${log.base}/controller" />
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<appender name="controller-info"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${log.controller}/current-info.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.controller}/controller_info_%d{yyyyMMdd_HH}.%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>%msg%n</pattern>
</encoder>
<!-- 過濾器配置 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="controller-debug"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${log.controller}/current-debug.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.controller}/controller_debug_%d{yyyyMMdd_HH}.%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>%msg%n</pattern>
</encoder>
<!-- 過濾器配置 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="controller-error"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${log.controller}/current-error.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.controller}/controller_error_%d{yyyyMMdd_HH}.%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>%msg%n</pattern>
</encoder>
<!-- 過濾器配置 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<root level="trace">
<appender-ref ref="controller-error" />
<appender-ref ref="controller-info" />
<appender-ref ref="controller-debug" />
</root>
</configuration>
複製代碼
最後,更多高級內容能夠查閱官網文檔進行學習,我有一點感想,就是說若是我大學四年的空閒時間都花在學習英文技術文檔的話,可能,或許如今的我會不那麼同樣,一首《咱們不同》送給你們,謝謝閱讀!