二、異常日志

二、異常日志
(一)、錯誤碼

  • 錯誤碼的制定原則:快速溯源、溝通標準化
  • 錯誤碼不體現版本號和錯誤等級信息
  • 全部正常,但不得不填充錯誤碼時返回五個零:00000
  • 錯誤碼為字符串類型,共 5 位,分成兩個部分:錯誤產生來源+四位數字編號
  • 編號不與公司業務架構,更不與組織架構掛鉤,以先到先得的原則在統一平臺上進行,審批生效,編號即被永久固定
  • 錯誤碼使用者避免隨意定義新的錯誤碼
  • 錯誤碼不能直接輸出給用戶作為提示信息使用
  • 錯誤碼之外的業務信息由 error_message 來承載,而不是讓錯誤碼本身涵蓋過多具體業務屬性
  • 在獲取第三方服務錯誤碼時,向上拋出允許本系統轉義,由 C 轉為 B,并且在錯誤信息上帶上原有的第三方錯誤碼
  • 錯誤碼分為一級宏觀錯誤碼、二級宏觀錯誤碼、三級宏觀錯誤碼
  • 錯誤碼的后三位編號與 HTTP 狀態碼沒有任何關系
  • 錯誤碼有利于不同文化背景的開發者進行交流與代碼協作
  • 錯誤碼即人性,感性認知+口口相傳,使用純數字來進行錯誤碼編排不利于感性記憶和分類
    (二)、異常處理
  • Java 類庫中定義的可以通過預檢查方式規避的 RuntimeException 異常不應該通過 catch 的方式來處理,比如:NullPointerException,IndexOutOfBoundsException 等等
  • 異常捕獲后不要用來做流程控制,條件控制
  • catch 時請分清穩定代碼和非穩定代碼,穩定代碼指的是無論如何不會出錯的代碼。對于非穩定代碼的 catch 盡可能進行區分異常類型,再做對應的異常處理
  • 捕獲異常是為了處理它,不要捕獲了卻什么都不處理而拋棄之,如果不想處理它,請將該異常拋給它的調用者。最外層的業務使用者,必須處理異常,將其轉化為用戶可以理解的內容
  • 事務場景中,拋出異常被 catch 后,如果需要回滾,一定要注意手動回滾事務
  • finally 塊必須對資源對象、流對象進行關閉,有異常也要做 try-catch
  • 不要在 finally 塊中使用 return
  • 捕獲異常與拋異常,必須是完全匹配,或者捕獲異常是拋異常的父類
  • 在調用 RPC、二方包、或動態生成類的相關方法時,捕捉異常使用 Throwable 類進行攔截
  • 方法的返回值可以為 null,不強制返回空集合,或者空對象等,必須添加注釋充分說明什么情況下會返回 null 值
  • 注意 NPE 產生的場景:
    • 返回類型為基本數據類型,return 包裝數據類型的對象時,自動拆箱有可能產生 NPE
    • 數據庫的查詢結果可能為 null
    • 集合里的元素即使 isNotEmpty,取出的數據元素也可能為 null
    • 遠程調用返回對象時,一律要求進行空指針判斷,防止 NPE
    • 對于 Session 中獲取的數據,建議進行 NPE 檢查,避免空指針
    • 級聯調用 obj.getA().getB().getC();一連串調用,易產生 NPE
  • 定義時區分 unchecked / checked 異常,避免直接拋出 new RuntimeException(),更不允許拋出 Exception 或者 Throwable,應使用有業務含義的自定義異常。推薦業界已定義過的自定義異常,如:DAOException / ServiceException 等
  • 對于公司外的 http / api 開放接口必須使用錯誤碼,而應用內部推薦異常拋出;跨應用間RPC 調用優先考慮使用 Result 方式,封裝 isSuccess() 方法、錯誤碼、錯誤簡短信息;應用內部推薦異常拋出
    (三)、日志規約
  • 應用中不可直接使用日志系統(Log4j、Logback)中的 API,而應依賴使用日志框架(SLF4J、JCL—Jakarta Commons Logging)中的 API,使用門面模式的日志框架,有利于維護和各個類的日志處理方式統一
  • 日志文件至少保存 15 天,因為有些異常具備以“周”為頻次發生的特點。對于當天日志,以“應用名.log”來保存,保存在/{統一目錄}/{應用名}/logs/目錄下,過往日志格式為:{logname}.log.{保存日期},日期格式:yyyy-MM-dd
  • 根據國家法律,網絡運行狀態、網絡安全事件、個人敏感信息操作等相關記錄,留存的日志不少于六個月,并且進行網絡多機備份
  • 應用中的擴展日志(如打點、臨時監控、訪問日志等)命名方式:appName_logType_logName.log。logType:日志類型,如 stats / monitor / access 等;logName:日志描述。這種命名的好處:通過文件名就可知道日志文件屬于什么應用,什么類型,什么目的,也有利于歸類查找
  • 在日志輸出時,字符串變量之間的拼接使用占位符的方式
  • 對于 trace / debug / info 級別的日志輸出,必須進行日志級別的開關判斷
  • 避免重復打印日志,浪費磁盤空間,務必在日志配置文件中設置 additivity=false
  • 生產環境禁止使用 System.out 或 System.err 輸出或使用 e.printStackTrace() 打印異常堆棧
  • 異常信息應該包括兩類信息:案發現場信息和異常堆棧信息。如果不處理,那么通過關鍵字throws 往上拋出
  • 日志打印時禁止直接用 JSON 工具將對象轉換成 String
  • 謹慎地記錄日志。生產環境禁止輸出 debug 日志;有選擇地輸出 info 日志;如果使用 warn來記錄剛上線時的業務行為信息,一定要注意日志輸出量的問題,避免把服務器磁盤撐爆,并記得及時刪除這些觀察日志
  • 可以使用 warn 日志級別來記錄用戶輸入參數錯誤的情況,避免用戶投訴時,無所適從。如非必要,請不要在此場景打出 error 級別,避免頻繁報警
  • 盡量用英文來描述日志錯誤信息,如果日志中的錯誤信息用英文描述不清楚的話使用中文描述即可,否則容易產生歧義
  • 為了保護用戶隱私,日志文件中的用戶敏感信息需要進行脫敏處理

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36875.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36875.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36875.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

win10 anaconda pytorch avalanche-lib 實驗步驟記錄

conda create --name test_python3.10 conda activate test_python3.10 配置conda國內源(北外) conda install pytorch torchvision torchaudio cpuonly -c pytorch pip3 install avalanche-lib -i https://pypi.tuna.tsinghua.edu.cn/simple conda install jupyter jupyte…

[tidb] tiup升級tidb的版本到 v7.1.1

備份 為了避免數據丟失,升級前需要備份當前tidb集群的數據,參考 TiDB 備份與恢復概述 | PingCAP 文檔中心 說明 由于新版本的tidb的tiflash需要cpui支持avx2,所有升級前先驗證當前升級的服務器是否支持avx2。升級的文檔可以參考 使用 TiUP…

Android布局【TableLayout】

文章目錄 說明常見屬性子控件設置屬性 項目結構主要代碼 說明 TableLayout也稱為表格布局 常見屬性 android:collapseColumns:設置需要被隱藏的列的序列號,從0開始android:stretchColumns:設置允許被拉伸的列的列序號,從0開始&…

docker私有鏡像倉庫搭建

1、下載registry鏡像 docker pull registry:2.52、生成登錄私有倉庫的用戶名以及密碼 mkdir -p /opt/registry/auth/ docker run --entrypoint htpasswd registry:2.5 -Bbn username userpwd >> /opt/registry/auth/htpasswd3、創建配置文件 mkdir -p /opt/registry/…

Git - 配置代理 和 取消代理配置

一. 配置代理 (使git走網路代理) git config --global http.proxy socks5://127.0.0.1:1080 git config --global https.proxy socks5://127.0.0.1:1080 其中 1080 是 SOCKS 代理的端口,一般默認 1080,可以在代理工具的設置中查看 地址記錄&#xff1a…

Python中使用隧道爬蟲ip提升數據爬取效率

作為專業爬蟲程序員,我們經常面臨需要爬取大量數據的任務。然而,有些網站可能會對頻繁的請求進行限制,這就需要我們使用隧道爬蟲ip來繞過這些限制,提高數據爬取效率。本文將分享如何在Python中使用隧道爬蟲ip實現API請求與響應的技…

(十八)大數據實戰——Hive的metastore元數據服務安裝

前言 Hive的metastore服務作用是為Hive CLI或者Hiveserver2提供元數據訪問接口。Hive的metastore 是Hive元數據的存儲和管理組件,它負責管理 Hive 表、分區、列等元數據信息。元數據是描述數據的數據,它包含了關于表結構、存儲位置、數據類型等信息。本…

Android Jetpack Compose 中的分頁與緩存展示

Android Jetpack Compose 中的分頁與緩存展示 在幾乎任何類型的移動項目中,移動開發人員在某個時候都會處理分頁數據。如果數據列表太大,無法一次從服務器檢索完畢,這就是必需的。因此,我們的后端同事為我們提供了一個端點&#…

ArcGIS Pro應用—暨基礎入門、制圖、空間分析、影像分析、三維建模、空間統計分析與建模、python融合、案例應用全流程科研能力提升教程

詳情點擊鏈接:ArcGIS Pro應用—暨基礎入門、制圖、空間分析、影像分析、三維建模、空間統計分析與建模、python融合、案例應用全流程科研能力提升教程 第一:GIS及ArcGIS Pro 1.GIS基本原理及常用軟件 2.ArcGIS Pro 安裝與配置 3.ArcGIS Pro 3.0 的新…

C語言自動抓取淘寶商品詳情網頁數據,實現輕松高效爬蟲

你是否曾經遇到過需要大量獲取網頁上的數據,但手動復制粘貼又太過費時費力?那么這篇文章就是為你而寫。今天我們將會詳細討論如何使用C語言實現自動抓取網頁上的數據。本文將會從以下8個方面進行逐步分析討論。 1. HTTP協議的基本原理 在開始之前&…

小白到運維工程師自學之路 第七十三集 (kubernetes應用部署)

一、安裝部署 1、以Deployment YAML方式創建Nginx服務 這個yaml文件在網上可以下載 cat nginx-deployment.yaml apiVersion: apps/v1 #apiVersion是當前配置格式的版本 kind: Deployment #kind是要創建的資源類型,這里是Deploymnet metadata: #metadata是該資源…

Photoshop多圖片與多窗口下排列操作方法

首先,在Photoshop中打開6張圖片,在“窗口”菜單下切換窗口排列狀態: 在 “窗口”菜單下對窗口進行排列,分別呈現如下: (一). 點擊“窗口” -> “排列”->"全部垂直拼貼": &am…

本地oracle登錄賬號鎖定處理,the account is locked

1.打開cmd命令窗口 2.打開sqlplus: sqlplus /nolog(加/nolog是不登錄服務器的意思,不加就需要輸賬號密碼) 3.切換到管理員:conn / as sysdba; 第2步第3步可以合并,直接使用sysdba登錄:sqlplus / as sysdba; 4.解鎖賬號&#x…

大端和小端

大端和小端 大端(Big Endian)和小端(Little Endian)是兩種不同的字節序排列方式,用于解釋多字節數據在內存中的存儲順序。 在大端字節序中,高位字節(最高有效位)存儲在低位地址&am…

1. 兩數之和

題目: 給定一個整數數組 nums 和一個整數目標值 target,請你在該數組中找出 和為目標值 target 的那 兩個 整數,并返回它們的數組下標。 你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素在答案里不能重復出現。 你…

如何從cpu改為gpu,pytorch,cuda

1.cmd輸入nvcc -V 2.得到 cuda版本后,去pytorch官網 3.根據自己的cuda進行選擇 4.復制上述鏈接,進入cmd 5.cmd中輸入activate XXX,這里的"XXX"指代自己在工程中用到的環境 6.進入后,將剛才鏈接粘貼,回車等待下載結束 …

qt實現截取屏幕

利用qt提供的函數實現截屏: QPixmap QPixmap::grabWindow(WID window, int x 0, int y 0, int width -1, int height -1) window: 表示窗口ID號 x、y: 截取屏幕的其實坐標 width:截取屏幕的寬度 -1表示當前窗口寬度 height:截取屏幕的高度 -1表示當前窗口高度 示例…

《高性能MySQL》——查詢性能優化(筆記)

文章目錄 六、查詢性能優化6.1 查詢為什么會慢6.2 慢查詢基礎:優化數據訪問6.2.1 是否向數據庫請求了不需要的數據查詢不需要的記錄多表關聯時返回全部列總是取出全部列重復查詢相同的數據 6.2.2 MySQL 是否在掃描額外的記錄響應時間掃描的行數與返回的行數掃描的行…

新增守護進程管理、支持添加MySQL遠程數據庫,支持PHP版本切換,1Panel開源面板v1.5.0發布

2023年8月14日,現代化、開源的Linux服務器運維管理面板1Panel正式發布v1.5.0版本。 在這個版本中,1Panel新增了守護進程管理功能;支持添加MySQL遠程數據庫;支持添加FTP/S和WebDAV的SFTP服務;支持PHP版本切換。此外&am…

jupyter打開ipynb后,還沒有運行cell,反復報錯

今天遇到了一個比較奇怪的問題: 這個原因是當前目錄下有一個code.py的文件,一旦打開ipynb,就是先執行code.py,而且遇到報錯,還會反復執行,導致內核崩潰。