1. 程式人生 > >問題討論:使用java.util.logging,每個專案使用自己的logging.properties配置檔案

問題討論:使用java.util.logging,每個專案使用自己的logging.properties配置檔案

問題討論:使用java.util.logging,每個專案使用自己的logging.properties配置檔案

主題:logging.properties配置檔案

詳細描述:使用jdk的java.util.logging,專案使用自己的配置檔案,而不是預設配置檔案(jre/lib/logging.properties)

問題點:

1、LogManager配置檔案獲取

2、初始化操作的判斷

解決方法討論

1

方法:LogManager通過readConfiguration()讀取預設配置檔案,則可以MyLogManager繼承LogManager,並重寫LogManager的readConfiguration()方法:修改配置檔案路徑。

結論:方法可行,但是太傻

原因:由於java.util.logging類其他類都是使用LogManager,需要重寫所有類2

2

方法:使用一個初始化類,初始化LogManager:readConfiguration(aimBin)

結論:方法可行,但是每次呼叫Logger的日誌都需要做初始化判斷。十分繁瑣

原因:可行原因是LogManager是單例的。

3

方法:重寫Logger,並新增LogManager的初始化

結論:可行

程式碼示例

 

package org.hh.myproj.logmanager;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.LogManager;
import java.util.logging.Logger;

/**
 * 重寫Logger類,在該類中新增LogManager配置的初始化操作
 * @author
 *
 */

public class MyLogger extends Logger{
 
 static LogManager logManager ;//= LogManager.getLogManager();
 
 //優先從專案路徑下的config/loggging.properties取配置,取不到則使用預設配置
 static{
  if (logManager==null){
   File userDir = new File(System.getProperty("user.dir"));
   if (!userDir.exists()) {
    throw new Error("找不到工作路徑!");
   }
   File configFile = null;
   InputStream in = null;
   BufferedInputStream bin = null;
   try{
    configFile = new File(userDir.getPath()+"\\config","logging.properties

");
    in = new FileInputStream(configFile);
    bin = new BufferedInputStream(in);
   }catch(Exception e){
    logManager = LogManager.getLogManager();
   }
   
   try {
    if (logManager==null) {
     logManager = LogManager.getLogManager();
     logManager.readConfiguration(bin);
    }
   } catch(Exception e){
   } finally {
       if (in != null) {
        try {
      in.close();
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
       }
   }
  }
  
 }
 
 public static Logger getLogger(String name){
  return Logger.getLogger(name);
 }
 
 
 protected MyLogger(String name, String resourceBundleName) {
  super(name, resourceBundleName);
  // TODO Auto-generated constructor stub
 }

}

結果:從config/logging.properties讀取配置,讀取不到則使用預設配置