当前位置: 首页 > 面试题库 >

使用Java.util的Logger和FileHandler类时,几秒钟后日志文件未更新

袁鹤轩
2023-03-14
问题内容

我正在使用以下类’LoggerUtil’来登录控制台和文件’logfile.log’。控制台的日志记录工作正常。但是,登录几次后将停止记录到“
logfile.log”文件。欢迎找到有关该错误的任何建议。我附上以下代码:

public class LoggerUtil {   
  public static final String LOGGERNAME = "project.logging";

  static {
      try {
          Logger.getLogger(LOGGERNAME).setUseParentHandlers(false);
          Handler ch = new ConsoleHandler();
          Handler fh = new FileHandler("logfile.log");
          SimpleFormatter sf = new SimpleFormatter();
          fh.setFormatter(sf);
          Logger.getLogger(LOGGERNAME).addHandler(ch);
          Logger.getLogger(LOGGERNAME).addHandler(fh);
          setHandlersLevel(Level.ALL);
      } catch (IOException | SecurityException ex) {
          Logger.getLogger(LoggerUtil.class.getName()).log(Level.SEVERE, null, ex);
      }
  }

  public static void setHandlersLevel(Level level) {
      Handler[] handlers = Logger.getLogger(LOGGERNAME).getHandlers();
      for (Handler h : handlers) {
          h.setLevel(level);
      }
      Logger.getLogger(LOGGERNAME).setLevel(level);
  }

  public static Logger getLogger() {
      return Logger.getLogger(LOGGERNAME);
  }
}

我从项目的各个位置调用以下代码进行记录:

LoggerUtil.getLogger().log(Level.INFO, "Message to be logged");

请注意,我的项目是多线程的。各个线程使用相同的文件进行日志记录。这可能是并发问题,还是只是一个红鲱鱼!


问题答案:

硬参考您的记录器。经验法则是在类中使用静态的final字段。

public static final String LOGGERNAME = "project.logging";
//Pin logger in memory.
private static final Logger logger = Logger.getLogger(LOGGERNAME);

从记录仪。getLogger(String)文档:

注意:LogManager可能仅保留对新创建的Logger的弱引用。重要的是要理解,如果没有对Logger的强引用,则可以随时垃圾收集先前创建的具有给定名称的Logger。

当记录器被垃圾回收时,您的ConsoleHandler和FileHandler不会重新连接到新的记录器。

使用FindBugs,因为它检测到以下错误模式:

LG:由于OpenJDK中的参考力弱,可能会丢失记录器更改(LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE)



 类似资料:
  • 问题内容: 我想知道,几秒钟后如何在jquery中隐藏div?例如Gmail的邮件。 我已经尽力了,但是无法正常工作。 问题答案: 这将在1秒(1000毫秒)后隐藏div。 如果您只想隐藏而不褪色,请使用。

  • 我不清楚java程序是如何知道xml文件的位置的。我想这就是问题所在。这就是我在代码中的设置, 任何帮助都是徒劳的。谢了。

  • Logger(日志) 中间件 Logger 中间件记录了每一个请求的信息。 用法 e.Use(middleware.Logger()) 输出样例 {"time":"2017-01-12T08:58:07.372015644-08:00","remote_ip":"::1","host":"localhost:1323","method":"GET","uri":"/","status":200,

  • 问题内容: 我在Django中的应用程序 可以 创建一些 非常大的SQL查询。我目前使用一个对象,作为我需要的数据,然后使用一个,以返回要显示给用户的内容。 显然,我可以让用户等待一分钟,同时正在执行这些许多查询集并从数据库中提取查询,然后返回此单一HTML页面。 理想情况下,我想在需要时更新页面,例如: 这可能吗? 问题答案: 我最近发现HttpResponse可以是生成器: 这将逐步将结果返回

  • 问题内容: 我正在尝试在每天创建目录的目录中创建日志,但是fileHandler没有创建目录,而是其抛出异常 无法获取C:\ dir_date \ Logging.txt的锁 (此处dir_date不存在,我正在尝试创建登录到该目录)。我可以通过“ fileHandler”创建目录吗? log4J甚至可以创建目录(如果不存在),这是否可以通过fileHandler进行? 问题答案: julFile

  • 问题内容: 所以,我有两个日期和 我如何找出它们之间有多少秒? 问题答案: 我用YYYY和ZZZZ表示整数,表示年份,MM&NN表示整数,表示年份的月份,而DD&EE表示整数,表示月份的月份。 或者,如果您的日期采用javascript可以解析的格式 然后您可以使用该值作为毫秒之间的差异(在我的两个示例中,dif的含义相同)