學會看openstack的日誌

OpenStack日誌

日誌對於一個穩定的系統來說相當重要,對於OpenStack這樣一個大型的系統,日誌當然也是必不可少,理解Openstack系統的日誌對於保證OpenStack環境穩定非常重要。對於出現系統錯誤,查看日誌是一個很好的習慣。


OpenStack通過生成大量日誌信息來幫助排查系統安裝運行期間出現的問題,接下來介紹幾個常見服務的相關日誌位置。

Nova日誌

OpenStack計算服務日誌位於/var/log/nova,默認權限擁有者是nova用戶。需要注意的是,並不是每臺服務器上都包含所有的日誌文件,例如nova-compute.log僅在計算節點生成。

  • nova-compute.log:虛擬機實例在啓動和運行中產生的日誌
  • nova-network.log:關於網絡狀態、分配、路由和安全組的日誌
  • nova-manage.log:運行nova-manage命令時產生的日誌
  • nova-scheduler.log:有關調度的,分配任務給節點以及消息隊列的相關日誌
  • nova-objectstore.log:鏡像相關的日誌
  • nova-api.log:用戶與OpenStack交互以及OpenStack組件間交互的消息相關日誌
  • nova-cert.log:nova-cert過程的相關日誌
  • nova-console.log:關於nova-console的VNC服務的詳細信息
  • nova-consoleauth.log:關於nova-console服務的驗證細節
  • nova-dhcpbridge.log:與dhckbridge服務先關的網絡信息

Dashboard日誌

Dashboard是一個DJango的web應用程序,默認運行在Apache服務器上,相應的運行日誌也都記錄在Apache的日誌中,用戶可以在/var/log/apache2/中查看。

存儲日誌

對象存儲Swift默認日誌寫到syslog中,在Ubuntu系統中,可以通過/var/log/syslog查看,在其他系統中,可能位於/var/log/messages中。 
塊存儲Cinder產生的日誌默認存放在/var/log/cinder目錄中 
- cinder-api.log:關於cinder-api服務的細節 
- cinder-scheduler.log:關於cinder調度服務的操作的細節 
- cinder-volume.log:與cinder卷服務相關的日誌項

Keystone日誌

身份認證Keystone服務的日誌記錄在/var/log/keystone/keystone.log中。

Glance日誌

鏡像服務Glance的日誌默認存放在/var/log/glance目錄中 
- api.log:Glance API相關的日誌 
- registry.log:Glance registry服務相關的日誌 
根據日誌配置的不同,會保存諸如元信息更新和訪問記錄這些信息。

Neutron日誌

網絡服務Neutron的日誌默認存放在/var/log/neutron目錄中 
- dhcp-agent.log:關於dhcp-agent的日誌 
- l3-agent.log:與l3代理及其功能相關的日誌 
- metadata-agent.log:通過neutron代理給Nova元數據服務的相關日誌 
- openvswitch-agent.log:與openvswitch相關操作的日誌項,在具體實現OpenStack網絡時,如果使用了不同的插件,就會有相應的日誌文件名 
- server.log:與Neutron API服務相關的日誌

日誌的格式

OpenStack 的日誌格式都是統一的,如下

<時間戳><日誌等級><代碼模塊><Request ID><日誌內容><源代碼位置>

簡單說明一下
時間戳 日誌記錄的時間,包括 年 月 日 時 分 秒 毫秒
日誌等級 有INFO WARNING ERROR DEBUG等
代碼模塊 當前運行的模塊Request ID 日誌會記錄連續不同的操作,爲了便於區分和增加可讀性,每個操作都被分配唯一的Request ID,便於查找
日誌內容 這是日誌的主體,記錄當前正在執行的操作和結果等重要信息
源代碼位置 日誌代碼的位置,包括方法名稱,源代碼文件的目錄位置和行號。這一項不是所有日誌都有

下面舉例說明

2015-12-10 20:46:49.566 DEBUG nova.virt.libvirt.config [req-5c973fff-e9ba-4317-bfd9-76678cc96584 None None] Generated XML ('<cpu>\n  <arch>x86_64</arch>\n  <model>Westmere</model>\n  <vendor>Intel</vendor>\n  <topology sockets="2" cores="3" threads="1"/>\n  <feature name="avx"/>\n  <feature name="ds"/>\n  <feature name="ht"/>\n  <feature name="hypervisor"/>\n  <feature name="osxsave"/>\n  <feature name="pclmuldq"/>\n  <feature name="rdtscp"/>\n  <feature name="ss"/>\n  <feature name="vme"/>\n  <feature name="xsave"/>\n</cpu>\n',) to_xml /opt/stack/nova/nova/virt/libvirt/config.py:82

這條日誌我們可以得知:

  1. 代碼模塊是 nova.virt.libvirt.config,由此可知應該是 Hypervisor Libvirt 相關的操作

  2. 日誌內容是生成 XML

  3. 如果要跟蹤源代碼,可以到 /opt/stack/nova/nova/virt/libvirt/config.py 的 82 行,方法是 to_xml

又例如下面這條日誌:

2015-12-10 20:46:49.671 ERROR nova.compute.manager [req-5c973fff-e9ba-4317-bfd9-76678cc96584 None None] No compute node record for host devstack-controller

這條日誌我們可以得知:

  1. 這是一個 ERROR 日誌

  2. 具體內容是 “No compute node record for host devstack-controller”

  3. 該日誌沒有指明源代碼位置

關於日誌的幾點說明

  1. 學習 OpenStack 需要看日誌嗎?這個問題的答案取決於你是誰。如果你只是 OpenStack 的最終用戶,那麼日誌對你不重要。你只需要在 GUI上 操作,如果出問題直接找管理員就可以了。但如果你是 OpenStack 的運維和管理人員,日誌對你就非常重要了。因爲 OpenStack 操作如果出錯,GUI 上給出的錯誤信息是非常籠統和簡要的,日誌則提供了大量的線索,特別是當 debug 選項打開之後。如果你正處於 OpenStack 的學習階段,正如我們現在的狀態,那麼也強烈建議你多看日誌。日誌能夠幫助你更加深入理解 OpenStack 的運行機制。

  2. 日誌能夠幫助我們深入學習 OpenStack 和排查問題。但要想高效的使用日誌還得有個前提:必須先掌握 OpenStack 的運行機制,然後針對性的查看日誌。就拿 Instance Launch 操作來說,如果之前不瞭解 nova-* 各子服務在操作中的協作關係,如果沒有理解流程圖,面對如此多和分散的日誌文件,我們也很難下手不是。

  3. 對於 OpenStack 的運維和管理員來說,在大部分情況下,我們都不需要看源代碼。因爲 OpenStack 的日誌記錄得很詳細了,足以幫助我們分析和定位問題。但還是有一些細節日誌沒有記錄,必要時可以通過查看源代碼理解得更清楚。即便如此,日誌也會爲我們提供源代碼查看的線索,不需要我們大海撈針。這一點我們會在後面的操作分析中看到。


改變日誌級別

每個OpenStack服務的默認日誌級別均爲警告級(Warning),該級別的日誌對於瞭解運行中系統的狀態或者基本的錯誤定位已經夠用,但是有時候需要上調日誌級別來幫助診斷問題,或者下調日誌級別以減少日誌噪聲。由於各個服務的日誌設置方式類似,因此這裏就以Nova服務爲例。

設置Nova服務的日誌級別

vi /etc/nova/logging.conf 
將列出的服務的日誌級別修改爲DEBUG、INFO或WARNING

<code class="hljs makefile has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">[logger_root]
<span class="hljs-constant" style="box-sizing: border-box;">level</span> = WARNING
<span class="hljs-constant" style="box-sizing: border-box;">handlers</span> = null

[logger_nova]
<span class="hljs-constant" style="box-sizing: border-box;">level</span> = INFO
<span class="hljs-constant" style="box-sizing: border-box;">handlers</span> = stderr
<span class="hljs-constant" style="box-sizing: border-box;">qualname</span> = nova
......</code>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章