OSGI環境下配置log4j日誌
log4j相信大家都用過的,現在公司有很多專案的研究都是基於OSGI的,所以我們的日誌處理必須換到OSGI環境下去做了。於是相應的 問題也隨之而來。其中最主要的問題就是一個classloader的問題。知道OSGI架構原理的都知道OSGI裡面的各個Bundle是有獨立的 ClassLoader來進行載入的。所以當我們把log4j的配置檔案直接放在某個Bundle的classpath下面時是不能被整個OSGI環境識 別的。下面說我們的解決辦法。核心思想參考了網上一篇文章(點選這裡可以檢視)。
1.建一個config-template.ini檔案,當然位置和名字都可以由你自己安排,我這裡是建在了我的
- osgi.splashPath = file:E:/eclipse-workspace/com.oval.dcts.ba.ui
- osgi.bundles=org.eclipse.equinox.common@2:start,
- org.eclipse.update.configurator@3:start, org.eclipse.core.runtime@start
- eclipse.product=org.eclipse.sdk.ide
- osgi.instance.area.default[email protected]/workspace
-
eclipse.buildId
- log4j.configuration=file:/D:/Program Files/eclipse/configuration/log4j.properties
然後是準備我的log4j的properties檔案,從上面可以看到,我需要把它放到D:/Program Files/eclipse/configuration,當然這個位置也是可以你自己定的(在linux我可以很好的設定相對位置來靈活處理,但是在windows下被反斜槓搞得鬱悶,暫時還沒有找到好辦法,只能先設個絕對地址,到時候可能需要跟使用者約定一下。),而且這個位置在目前我們找的資料來看,用絕對地址相對簡單一些,當然同時存在這一些部署上的不方便,我們暫時還沒有找到合適的解決方案,不過以後會加以改進,先讓我們的目的達到了再說。
log4j.properties 裡的寫法如下:
xml 程式碼- ## ------------------------------------------------------------------------
- ## Licensed to the Apache Software Foundation (ASF) under one or more
- ## contributor license agreements. See the NOTICE file distributed with
- ## this work for additional information regarding copyright ownership.
- ## The ASF licenses this file to You under the Apache License, Version 2.0
- ## (the "License"); you may not use this file except in compliance with
- ## the License. You may obtain a copy of the License at
- ##
- ## http://www.apache.org/licenses/LICENSE-2.0
- ##
- ## Unless required by applicable law or agreed to in writing, software
- ## distributed under the License is distributed on an "AS IS" BASIS,
- ## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ## See the License for the specific language governing permissions and
- ## limitations under the License.
- ## ------------------------------------------------------------------------
- #
- # The logging properties used for eclipse testing, We want to see debug output on the console.
- #
- log4j.rootLogger=INFO, stdout, out
- # CONSOLE appender not used by default
- log4j.appender.stdout=org.apache.log4j.ConsoleAppender
- log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
- #log4j.appender.stdout.layout.ConversionPattern=[%30.30t] %-30.30c{1} %-5p %m%n
- #log4j.appender.stdout.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
- log4j.appender.stdout.layout.ConversionPattern=%d %-5p %-5C:%L %x -> %m%n
- # File appender
- log4j.appender.out=org.apache.log4j.RollingFileAppender
- log4j.appender.out.file=./log/log4j.log
- log4j.appender.out.maxFileSize=1024KB
- log4j.appender.out.maxBackupIndex=5
- log4j.appender.out.append=true
- log4j.appender.out.layout=org.apache.log4j.PatternLayout
- log4j.appender.out.layout.ConversionPattern=%d %-5p %-5C:%L %x -> %m%n
- log4j.logger.org.springframework=INFO
- 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環境跑起來吧。
可以看到日誌成功的打到了日誌檔案裡了。
由於第一帖不知道怎麼貼圖片,我把文章中用到的圖片都發到附件裡了,大家可以結合圖來看,文筆比較差,有沒講解清楚的地方希望大家原諒~