如何在下面的代码中的日志中附加一些字符串

时间:2013-04-10 12:13:51

标签: java logging buffer

我想在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");
        }
    }
} 

3 个答案:

答案 0 :(得分:1)

首先在POM中添加log4j的依赖关系,对于行下面的副本,

<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" );

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

答案 1 :(得分: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);
        }
    }
}    

答案 2 :(得分:0)

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

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

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

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