當前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配置環境...