開發項目中,調試是必不可少的。html
本篇博客的代碼舉例均爲該系列博客涉及的項目:社交網站後端項目開發日記(一)前端
本篇博客從如下4個方面介紹項目調試技巧:java
- 響應狀態碼的含義
- 服務端斷點調試技巧
- 客戶端斷點調試技巧
- 設置日誌級別,並將日誌輸出到不一樣的終端
以及,最後簡單的介紹了一下git的使用。linux
項目調試過程當中,web項目首先看HTTP狀態響應碼,找是客戶端仍是服務端的錯誤,看看日誌信息有沒有錯誤信息,若是沒有找到,進行斷點調試,這是一個大概的流程。git
接下來介紹幾個最多見的響應狀態碼,參考網址:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Statusgithub
HTTP 響應狀態代碼指示特定 HTTP 請求是否已成功完成。響應分爲五類:信息響應(100
–199
),成功響應(200
–299
),重定向(300
–399
),客戶端錯誤(400
–499
)和服務器錯誤 (500
–599
)。狀態代碼由 section 10 of RFC 2616定義web
打開任意一個網址,都會有以下信息:spring
200 OK
(成功響應)windows
請求成功。成功的含義取決於HTTP方法:後端
302 Found
(重定向)
請求的資源如今臨時從不一樣的 URI 響應請求。因爲這樣的重定向是臨時的,客戶端應當繼續向原有地址發送之後的請求。只有在Cache-Control或Expires中進行了指定的狀況下,這個響應纔是可緩存的。
介紹一下重定向:假如說網頁上進行刪除功能,這個時候刪除完畢,是不須要返回一個html的,可是生活中常見的會發生什麼?通常刪除以後,網頁會回到一個地址,好比說首頁或者說回到查詢頁面。這個就是從新進行定位。另一個例子:咱們註冊以後,通常直接會跳轉到登陸頁面。
服務器進行刪除功能以後,返回302狀態碼,以及一個新的路徑。至於爲何刪除以後沒有直接進行查詢功能呢?項目中不一樣功能之間要保持鬆耦合,不能造成依賴。
404 Not Found
(客戶端響應)
請求失敗,請求所但願獲得的資源未被在服務器上發現。沒有信息可以告訴用戶這個情況究竟是暫時的仍是永久的。假如服務器知道狀況的話,應當使用410狀態碼來告知舊資源由於某些內部的配置機制問題,已經永久的不可用,並且沒有任何能夠跳轉的地址。404這個狀態碼被普遍應用於當服務器不想揭示到底爲什麼請求被拒絕或者沒有其餘適合的響應可用的狀況下。
500 Internal Server Error
(服務端響應)
服務器遇到了不知道如何處理的狀況。這時候應該去檢查服務端的程序。
以本人博客的後端項目開發代碼爲例,介紹IDEA的調試技巧。
設置斷點,進入debug模式
訪問URL,瀏覽器會一直處理,由於服務端程序停留在斷點那一步
調試界面以下(step over只直接跳轉到程序的下一行,不進入方法,step into則是進入方法進行跳轉下一行):
若是想跳過循環條件,畢竟循環可能會循環不少次。能夠進行Resume Program恢復程序,好比,你在第20行和25行有兩個斷點,當前運行至第20行,按F9,則運行到下一個斷點(即第25行),再按F9,則運行完整個流程,由於後面已經沒有斷點了。
其中,debug部分,View Breakpoints能夠進行斷點管理,能夠看到全部斷點,進行是否使用的設置。
瀏覽器F12進入開發者模式,其中
Elements調試的是頁面,前端部分會用到。Console能夠看到JS輸出的結果。Source能夠看客戶端執行的代碼。
其實這裏設置斷點和IDEA相同,點擊代碼行左側設置斷點,當使用該部分功能時,會呈現以下效果:
在Source右側,和IDEA相同,仍是有step over和step into等操做。邏輯都是相同的。
SpringBoot的日誌工具是logback,官網爲:http://logback.qos.ch/
logger中不一樣的日誌級別:
這五個級別從低到高順序排列。例:開啓Info級別,則trace和debug不會打印出來,只有更高級別的日誌會打印出來。級別設置是爲了提升性能。
接下來舉個例子:(SpringBoot中在application.properties設置Logger級別便可)
logging.level.com.nowcoder.community=debug
舉測試類:
public class LoggerTests { //爲了便於全部的方法去調用,通常設置爲靜態,不可改變的,注意使用org.slf4j包下的 //傳入的類即logger的名字,通常傳入當前類,這樣便於區別不一樣的Logger private static final Logger logger = LoggerFactory.getLogger(LoggerTests.class); @Test public void testLogger() { System.out.println(logger.getName()); logger.debug("debug log"); logger.info("info log"); logger.warn("warn log"); logger.error("error log"); } }
這是在logger爲debug級別下進行的測試:
更高級別的log都有顯示。
級別改成warn後:
通常來講,項目開發過程當中採用debug級日誌,方便調試。上線後通常採用更高級別。而且上線後都不會有控制檯了,這就須要咱們把日誌文件給打印出來。
過程:在properties進行配置
logging.file.path=sp.log
該配置會在同級目錄下生成sp.log文件夾,裏面存儲spring.log
(不知爲什麼,logging.file這句配置在我這裏失效了,暫未找到緣由,SpringBoot2.5.1)
這種方式會混雜各類類型的日誌,並且可能文件比較大,建議將各類級別的日誌放在不一樣的文件中,介紹第二種配置方式。
在resources目錄下,SpringBoot會自動識別該命名的.xml文件並進行配置,注意若是命名不一樣則不會識別。
以error級別log文件配置爲例:(已加註釋,請閱讀源碼)
<contextName>community</contextName> <!-- log文件存放地址,這裏至關於一個string --> <property name="LOG_PATH" value="D:/javawork/data"/> <property name="APPDIR" value="community"/> <!-- error file --> <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 聲明地址 --> <file>${LOG_PATH}/${APPDIR}/log_error.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 命名格式,%d爲日期, %i是一個變量,如0,1,2等 --> <fileNamePattern>${LOG_PATH}/${APPDIR}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!-- 一個Log最大爲5MB,若是存不下再存新的 --> <maxFileSize>5MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!-- 最長存儲時間30天 --> <maxHistory>30</maxHistory> </rollingPolicy> <!-- 以追加的方式存儲而不是覆蓋 --> <append>true</append> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!-- 定義日誌輸出格式%d日期,%level級別, [%thread]哪一個線程執行,%logger{10}logger所處的類,[%file:%line] 所處哪一個文件多少行 --> <!-- %msg%n消息內容 --> <pattern>%d %level [%thread] %logger{10} [%file:%line] %msg%n</pattern> <charset>utf-8</charset> </encoder> <!-- 過濾器,過濾error級日誌 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>error</level> <!-- 這裏的意思是匹配到就接收,不匹配就拒絕 --> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender>
其餘級別的Log文件配置相似,可自行配置。
其中,也能夠配置如何打印控制檯Log信息,例:
<!-- console --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d %level [%thread] %logger{10} [%file:%line] %msg%n</pattern> <charset>utf-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>debug</level> </filter> </appender>
在.xml文件末尾須要聲明:
<logger name="com.nowcoder.community" level="debug"/> <root level="info"> <appender-ref ref="FILE_ERROR"/> <appender-ref ref="FILE_WARN"/> <appender-ref ref="FILE_INFO"/> <appender-ref ref="STDOUT"/> </root>
root表明項目根目錄,由於項目中包含着很是多的包,因此級別爲info便可,debug級將會多出許多沒必要要的log。其中,logger會將日誌信息傳給root,root再根據appender進行打印。具體信息可參考官方網站,沒有細說。
中間4行表明啓用上述的error等各個級別的文件配置。
項目中的日誌配置參考該模板便可。
分佈式版本控制系統,在這類系統中,像 Git、Mercurial、Bazaar 以及 Darcs 等,客戶端並不僅提取最新版本的文件快照, 而是把代碼倉庫完整地鏡像下來,包括完整的歷史記錄。 這麼一來,任何一處協同工做用的服務器發生故障,過後均可以用任何一個鏡像出來的本地倉庫恢復。 由於每一次的克隆操做,實際上都是一次對代碼倉庫的完整備份。
這部分介紹git相關。便於備份代碼,或者在開發流程中共享代碼。是團隊開發中很是重要的工具。
首先介紹相關命令(windows命令):我的建議使用git.bash,使用linux命令,畢竟linux在未來的開發中還會有應用。
參考網址:Git官網
若是想詳細瞭解git知識,建議閱讀(中文版):https://git-scm.com/book/zh/v2
具體原理及應用可見:B站尚硅谷教學視頻
我我的的操做通常是:
git add . //添加全部文件 git commit -m "須要提交的信息" //提交到本地倉庫 git push -u origin main //將本地倉庫push到遠程的main分支,也能夠push到master分支
由於我我的使用了兩個github,因此一個採用ssh密鑰,上述方式介紹的是http協議上傳方式,使用帳號密碼便可。
除此以外的方式還有利用fetch和push等等,我介紹的方式比較適用於初學者。
IDEA配置git:
改成本身的git路徑。
IDEA的VCS中有git的各個操做,首先如圖Create Git Repository,
而後Git中有commit,選中要提交的文件,不用選中所有,好比maven那些包其實不必提交。
commit以後,Git中有push,填上遠程倉庫的url以及登陸倉庫便可。