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