我想在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");
}
}
}
答案 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
无论您的程序(递归或其他)运行多久,您的队列都将同时处理,您无需等待整个过程结束以开始记录。