1. 程式人生 > >OSGI環境下配置log4j日誌

OSGI環境下配置log4j日誌

log4j相信大家都用過的,現在公司有很多專案的研究都是基於OSGI的,所以我們的日誌處理必須換到OSGI環境下去做了。於是相應的 問題也隨之而來。其中最主要的問題就是一個classloader的問題。知道OSGI架構原理的都知道OSGI裡面的各個Bundle是有獨立的 ClassLoader來進行載入的。所以當我們把log4j的配置檔案直接放在某個Bundleclasspath下面時是不能被整個OSGI環境識 別的。下面說我們的解決辦法。核心思想參考了網上一篇文章(點選這裡可以檢視)。
    1.
建一個config-template.ini檔案,當然位置和名字都可以由你自己安排,我這裡是建在了我的

OSGI環境(Eclipse或者 Equinox)的根目錄下的configuration資料夾下了,這樣這個配置檔案就能在執行時被根載入器載入,而對所有的bundle可見,那麼不僅僅是我們自定義的bundle可以用log4j,而且其他的第三方的 bundle(如activemq,spring)都可以不用改動任何東西,就能使他們的log4j產生效果了,這也就是我們做這個事情的根本目的。這個資料夾下原來就有個config.ini在部署的時候這個config.ini必須放在OSGI環境的confuguration資料夾下),是用於設定OSGI環境的啟動的相關 屬性的,我們可以複製它,然後稍作修改,內容如下:

 程式碼
  1. osgi.splashPath = file:E:/eclipse-workspace/com.oval.dcts.ba.ui  
  2. osgi.bundles=org.eclipse.equinox.common@2:start,
  3. org.eclipse.update.configurator@3:start, org.eclipse.core.runtime@start   
  4. eclipse.product=org.eclipse.sdk.ide  
  5. osgi.instance.area.default[email protected]/workspace  
  6. eclipse.buildId
    =M20060921-0945  
  7. log4j.configuration=file:/D:/Program Files/eclipse/configuration/log4j.properties 

然後是準備我的log4j的properties檔案,從上面可以看到,我需要把它放到D:/Program Files/eclipse/configuration,當然這個位置也是可以你自己定的(在linux我可以很好的設定相對位置來靈活處理,但是在windows下被反斜槓搞得鬱悶,暫時還沒有找到好辦法,只能先設個絕對地址,到時候可能需要跟使用者約定一下。),而且這個位置在目前我們找的資料來看,用絕對地址相對簡單一些,當然同時存在這一些部署上的不方便,我們暫時還沒有找到合適的解決方案,不過以後會加以改進,先讓我們的目的達到了再說。

log4j.properties 裡的寫法如下:

xml 程式碼
  1. ## ------------------------------------------------------------------------  
  2. ## Licensed to the Apache Software Foundation (ASF) under one or more  
  3. ## contributor license agreements.  See the NOTICE file distributed with  
  4. ## this work for additional information regarding copyright ownership.  
  5. ## The ASF licenses this file to You under the Apache License, Version 2.0  
  6. ## (the "License"); you may not use this file except in compliance with  
  7. ## the License.  You may obtain a copy of the License at  
  8. ##  
  9. ## http://www.apache.org/licenses/LICENSE-2.0  
  10. ##  
  11. ## Unless required by applicable law or agreed to in writing, software  
  12. ## distributed under the License is distributed on an "AS IS" BASIS,  
  13. ## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
  14. ## See the License for the specific language governing permissions and  
  15. ## limitations under the License.  
  16. ## ------------------------------------------------------------------------  
  17. #  
  18. # The logging properties used for eclipse testing, We want to see debug output on the console.  
  19. #  
  20. log4j.rootLogger=INFO, stdout, out  
  21. # CONSOLE appender not used by default  
  22. log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
  23. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
  24. #log4j.appender.stdout.layout.ConversionPattern=[%30.30t] %-30.30c{1} %-5p %m%n  
  25. #log4j.appender.stdout.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n  
  26. log4j.appender.stdout.layout.ConversionPattern=%d %-5p %-5C:%L %x -> %m%n  
  27. # File appender  
  28. log4j.appender.out=org.apache.log4j.RollingFileAppender  
  29. log4j.appender.out.file=./log/log4j.log  
  30. log4j.appender.out.maxFileSize=1024KB
  31. log4j.appender.out.maxBackupIndex=5
  32. log4j.appender.out.append=true
  33. log4j.appender.out.layout=org.apache.log4j.PatternLayout  
  34. log4j.appender.out.layout.ConversionPattern=%d %-5p %-5C:%L %x -> %m%n  
  35. log4j.logger.org.springframework=INFO
  36. log4j.logger.org.springframework.jdbc.core=INFO

其中比較關鍵的為log4j.appender.out.file=./log/log4j.log。這裡告訴環境把日誌檔案的儲存位置,這樣寫的話便會將log檔案儲存在你的環境的根目錄下的log資料夾下,檔案為log4j.log。

接下來,我們需要在OSGI的啟動環境里加上commons-logging和log4j這兩個OSGI的bundle咯。在這個地方我們遇到些問題,測試了很久日誌都打不出來,後來通過一步步debug才發現問題出在了這兩個bundle上,所以大家最好下個最新版的。在啟動選項的目標平臺裡把這兩個bundle勾選上。接下來就是到“配置”欄去設定環境載入時使用的配置檔案了,在配置檔案欄選擇“使用現有 config.ini檔案作為模板”(預設情況,eclipse會在他的執行環境中自己生成一個預設的ini檔案,裡面沒有我們之前的對log4j做的配置)。選擇好後,就開始把我們的OSGI環境跑起來吧。

可以看到日誌成功的打到了日誌檔案裡了。

由於第一帖不知道怎麼貼圖片,我把文章中用到的圖片都發到附件裡了,大家可以結合圖來看,文筆比較差,有沒講解清楚的地方希望大家原諒~