1

以下を含む MyLogger クラスがあります。

public class MyLogger {

    private final static Logger logger = Logger.getLogger(MyLogger.class.getName());
    private static FileHandler fileHandler;
    private static String loggerFileName;

    public MyLogger() { 
    }

    public static void createMyLogger(String filename){
        loggerFileName = filename;
        try {
            File loggerFile = new File(filename);
            boolean fileExists = loggerFile.exists();
            if(fileExists){
                loggerFile.delete();
                File lockFile = new File(filename+".lck");
                if(lockFile.exists())
                    lockFile.delete();
            }
            fileHandler = new FileHandler(filename,true);

        } catch (IOException e) {
            e.printStackTrace();
        }
        logger.addHandler(fileHandler);
        SimpleFormatter simpleFormatter = new SimpleFormatter();
        fileHandler.setFormatter(simpleFormatter);
    }

    public static void log(String msg) {
        logger.log(Level.INFO, msg);
    }

    public static void log(Exception ex) {
        logger.log(Level.SEVERE, "Exception",ex);
    }


    public static String getLoggerFileName() {
        return loggerFileName;
    }


    public static void setLoggerFileName(String loggerFileName) {
        MyLogger.loggerFileName = loggerFileName;
    }

そして、スレッドでさらに実行しています。つまり、最初のプロセスを開始すると、ロガーファイルが作成され、ログが記録されますが、別のプロセスを開始すると、別のスレッドが作成され、新しいロガーファイルも作成されますが、静的のためメソッドと参照 両方のロガーファイルで両方のプロセスログを混同しました...

すべてのスレッドのプロセスを開始すると、次のメソッドが呼び出されます。

 public void start(String process) {
            try{
                String filename = process.replace(".com", "");
                MyLogger.createXPathLogger(filename.concat(WordUtils.capitalize(type))+ ".log");
                MyLogger.log("got parameters ===>> process : "+process);
                }catch (Exception e) {
                         MyLogger.log("Exception In main() method....");
                         MyLogger.log("*****"+process+" process failed In main() method.*****");
                         MyLogger.log(e);
              }
        }

それで、私はこれのために何ができますか? 前もって感謝します..

4

1 に答える 1

0

ここでのアイデアは実際には機能しません。1 つのロガーが作成され、ロガーに各ハンドラーを追加します。

本当に必要なのは、ログ コンテキストの概念です。スレッドごとにロガーの作成を分離する必要がありますが、これは JUL では実行できません。

これは、JBoss Log Manager を使用してこれを行う非常に大雑把な例です。

import java.io.File;
import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;

import org.jboss.logmanager.LogContext;
public class MyLogger {

    private static final ThreadLocal<MyLogger> LOCAL_LOGGER = new ThreadLocal<MyLogger>();

    private final Logger logger;

    private MyLogger(final Logger logger) {
        this.logger = logger;
    }

    public static MyLogger createMyLogger(final String filename) {
        MyLogger result = LOCAL_LOGGER.get();
        if (result == null) {
            final LogContext logContext = LogContext.create();
            final Logger logger = logContext.getLogger(MyLogger.class.getName());
            final FileHandler fileHandler;
            try {
                final File loggerFile = new File(filename);
                if (loggerFile.exists()) {
                    loggerFile.delete();
                    File lockFile = new File(filename + ".lck");
                    if (lockFile.exists())
                        lockFile.delete();
                }
                fileHandler = new FileHandler(filename, true);

            } catch (IOException e) {
                throw new RuntimeException("Could not create file handler", e);
            }
            logger.addHandler(fileHandler);
            fileHandler.setFormatter(new SimpleFormatter());
            final MyLogger myLogger = new MyLogger(logger);
            LOCAL_LOGGER.set(myLogger);
            result = myLogger;
        }
        return result;
    }

    public void log(String msg) {
        logger.log(Level.INFO, msg);
    }

    public void log(Exception ex) {
        logger.log(Level.SEVERE, "Exception", ex);
    }
}
于 2012-10-17T18:56:37.710 に答える