Thursday, May 19, 2016

OpenStack oslo log Tutorial

oslolog

Oslo-log Tutorial

這部分的代碼已經放到我的github上了

https://github.com/jonahwu/lab/tree/master/oslolog

另外這篇文章的內容,跟我之前一篇,oslo-config的文章有很大的關係,因為oslo-log相依於oslo-config。 因此我把oslo-config的文章也貼出來方便讀者查閱,並且我們也基於上篇oslo-config文章內容進行對oslo-log的程式添加,如下

http://gogosatellite.blogspot.tw/2016/05/openstack-oslo-config-tutorial.html

我們的作法基本上是從OpenStack Ceilometer中學習而來。

首先我們看一下目錄架構。

root@ubuntu:~/oslolog# tree
.
├── app.conf
├── app.log
├── app.py
├── app.py_bak
├── common
│   ├── _i18n.py
│   ├── i18n.py
│   ├── _i18n.pyc
│   ├── i18n.pyc
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── local.py
│   ├── local.pyc
│   ├── oslolog.py
│   └── oslolog.pyc
├── con.py
├── con.pyc
├── __init__.py
├── service.py
├── service.pyc

記得,在任何目錄下,請增加__init__.py這個檔案,Python會將有這個檔案的目錄解析為Python目錄,因此 才可以使用from common.local import xx類似這樣的語法,如果沒有__init__.py會報Import Error的錯誤。 我想這是每個人都知道,但卻又容易犯的錯。

要使用oslo-log的機制,需要安裝非常多的oslo相關套件,以下為相關的套件,相對於oslo-config複雜多了。

root@ubuntu:~/oslolog# pip freeze|grep oslo
oslo.config==1.9.4.dev6
oslo.context==2.3.0
oslo.i18n==3.6.0
oslo.log==1.0.1.dev10
oslo.serialization==1.4.1.dev3
oslo.utils==3.10.0

同樣的程式碼也相對複雜許多,因此我們把所有相關的程式碼放到common目錄裡,並將需要寫程式的部分分開,讓可用性與可讀性提升到最高。 讀者僅需要下載common的目錄並放置於相對應的位置即可使用。

我們首先來看看主要目錄發生了什麼事,首先,app.py增加了

from common import oslolog as logging
from common.i18n import _
.
.
.
LOG = logging.getLogger(__name__)

所有的initial 我們放到service.py

from oslo_config import cfg
import sys
import common.oslolog as logging

def prepare_service(argv=None):
    if argv is None:
        argv = sys.argv
    cfg.CONF(argv[1:], project='satellite', validate_default_values=True)
    CONF=cfg.CONF
    DOMAIN = "satellite"
    logging.setup(CONF, DOMAIN)

這部分跟之前我的oslo-config的文章比起來多了logging的設定,另外值得說明的是,要使用oslo-log需要搭配oslo-config才行。 否則無法寫到log file中,這部分,在我自己的測試中是這樣的,有沒有別的方法不依賴oslo-config我就不清楚了。

我們再看看,在其他檔案中,或其他Class中該怎麼使用oslo-log,我們看一下con.py這個檔案。

from oslo_config import cfg
import common.oslolog as logging

ALARM_API_OPTS = [
    cfg.BoolOpt('record_history',
                default=False,
                help='Record alarm change events.'
                ),
    cfg.StrOpt('alarm_sec',
                default=0,
                help='Record alarm change events.'
                ),
]
CONF = cfg.CONF
CONF.register_opts(ALARM_API_OPTS, group='alarm')
LOG = logging.getLogger(__name__)

class alm(object):
    def __init__(self):
        user_record_history = CONF.alarm.record_history
        LOG.info('user record %s'%user_record_history)
        LOG.info(CONF.alarm.alarm_sec)

其實針對oslo-log的部分,我們只增加了兩行,

import common.oslolog as logging
LOG = logging.getLogger(__name__)

原本相當複雜的設定,透過import common後變得非常容易,只需要兩行即可。

最後我們來看一下,該怎麼樣執行此程式檔,如下

./app.py --debug --config-file /root/oslolog/app.conf --log-file /root/oslolog/app.log

其中--log-file是必須透過service.py內的CONF設定得來的,因此,這照成了oslo-log相依於oslo-config。

這時候,我們多了--log-file我們可以檢查一下,是否log的部分已經記載到此檔案了。

root@ubuntu:~/oslolog# cat app.log
2016-05-17 05:57:52.979 16960 ERROR __main__ [-] True
2016-05-17 05:57:52.979 16960 ERROR __main__ [-] ["['Magic'", "'Jessica'", "'Peter']"]
2016-05-17 05:57:52.980 16960 INFO con [-] user record True
2016-05-17 05:57:52.980 16960 INFO con [-] 20

No comments:

Post a Comment