Google Search

自訂搜尋

2009年1月7日 星期三

[PL/SQL] Logging Framework - Log 4 PL/SQL

相信JAVA的愛好者一定聽過Log4J這個Logging的架構(Framework). 程式開發和系統導入&使用的過程中, Logging是一個TroubleShooting必備的工具, 然而對PL/SQL而言, Oracle 並沒有提供相關的架構&功能, Logging大概都是自行開發的程式, 有將LOGGING模組化還是好的, 大部分我想是Hardcode,想記Log就記Log, 不同程式還記在不同TABLE,甚至高興還記在外部的Text file. 等到系統出問題要查LOG時才發現Log有記但會漏, 那時在跟老闆報告說找不到Bug在哪, 肯定被ㄞㄧ頓排頭!

所以Logging可以說是養兵千日用在一時的好幫手, 承平時候(User 沒有抱怨), Logging被視為是系統額外的負擔, 不管是程式執行時的Overhead 或 儲存空間的overhead. 但是一旦使用者抱怨來了發現資料有誤, 開發人員無論如何重建案發現場都無法模擬出這個BUG時, Logging 的資料又變成彌足珍貴. 這時一個Logging的底層(Framework)就可以幫助開發人員, 將這項工作綁在程式開發中又不會影響程式的架構. 一般而言, 一個好的LOGGING架構應該涵括以下幾點:
- 易於導入
- Log的紀錄必須能夠和程式邏輯的COMMIT/Rollback切隔開.(總不能程式一下Rollback指令連以記錄的LOG都Rollback掉)
- Log的紀錄必須能夠根據DEBUG的需求分成不同Level, 不同Level紀錄的LOG也不一樣.
- 系統的 Overhead 要低.

SourceForge 就有一項專案 Log 4 PL/SQL, 我們就來玩玩吧!!!

1. 安裝篇
自以下網頁 http://log4plsql.sourceforge.net/下載.後解壓縮, 照安裝說明執行批次檔然後就安裝成功, 哈哈, 別傻了, 基本上 open source的作者都是 Geek, 高手中的高手, 但這些Geek喜歡寫程式就是不喜歡寫文件. 所以最後還是把一堆 .SQL 檔案一個一個在TOAD中執行, 一個一個DEBUG才完成. 還好不算難裝啦.

2. 使用篇

-- 先試著呼叫 Log 4 PL/SQL 所建立的 Package(PLOG)的Procedure(Info).
Exec ULOG.PLOG.info ('mess info');

-- 第二個例子, 是著建立一個Procedure 在其中去呼叫-PLOG, 基本上要在哪個位置埋LOG, 要開發人員自己決定.
create or replace procedure TestProc is
cpt number;
begin
ulog.plog.info('this select raise ORA-01403:No Data Found');
select id into cpt from ulog.tlog where id = -1;
exception
when others then
ulog.plog.error; -- default message is SQLCODE SQLERRM
end;/

exec HR.TestProc

-- 最後看一下結果吧!
-- 從結果中, 可見記錄到的Error message.

select * from ulog.vlog;




















IDLDATELHSECSLLEVELLSECTIONLTEXTELUSER
1
2009/1/8 下午 11:19:13
1121152
30
block.HR.TESTPROCSQLCODE:100 SQLERRM:ORA-01403: 找不到資料SYS
3. 進階篇
  • 至於埋的LOG要不要作用就要看Logging level的設定, Logging level 有分以下幾種

    · isDebugEnabled

    · isInfoEnabled

    · isWarnEnabled

    · isErrorEnabled

    · isFatalEnabled

透過程式來控制什麼LEVEL要記什麼樣的 Log, 也就是將 IF - End If 加在塞LOG之前.
  • 設定不一樣的啟動參數, 此工具有提供一些工具程式去改變參數, 如下
    pCTX PLOG.LOG_CTX := PLOG.init (pALERT => TRUE);
4. 架構篇
  • Log 4 PL/SQL 可以紀錄LOG在以下標的物(Destination)
  1. Table in Oracle Datablase
  2. Oracle Datablase alert.log file
  3. Oracle Datablase trace file
  4. Standard output ·
  5. By log4J::Log4JbackgroundProcess(JDBC, SMTP,...)

  • 基本架構如下:
Log 4 PL/SQL 基本上是 Log 4J的延伸, 所以 Log4J的功能Log 4 PL/SQL 也可以使用.



沒有留言: