如何每10秒记录一次我的程序

时间:2017-07-23 16:04:17

标签: java file logging timer

嗨我有一个从服务器打印无限随机文本的程序 在一个循环中,不会停止 ,如何在文本文件中每10秒记录一次数据?

public class MyServer {
public static String str="";
private volatile boolean running=true;
public synchronized void  socketreceive(){
    try{
        ServerSocket ss=new ServerSocket(6666);
        Socket s=ss.accept();//establishes connection
        DataInputStream dis=new DataInputStream(s.getInputStream());
        str=(String)dis.readUTF();


       //this  continuously goes on  and I need to make a log from it
        System.out.println("message= "+str);


        ss.close();
    }catch(Exception e){}
}

public void receiver(){
 final Thread receive=new Thread(new Runnable() {
    @Override
    public void run() {
        while (running){
            socketreceive();
    }
    }

});

3 个答案:

答案 0 :(得分:1)

我有一个方便的计时器用于这种情况的例子。唯一的缺点是它是一个“摇摆”的摇摆乐。在你的情况下,它可能是一个重量级的计时器。但是它有效。我添加了一些用于读写的骨架函数,可能会为您提供一些想法。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Timer;

public class TimedLogger {

    List<String>  strings;

    public mySocketReader() {
       ....
       String line = str=(String)dis.readUTF();
       storeLine(line);
       ..
     }

    synchronized void storeLine(String line) {
        strings.add(line);
    }
    synchronized void writeLines() {
       for(String s: strings)
           writeInFile(s);
       strings.clear();
    }

    Timer      timer = new Timer(10000, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            writeLines();
        }
     });
}

因此,读者会将您的行保存在列表中。当有中断时,编写器会将这些行写入文件中。由于函数是synchronized,因此它们不能同时执行,不能同时执行并同时修改列表。唯一的缺点是,当写入一个时,您不能在列表中添加任何新行。在写完成之前,你无法有效地阅读下一行。

您需要拥有2个(或更多列表)并使用synchronized函数来更改指向它们的指针。

答案 1 :(得分:0)

您可以添加if-statement来检查当前时间和上次记录时间之间的差异,如果其>= 10秒然后启动编写器线程。例如:

public void run() {
        Date dt = new Date();
        DateFormat df = new SimpleDateFormat("ss");
        while (running){
            Date tmp = new Date();
            if (Integer.parseInt(df.format(tmp)) - Integer.parseInt(df.format(dt)) >= 10)
                // start your writer thread
                dt = tmp
            socketreceive();
    }

答案 2 :(得分:0)

这是如何实现可能的解决方案的示例,在此示例中,程序使用Queue来存储来自多个套接字写入器的值。

Queue<String> logValues = new LinkedList<>();
   public synchronized void log(String value) {
    logValues.add(value);
}

Queue在一个名为BufferLogger的类中,它实现了一个Runnable并等待10秒来获取Queue的当前大小,具体取决于它继续使用从0循环到队列大小的for循环的大小并从队列中调用poll方法以获取最新元素并将该元素发送到日志文件,就像FIFO方法一样。

@Override
public void run() {

    int timeToSave = 10000; //10 seconds
    System.out.printf("Running Program Logger, log files every %d miliseconds. %s%n", timeToSave, new Date().toString());

    while (!Thread.currentThread().isInterrupted()) {
        try {

            Thread.sleep(timeToSave);
            this.writeToFile();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}


public void writeToFile() {
    Date date = new Date();
    File myLog = new File(String.format(filename));
    FileWriter myLogWritter = null;
    try {
        myLogWritter = new FileWriter(myLog, true);

        int queueSize = logValues.size();
        myLogWritter.write(String.format("Sending data to log!. Current Log Queue Size: %d.  Time:%s%n", queueSize, date.toString()));
        System.out.printf("Sending data to log!. Current Log Queue Size: %d.  Time:%s.  Filename:%s%n", queueSize, date.toString(), myLog.getName());

        for (int i = 0; i < queueSize; i++) {
            myLogWritter.write(String.format("%s Logging Value: %s%n", date.toString(), logValues.poll()));
        }

    }

我正在分享完整的代码以获取更多信息,希望这会有所帮助:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;


public class ProgramLogger {

    static final int serverPort = 9999;

    public static void main(String args[]) {
        ServerSocket serverSocket = null;
        BufferLogger bufferLogger = new BufferLogger();
        new Thread(bufferLogger).start();
        Socket socket = null;

        try {
            serverSocket = new ServerSocket(serverPort);
            new ClientSender().start(); //client 1
            new ClientSender().start(); //client 2
            new ClientSender().start(); //client 3
            new ClientSender().start(); //client 4
        } catch (IOException e) {
            e.printStackTrace();

        }
        while (true) {
            try {
                socket = serverSocket.accept();
            } catch (IOException e) {
                e.printStackTrace();
            }

            new ServerReceptor(socket, bufferLogger).start();
        }
    }

}


class ClientSender extends Thread {
    Socket socket;
    PrintWriter out;
    String serverAddress="localhost";
    int serverPort=9999;
    Random randomValue = new Random();

    public void run() {
        try {
            System.out.println("Sarting Client Sender on Thread " + Thread.currentThread().toString());
            socket = new Socket(serverAddress, serverPort);
            out = out == null ? new PrintWriter(socket.getOutputStream(), true) : out;
            while (!Thread.currentThread().isInterrupted()) {

                out.println(Thread.currentThread().toString() + " - " +  randomValue.nextInt(8000));
                Thread.sleep(randomValue.nextInt(800));

            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

}

class ServerReceptor extends Thread {
    protected Socket socket;
    private BufferLogger bufferLogger;

    public ServerReceptor(Socket clientSocket, BufferLogger bufferLogger) {
        this.socket = clientSocket;
        this.bufferLogger = bufferLogger;
    }

    public void run() {
        System.out.println("Sarting Server Receptor on Thread " + Thread.currentThread().toString());
        InputStream inputStream = null;
        BufferedReader bufferedReader = null;
        DataOutputStream dataOutputStream = null;
        try {
            inputStream = socket.getInputStream();
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

        } catch (IOException e) {
            return;
        }
        String line;
        while (true) {
            try {
                line = bufferedReader.readLine();
                if (line != null) {
                    bufferLogger.log(line);
                }

            } catch (IOException e) {
                e.printStackTrace();
                return;
            }
        }
    }
}

class BufferLogger implements Runnable {

    Queue<String> logValues = new LinkedList<>();
    Date dateOfCreation = new Date();
    String filename = String.format("myapplog%d.log", dateOfCreation.getTime());

    public synchronized void log(String value) {
        logValues.add(value);
    }

    public void writeToFile() {
        Date date = new Date();
        File myLog = new File(String.format(filename));
        FileWriter myLogWritter = null;
        try {
            myLogWritter = new FileWriter(myLog, true);

            int queueSize = logValues.size();
            myLogWritter.write(String.format("Sending data to log!. Current Log Queue Size: %d.  Time:%s%n", queueSize, date.toString()));
            System.out.printf("Sending data to log!. Current Log Queue Size: %d.  Time:%s.  Filename:%s%n", queueSize, date.toString(), myLog.getName());

            for (int i = 0; i < queueSize; i++) {
                myLogWritter.write(String.format("%s Logging Value: %s%n", date.toString(), logValues.poll()));
            }

        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                myLogWritter.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }

        }

    }

    @Override
    public void run() {

        int timeToSave = 10000; //10 seconds
        System.out.printf("Running Program Logger, log files every %d miliseconds. %s%n", timeToSave, new Date().toString());

        while (!Thread.currentThread().isInterrupted()) {
            try {

                Thread.sleep(timeToSave);
                this.writeToFile();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}