确定文件正在使用的文件处理器

我创建一个java.util.logging.FileHandler通过文件允许周期。 当我的应用程序的多个实例运行,一个新的日志文件的应用程序的每个实例创建。 我需要知道什么文件正在使用的应用程序,因为我要上传日志文件到我的服务器进行进一步的审查。 我怎样才能知道哪些文件正由一定的FileHandler?

--------------解决方案-------------

最简单的方法就是把一些标识符的文件名 ​​本身,即pattern的说法,当你创建的FileHandler。 由于这些是同一应用程序的实例,一个区分它们的方法是通过它们的进程ID,所以可以使该模式的一部分。 更好的方法是通过在一个标识符通过命令行,并用它来让你的文件名。 这样,你控制文件被在某种意义上创建。 最后,如​​果您的应用程序,为什么它与所有其他不同的一些知识,比如它连接到特定的数据库服务器,那么你可以只使用该数据库服务器的名称作为文件名的一部分。

编辑:似乎没有被任何API来获取文件正在使用一个文件处理器的名字。 我建议寻找到在x4juli记录扩展(这口很多的log4j的功能到java.util.logging的规格):

  • http://www.x4juli.org/

你应该能够替换其的FileHandler其提供的getFile()方法的一个实例:

  • http://www.x4juli.org/api/org/x4juli/handlers/FileHandler.html

好吧,我不得不说的FileHandler没有提供一种方法来确定日志文件是严重哑巴。

彼时我写了一个名为“chooseFile()”,它会搜索/ tmp目录下一个可用的日志文件名,并返回该文件的功能。 然后,您可以通过该文件到新的FileHandler的名称()。

/**
* Utility: select a log file. File is created immediately to reserve
* its name.
*/
static public File chooseFile(final String basename) throws IOException {
final int nameLen = basename.length();
File tmpDir = new File(System.getProperty("java.io.tmpdir"));
String[] logs = tmpDir.list(new FilenameFilter() {
public boolean accept(File d, String f) {
return f.startsWith(basename);
}
});
int count = 0;
if (logs.length > 0) {
for (String name : logs) {
int n = atoi(name.substring(nameLen));
if (n >= count) count = n + 1;
}
}
String filename = String.format("%s%d.log", basename, count);
File logFile = new File(tmpDir, filename);
logFile.createNewFile();
return logFile;
}

其实,你可以通过继承的FileHandler自己做这个要简单得多。 例如...

MyFileHandler.java:

import java.io.IOException;
import java.util.logging.FileHandler;
public class MyFileHandler extends FileHandler {
protected String _MyFileHandler_Patern;
public MyFileHandler(String pattern) throws IOException {
_MyFileHandler_Patern = pattern;
}
public String getMyFileHandlerPattern() {
return _MyFileHandler_Patern;
}
}

DeleteMe.java:

import java.io.IOException;
import java.util.logging.Handler;
import java.util.logging.Logger;
public class DeleteMe {
public static void main(String[] args) throws IOException {
Logger log = Logger.getLogger(DeleteMe.class.getName());
MyFileHandler output = new MyFileHandler("output.log");
log.addHandler(output);
for (Handler handler : log.getHandlers()) {
if (handler instanceof MyFileHandler) {
MyFileHandler x = (MyFileHandler) handler;
if ("output.log".equals(x.getMyFileHandlerPattern())) {
System.out.println("found hanlder writing to output.log");
}
}
}
}
}

分类:java的 时间:2012-01-01 人气:1
本文关键词: 日志记录,JAVA
分享到:

相关文章

  • 如何启用日志记录在Java服务的单个用户在运行时 2012-04-12

    序言 - 我运行一个在线的Java应用程序(Tomcat-> Java的> MySQL的)作为SaaS(软件即服务). 这基本上是用户使用自己的手机,一旦用户通过验证数据传输情况连接到我们的服务/服务器移动性多功能服务. 该服务与应用服务器正在服务的负载平衡器的要求等在数据中心运行. 我们的应用程序的实时更新通过添加和删除服务器,通过分流负载均衡的要求,实际上并没有采取充分的服务向下发生. 方案 - 从日志中,我可以理解,至少有1万用户连接到服务所有的时间. 因此服用服务停机升级是不实际的.

  • Java的日志记录级别的困惑 2012-12-04

    我设置日志记录级别配置,但没有看到写在CONFIG级别的消息. 我很想念? 组态: Logger logger = java.util.logging.Logger.getLogger("xxx"); logger.setLevel(java.util.logging.Level.CONFIG); 测试: logger.log(java.util.logging.Level.SEVERE, "severe"); logger.log(java.util.loggin

  • 如何启用日志记录丝为Java HttpURLConnection的流量? 2012-12-30

    我使用的Jakarta Commons的HttpClient在另一个项目,我想在同一线路的日志输出,但使用"标准"的HttpURLConnection. 我用菲德勒作为代理,但我想直接从Java记录流量. 捕捉什么样的推移,连接输入和输出流是不够的,因为HTTP头信息并通过的HttpURLConnection类消费,所以我就不能登录了头. --------------解决方案------------- 据Sun公司的HttpURLConnection源存在通过JUL一些日志记录支持.

  • 如何使Java程序共享多个实例相同的日志记录的FileHandler? 2013-03-23

    我有作为运行在同一台服务器上的3个独立的进程的Java程序. 我想所有的进程共享一个日志文件,有没有指定的logging.properties文件的方法吗? 我使用的java.util.logging来处理记录. 目前,这就是我在我的logging.properties文件定义我的FileHandler: java.util.logging.FileHandler.pattern =%H /日志/ LOGFILE.LOG 这工作正常的程序的1个实例,但是,如果我试图启动该程序的结果是3个单独的实

  • 如何验证Java的日志记录属性文件? 2013-04-28

    我有一个基本的设施允许用户远程应用在我的应用程序更改日志文件. 有些日志是使用java.util.logging中的属性文件配置,以及一些正在使用的log4j / log4cplus风格的属性文件配置. 我想这样做的用户尝试应用性能的一些基本验证. 也就是说,我要保证以下几点: 每个logging.properties文件必须至少包含一个根记录器/日志记录级别 记录器/电平必须设置为一个有效的值. 也就是说,他们不应该能够设置.LEVEL =胡言乱语或类似的东西. 我可能会允许他们设置MAXFI

  • 禁用日志记录在Java的编译时 2013-07-23

    我有一些,我想仪器用于调试日志消息Java代码. 最终的(编译)生产代码,但是,不应该包含任何记录,因为它会降低的执行时间. 有没有办法在Java中禁用记录器在编译时? 我不怕足迹的运行时启用/禁用记录器将添加日志方法中的检查. if (logging==enabled) {// do logging} 但我想,以避免参数构造就像在我的生产代码如下: Logger.log("undefined state" + state + " @ " + new Date())

  • java的spring3注释BASEC控制器日志记录 2013-07-28

    我使用的Java与spring3我有以下控制器的服务方法 @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { } 我有以下的方法,进行日志记录每一个方法,我想打电话给每一个服务的方法这种方法 public void performLog(HttpServletRequest request){ //proce

  • 如何解决事务性日志记录在Java中? 2013-09-07

    我要实现以下目标: 内幕交易的我要生成多个日志消息. 这些日志信息,如果该交易被提交成功只写. 如果事务被回滚日志消息不能被记录. 我找不到任何东西来实现这一(使用春天,休眠,Atomikos公司),所以我写了这个小包装(我离开了几个方便的方法): public class TransactionLogger { private Logger logger; private Map<Long, LinkedList<LogRecord>> threadBuffers = new H

  • 如何禁用Java代码log4j的日志记录 2014-03-18

    我使用log4j的使用日志写入一个遗留库. 我默认的log4j.properties文件指示日志到控制台,但在我的主要程序的某些特定的功能,我想禁用(所有类)共记录. 我尝试这样做: Logger.getLogger(BasicImplementation.class.getName()).setLevel(Level.OFF); 其中"BasicImplementation"是,它记录了主要的类之一,但它没有工作 - 日志仍然写入控制台. 这里是我的log4j.properties:

  • 什么是与日志记录在Java中? 2014-05-29

    为什么人会使用以下的包,而不是其他呢? Java记录 共享记录 Log4j的 SLF4J 的logback --------------解决方案------------- 在API外观的时间顺序(据我所知): Log4j的,因为大多数每个人都使用它(在我的经验) 共享日志记录,因为开源项目使用它(这样他们就可以与任何日志框架采用的是集成的解决方案集成); 特别是有效的,如果你是一个API /框架/ OSS和你靠使用共享日志记录,包等. 共享日志记录,因为你不希望"锁定"到特定的日志框架

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.585 (s). 10 q(s)