成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

警惕程序日志對性能的影響

運維 系統運維
做后臺系統比做客戶端軟件的辛苦的地方,就是不能讓程序輕易地掛掉。因為在生產環境中無法容易地復現或調試 bug,很多時候需要程序日志提供足夠的信息,所以一個后臺系統的程序員必須要明白該如何打日志(logging)。

做后臺系統比做客戶端軟件的辛苦的地方,就是不能讓程序輕易地掛掉。因為在生產環境中無法容易地復現或調試 bug,很多時候需要程序日志提供足夠的信息,所以一個后臺系統的程序員必須要明白該如何打日志(logging)。

 
    很多語言都有自己現成的 logging 庫,比如 Python 標準庫中的 logging 模塊,Apache 的 log4cxx(C++), log4j(Java)。如果你愿意找,很容易能找到基本滿足自己需求的日志程序庫。當然,自己實現一個也不是很困難。難點不在于寫這些庫,而是如何去使用它們。
 
    大部分情況下,我們關注的都是日志的級別和內容。即哪些情況下,該打哪個級別的日志,日志語句中,該怎么寫。
 
    在程序開發的過程中,我們需要很多的日志協助分析程序問題;但在生產環境中,我們沒有那么多的空間存儲豐富的日志,而且日志量太大對于問題排查反而是累贅。有些人使用預處理解決這個問題,在 debug 版本和 release 版本中編譯進不同的日志語句。這樣能夠解決一些問題,但卻使得在生產環境中無法輕易地打印更多的日志。大部分人更接受的做法是,使用配置(參數)控制日志的打印級別,在需要更多日志的時候,可以隨時打開它們。為了實現日志“少但是足夠”的目標,開發人員必須明白日志信息的價值,即哪些日志應該屬于哪個級別。
 
    日志的作用是提供信息,但不同的日志語句,提供的信息量卻是不一樣的。有的日志里會寫“Failed to get sth..”,但卻忘記加上失敗調用的返回值。同程序一樣,日志語句中有的是變量(某個變量內容),有的是常量(提示信息)。常量你總能從程序源代碼中獲得,但變量不行。所以在一條日志中,信息量***的是變量,是函數返回值/字符串內容/錯誤碼,因而變量應該盡量放在靠前的位置。常量也不是一點價值沒有,寫得好的提示語句,會使問題一目了然,可以免去你到代碼中 grep,然后重讀代碼的麻煩。
 
    上面這兩點,幾乎所有知道 logging 重要性的同學都會了解。但關于 logging 對性能的影響,很多人沒有足夠的警惕心。例如有人會在一個按行解析文件的函數中寫下這樣的日志:
 
int parseline(...)
{
log_trace("Enter parseline with ...");
DO_SOMETHING;
log_trace("Exit parseline with ...");
return 0;
}
    乍一看,由于 log_trace 級別不高,在生產環境中肯定會關閉,那么這樣做看起來對性能沒太大影響。但實際上 log_trace 可能是這樣實現的:
 
#define log_trace(fmt, arg...) \\
    xx_log(LVL_TRACE, "[%s:%d][time:%uus]" fmt, __FILE__, __LINE__,\\
           log_getussecond(), ## arg)
#endif
    可以看到 log_trace 宏中自動添加了很多信息,值得注意的是時間參數 log_getussecond()。大家都知道統計時間需要系統調用,那么無論 log_getussecond() 函數是如何實現的,它的代價肯定是高于一般的簡單函數。
 
    我們本以為 log_trace 在 LVL_TRACE 級別被關閉的情況下,消耗的代價僅僅是一個函數調用和分支判斷,卻沒有發現宏參數中還隱藏著一個需要調用系統調用的函數。當文件不大是還算能夠忍受,但當這個文件是一個數據庫,掃描每一行都要執行兩次 log_trace() 時,它對系統性能的影響就絕不可忽視了。
 
    所以,***的做法還是,在性能攸關的代碼中,使用可被預處理掉的 logging 語句,僅僅在 debug 發布中才能見到這些日志,release 版本中不把它們編譯進來。
 
    此外,上面這個 log_trace,是一個糟糕的設計。logging 模塊只應該干 logging 的事情,開發人員需要時間統計時會自己完成。
責任編輯:趙寧寧
相關推薦

2022-12-15 08:00:38

JavaScript錯誤性能

2022-11-17 08:00:18

JavaScript錯誤性能

2010-05-24 13:22:37

Swap空間

2015-02-12 09:14:41

2024-07-05 15:52:34

2011-08-23 12:20:47

筆記本評測

2022-06-07 08:18:49

懶加載Web前端

2017-11-10 10:49:47

SCSI軟件層性能

2010-05-10 17:07:54

Oracle SQL條

2009-06-30 15:02:41

磁盤排序Oracle數據庫性能

2011-05-25 14:42:37

Oracle空間管理系統性能

2015-05-04 09:56:19

HTTPS

2010-05-10 09:48:16

SQL Server數

2012-05-15 02:12:20

JavaJava異常

2015-11-04 14:03:44

BYOD自帶設備企業

2013-09-29 09:49:04

編程生活方式

2011-06-01 17:45:22

SEO

2012-08-28 11:14:18

IBMdw

2024-01-22 09:41:05

MongoDB索引

2022-04-28 08:52:40

懶加載Web
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜日韩| 久久99精品久久久久婷婷 | 久久久国产一区二区三区 | 久久久69 | 欧美日韩精品免费 | 国产乱码精品一区二区三区中文 | 免费亚洲婷婷 | 中文字幕一区二区三区四区不卡 | 欧美一级免费 | 成人免费视频网 | 亚洲91精品 | 日本成人综合 | 亚洲乱码一区二区三区在线观看 | 精品综合 | 亚洲欧美日韩精品久久亚洲区 | 午夜爱爱网| 亚洲一区| 色欧美片视频在线观看 | 国产中文字幕亚洲 | 成人免费三级电影 | 91精品久久久久 | 国产激情在线播放 | 午夜精品久久久久久久久久久久 | 日日摸日日添日日躁av | 夜夜av | 男女性毛片 | 亚洲午夜精品 | 国产免费一区二区三区最新6 | 一级毛片大全免费播放 | 在线观看国产精品一区二区 | 久久99精品久久久久蜜桃tv | 日韩精品免费在线 | 黄色大片在线播放 | 国产综合久久 | 欧美国产精品一区二区三区 | 久久国产美女视频 | 男女羞羞的网站 | 中文字幕91 | 国产成人精品午夜 | 久久里面有精品 | 中文字幕在线观看第一页 |