Zapis do pliku logów

0

Nie umiem sobie poradzić z dodaniem zapisu logów do pliku , bardzo rzadko używam java a chciałbym wykorzystać istniejący projekt na moje potrzeby. Jak przy takim zapisie zrobić z tego String albo tablicę bajtów by można było zapisywać do pliku to co wyświetlane jest na konsoli.

      // Add a listener to the model to observe the LIN frames on the bus
        // Here you can listen the messages from the LIN bus, includding those transmitted by the tool
        initdll.getModel().readLINFrames.addListener(new ListChangeListener<LINWorkingFrame>() {
            @Override

            public void onChanged(ListChangeListener.Change<? extends LINWorkingFrame> c) {
                if(c.next()) {
                    // Log LIN Frame information on the console

                    Formatter formatterFrameData = new Formatter();
                    for (byte b : c.getAddedSubList().get(0).FrameInfo.FrameData) {
                       formatterFrameData.format("%02X ", b);
                    }
                            

                    Logger.getGlobal().info( String.format(
                        "Timestamp: %f  Baud: %d  PID(ID): %02X(%02X)  Length: %d  Data&Checksum: %s  Error: %d", 
                          c.getAddedSubList().get(0).FrameInfo.time,                // timestamp
                          (0xFFFF & c.getAddedSubList().get(0).FrameInfo.baud ),    // baudrate
                          (0xFF & c.getAddedSubList().get(0).FrameInfo.FrameID ),   // frame PID
                          (0x3F & c.getAddedSubList().get(0).FrameInfo.FrameID ),   // frame ID
                          (0xFF & c.getAddedSubList().get(0).FrameInfo.bytecount ), // length (including checksum)
                          formatterFrameData.toString(),                            // data bytes & checksum
                          (0xFFFF & c.getAddedSubList().get(0).FrameInfo.m_OnReceive_error ) // 0=No Error;      1=Bus Time-out Error;  3=Timer Error; 
                                                              // 4=Status Error;  5=Event Marker Error;  6=Next Frame Header Received Error
                        ));
                }    
            }
        });
             

        // Library Initialization
        initdll.startReadContinuos();   // Start the LIN continuous read process
1
adam12112 napisał(a):

Po linii najmniejszego oporu:

      // Add a listener to the model to observe the LIN frames on the bus
        // Here you can listen the messages from the LIN bus, includding those transmitted by the tool
        initdll.getModel().readLINFrames.addListener(new ListChangeListener<LINWorkingFrame>() {

            PrintWriter outputFile = new PrintWriter ("file.txt"); //otwieramy plik
            @Override

            public void onChanged(ListChangeListener.Change<? extends LINWorkingFrame> c) {
                if(c.next()) {
                    // Log LIN Frame information on the console

                    Formatter formatterFrameData = new Formatter();
                    for (byte b : c.getAddedSubList().get(0).FrameInfo.FrameData) {
                       formatterFrameData.format("%02X ", b);
                    }
                            
                    String logLine = String.format(
                        "Timestamp: %f  Baud: %d  PID(ID): %02X(%02X)  Length: %d  Data&Checksum: %s  Error: %d", 
                          c.getAddedSubList().get(0).FrameInfo.time,                // timestamp
                          (0xFFFF & c.getAddedSubList().get(0).FrameInfo.baud ),    // baudrate
                          (0xFF & c.getAddedSubList().get(0).FrameInfo.FrameID ),   // frame PID
                          (0x3F & c.getAddedSubList().get(0).FrameInfo.FrameID ),   // frame ID
                          (0xFF & c.getAddedSubList().get(0).FrameInfo.bytecount ), // length (including checksum)
                          formatterFrameData.toString(),                            // data bytes & checksum
                          (0xFFFF & c.getAddedSubList().get(0).FrameInfo.m_OnReceive_error ) // 0=No Error;      1=Bus Time-out Error;  3=Timer Error; 
                                                              // 4=Status Error;  5=Event Marker Error;  6=Next Frame Header Received Error
                        );
                    Logger.getGlobal().info(logLine);
                    outputFile.println(logLine); //tu wrzucamy linię
                    outputFile.flush(); //opcjonalnie - to spowalnie program, ale faktycznie wymusza zapis (inaczej może minąć chwilka zanim się pojawi w pliku
                    
                }    
            }
        });
             

        // Library Initialization
        initdll.startReadContinuos();   // Start the LIN continuous read process

Lekki problem powyższego rozwiązania to brak zamknięcia outputFile ( outputFile.close()). Jeśli to krótki programik to nie ma problemu. Jeśli to kod wywoływany na serwerze często (jako całość) to możesz napotkać probkem typu too many open files itp. Ale nie sądze w tym przypadku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1