【问题标题】:Logging for some classes into single file and for some classes into their respective log file using java.util.Logging使用 java.util.Logging 将某些类记录到单个文件中,并将某些类记录到它们各自的日志文件中
【发布时间】:2017-04-24 14:41:35
【问题描述】:

(我想将某些类记录到单个文件中,并将某些类记录到它们各自的日志文件中。)

(我不想使用 log4j 或 slf4j 之类的任何库,请不要推荐这些。)

我的问题是

到目前为止,每个类都有自己的日志文件,我已经使用 Java.util.logging 实现了。 但是现在有些类需要记录到一个文件中。

我知道如何记录到一个文件,但主要是我为所有类编写的功能可以写入其各自的日志文件。我不想复制该代码,因为将日志写入单个文件的类将使用相同的方法。

至于登录到同一个文件,我需要一个记录器对象,我可以通过静态关键字来实现。

这是写完的整个类

 public class LogHelper {

private static String   logPath             = "/Users/Desktop/checklog";

private static Logger           logger;
private String          callingMethodName;
private static FileHandler      fileHandler;

public LogHelper() {
    super();
}

public LogHelper(String loggerName, String callingMethodName) {
    logger = Logger.getLogger(loggerName);
    this.callingMethodName = callingMethodName;
}

public String getPrefix(String method) {
    String prefix = new StrBuilder(callingMethodName).append(".").append(method).append(": ").toString();
    return prefix;
}

public void logDebug(String message) {
    logger.logp(Level.ALL, "", "", message);
}

public void logError(String message) {
    logger.logp(Level.SEVERE, "", "", message);
}


public void logWarn(String message) {
    logger.logp(Level.WARNING, "", "", message);
}

public void logInfo(String message) {
    logger.info(message);
}

public void logTrace(String message) {
    logger.trace(message);
}

public static void setFileHandler(String fileName) throws IOException {
    try {
        String filePath = new StringBuffer().append(System.getProperty("user.dir")).append(File.separator).append("logs").append(File.separator).toString();
        FileUtils.forceMkdir(new File(filePath));
        FileHandler fileHandler = new FileHandler(new StringBuffer(filePath).append(fileName).append(".log").toString(), true);
        System.out.println("setFileHandler() File Path :" + filePath);
        logger.addHandler(fileHandler);
        SimpleFormatter formatter = new SimpleFormatter();
        fileHandler.setFormatter(formatter);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}


public static void closeFileHander() {
    try {
        if (fileHandler != null) {
            logger.removeHandler(fileHandler);
            fileHandler.flush();
            fileHandler.close();
        }
    } catch (Exception ex) {

    }
}


}

我想利用这个类,以便一些类能够写入单个文件,而另一些能够写入它们各自的文件。

好的,暂时我已经这样解决了。

我已经创建了这个类的静态对象,然后添加了一个新的静态方法,它将返回这个对象,但在返回之前会为它设置记录器。

所以我在上面写的类中添加了这些行。

private static LogHelper logHelper;

public static LogHelper getHelper(String loggerName,String fileName){
    if(logHelper == null){
         logHelper = new LogHelper();
    }

    logHelper.logger = Logger.getLogger(loggerName);
    logHelper.setFileHandler(fileName);

    return logHelper;
}

现在我可以在将日志写入一个文件的所有类中使用它。

【问题讨论】:

  • String filePath = new StringBuffer().append(System.getProperty("user.dir")).append(File.separator).append... 这就是 1996 年构建字符串的方式。使用 + 运算符,或 Paths.get,或 String.format — 它们都比使用字符串缓冲区。
  • 使用StringBuffer是因为多线程可以访问该方法。
  • 这不是多线程的工作方式。本地创建的对象本质上是线程安全的。每个方法调用都会创建自己的实例,这些实例永远不会与任何其他线程共享。 StringBuffer 在您的情况下没有任何好处。
  • 好的谢谢VGR让我和写它的div讨论一下。

标签: java logging


【解决方案1】:

记录器(java.util.logging.Logger 类的实例)位于命名空间层次结构中,由您给 Logger.getLogger(String name) 指定的名称定义。

因此,您可以将一个记录器附加到com.,将另一个记录器附加到com.consolelogging.,再将另一个记录器附加到com.filelogging. 名称。

我认为在您的情况下,您根据类的完全限定名称创建每个记录器,从而确保每个类都有自己的记录器。

您可以通过命名空间简单地创建多个不附加任何子级的根级别记录器,并将每个记录器的输出泵送到单独的文件中。

换句话说,您调用Logger.gerLogger("file_one") 的每个类都将记录到由为此记录器定义的附加程序定义的同一文件中。

将每个类记录到单独的文件中也是非常低效的(并且会妨碍分析),但如果这些是您的要求,那就这样吧。

希望这会有所帮助。

【讨论】:

  • 你好@diginoise。实际上我正在处理的项目,他们创建了一个通用类,在它的构造函数中他们调用 Logger.getLogger(name) 所以当创建该类的每个对象时,都会执行这个 Logger.getLogger(name)。让我更新我的问题,然后请查看它并告诉我是否可以为某些类写入一个文件。
  • 感谢@diginoise 的帮助。我通过其他方式做到了。虽然我知道这不是一个好的做法,但它已经开始按预期工作。暂时我们很好,以后我们会改变它。
  • @MuhammadDanishKhan 也许添加您的解决方案并编辑问题以包含所有详细信息并将代码限制在最低限度是有意义的(那里有一些样板代码)。此外,如果答案对您的解决方案有所帮助,请随时投票。如果没有,请允许我相应地编辑解决方案,以便您可以出于正确的原因投票。
猜你喜欢
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 2019-01-11
  • 2011-06-12
  • 1970-01-01
  • 2013-11-26
相关资源
最近更新 更多