0

我想在java代码中记录。而且,整个过程需要几个小时才能完成。但是我的代码在执行结束时记录了所有日志,因为缓冲区在最后关闭。

有什么方法可以附加到日志文件中吗?

请查看我的代码,并提出一些必要的更改。提前致谢。

我的代码

public class test {

    public static void func(String url1, String url2, BufferedWriter bw) throws  InterruptedException, IOException {
        long loading_time = 10878;
        long parsing_time = 120;
        long processing_time = 329;
        Thread.sleep(100000000);  // Here is some process that performs recursively
        bw.write( url1 + "\n" + url2 + "\n"+ ((double)loading_time)/((double)1000)+ " seconds   " + ((double)parsing_time)/((double)1000) +  " seconds   "  + ((double)processing_time)/((double)1000) + " seconds\n\n\n\n" );
    }

    public static void main(String[] args) throws IOException, InterruptedException{
        try {
            FileWriter fw = new FileWriter("C:\\Users\\jhamb\\Desktop\\log.txt");
            BufferedWriter bw = new BufferedWriter(fw);
            for(int i = 0; i < 5; i++) { func("hitesh", "jhamb", bw);  }
            bw.close();
        } catch (Exception e) {
            System.out.println("Sorry some problem");
        }
    }
} 
4

3 回答 3

1

log4j首先在 POM 中添加对以下行的副本的依赖项,

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

然后,制作一个文件log.properties并将这些行复制到该位置<PROJECT FOLDER>\src\main\resources\

# Define the root logger with appender file
log4j.rootLogger = INFO, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=C:/Users/jhamb/Desktop/log.txt

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n 

然后,在主类中添加一行,

static Logger log = Logger.getLogger( Scroll_down.class.getName() );

在这里,Scroll_down 是我项目中的类名。

现在您可以使用

log.info( <PUT STRING HERE> )

在我上面的例子中,

log.info( url1 + "\n" + url2 + "\n"+ ((double)loading_time)/((double)1000)+ " seconds   " + ((double)parsing_time)/((double)1000) +  " seconds   "  + ((double)processing_time)/((double)1000) + " seconds\n\n\n\n" );

这些是我为满足上述问题的要求而遵循的步骤。

于 2013-04-14T09:09:30.503 回答
0

您应该使用日志框架来记录而不是编写自己的文件 看看SL4J

这是来自他们网站的 Hello World 示例:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld {
  public static void main(String[] args) {
    Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    logger.info("Hello World");
  }
}

无论你在哪里调用 bw.write(),都可以根据具体情况替换为 logger.info()、logger.warn() logger.error() 等。

这将输出到控制台。您将不得不使用配置来表明您需要这是一个文件。我把它留给你:-)

编辑:

你的代码,一旦你使用 sl4j 将是:

public class Test {
    Logger logger = LoggerFactory.getLogger(Test.class);
    public static void func(String url1, String url2, BufferedWriter bw) throws  InterruptedException, IOException {
        //your code
        logger.info(" {} \n {} \n  {} seconds   {} seconds   {}  seconds\n\n\n\n",url1,url2 ,((double)loading_time)/((double)1000),((double)parsing_time)/((double)1000), ((double)processing_time)/((double)1000) );

    }

    public static void main(String[] args) throws IOException, InterruptedException{
        try {
               //
        } catch (Exception e) {
                logger.error("Sorry some problem",e);
        }
    }
}    
于 2013-04-10T12:20:41.387 回答
0

我建议您使用阻塞队列来存储您的日志任务。只要您有要记录的内容,就创建一个日志对象并存储在队列中。(简单的字符串也足够了)

一个单独的线程应该同时处理您的队列。

有关实施细节,请查看:http ://www.javamex.com/tutorials/blockingqueue_example.shtml

无论您的过程(递归或其他方式)运行多长时间,您的队列都将同时处理,您无需等待整个过程结束即可开始记录。

于 2013-04-10T12:23:47.047 回答