修改ceph原始碼 增加函式級別日誌輸出功能

2021-09-06 21:14:19 字數 2776 閱讀 9069

當前ceph中的日誌只能做到某一子系統(subsystem)的某一級別日誌,比如給ceph_subsys_osd子系統設定日誌級別為5,則表示任何級別小於等於5的osd子系統日誌都可以輸出到日誌檔案。關於子系統日誌級別設定有兩種方法

(1)在配置檔案中指定

比如

debug_osd 5
就是將osd子系統的日誌輸出級別設定為5

(2)利用admin_socket動態設定

ceph實現了admin_socket(即unix socket)來用於使用者和ceph的元件進行通訊。我們可以利用admin_socket來動態設定日誌輸出級別,如下:

ceph daemon /var/run/ceph/ceph-osd.0.asok congfig set debug_osd 5
在除錯問題時一般會用到第二種方法進行執行時更改日誌輸出級別,但是這個方法有乙個問題就是會輸出大量不相關的日誌資訊,這會增加問題排查的難度,因此本人修改ceph日誌模組,增加了可以具體到某一函式的日誌輸出功能,並可以利用admin_socket動態修改.

增加函式級別日誌的動態設定、檢視、刪除等功能,具體實現如下

(1)定義相關類與方法

在src/log/subsystemmap.h中定義相關的類和方法

class zylog

void zy_unset_fun_log(unsigned subsys, std::string fun_name)

}bool zy_should_gather(unsigned subsys, std::string fun_name)

int zy_subsys_string_to_unsigned(std::string subsys_str)

return -1;

} void get_all_subsys(formatter *f)

}void get_all_setted_funs(formatter *f)

}

(2)註冊相關命令

在src/common/ceph_context.cc的cephcontext類的建構函式中,增加如下幾行

_admin_socket->register_command("zylog set", "zylog set name=subsys,type=cephstring name=fun,type=cephstring", _admin_hook, "");

_admin_socket->register_command("zylog unset", "zylog unset name=subsys,type=cephstring name=fun,type=cephstring", _admin_hook, "");

_admin_socket->register_command("zylog showsubsys", "zylog showsubsys", _admin_hook, "");

_admin_socket->register_command("zylog showsets", "zylog showsets", _admin_hook, "");

這裡分別註冊了set unset showsubsys showsets四個命令,其中showsubsys是檢視ceph中有哪些子系統可以設定

set命令的用法就是ceph daemon /var/run/ceph/ceph-osd.0.asok zylog set osd heartbeat ,表示設定osd子系統中的heartbeat函式中的日誌為輸出。

(3)處理相關命令

在src/common/ceph_context.cc的do_command函式中增加如下**

else if (command == "zylog set")  else }}

else if (command == "zylog unset") else }}

else if (command == "zylog showsubsys")

else if (command == "zylog showsets")

(4)修改dout.h

修改後的內容如下

#define dout_impl(cct, sub, v)            \

do else \

}(cct); \

\if (!should_gather) \ //如果日誌在原有判斷中不能輸出,則繼續判斷函式級別日誌是否允許輸出

if (should_gather || funlog_out) \

else \

static_assert(std::is_convertible::value, \

"provided cct must be compatible with cephcontext*"); \

auto _dout_cct = cct; \

std::ostream* _dout = &_dout_e->get_ostream();

最後附上**修改記錄

(1)在設定函式級別日誌輸出時,我沒有判斷該函式是否存在於子系統內,目前我還沒有找到方法獲得某個子系統內或者某個檔案內的函式表。

(2)可以設定命令格式為file:function而不是subsys:function,這樣就可以具體到某乙個檔案中的某個函式,而不是某乙個某乙個子系統,目前也沒有找到修改方法。

Ceph原始碼編譯

研究ceph不編譯一下原始碼好像是說不過去的。再者,通過原始碼編譯安裝ceph,裝搭建的集群也要穩定的多!因而在此,總結一下ceph原始碼編譯過程中遇到的問題以及相應的解決方法,希望多少能提供一些幫助!本人環境 centos7.0 ceph v0.94 編譯 cd ceph autogen.sh c...

原始碼安裝Ceph

虛擬機器安裝ubuntu 50g硬碟空間 8g記憶體 4個cpu處理器。由於ceph原始碼在編譯後多達30g,因此需要分配大量的儲存空間。ubuntu的安裝和環境配置 見 gz解壓ceph原始碼 tar zxf ceph 11.2 0.orig tar gz進入源目錄 cd ceph 11.2.0 ...

原始碼編譯ceph

畢業進入公司後,接觸的第乙個專案是做ceph核心客戶端的優化,為了對ceph以及其客戶端有更加深刻的了解,在通過rpm安裝了一次ceph後,這裡又通過原始碼編譯配置了一次。其中,作業系統為centos7.2,編譯ceph 10.2.3的原始碼。配置ceph執行環境 使用ceph deploy配置環境...