Zapis do pliku logów

Zapis do pliku logów
A1
  • Rejestracja:ponad 15 lat
  • Ostatnio:około rok
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
PI
Nie wiem czy robienie operacji bitowych w javie ma duży sens xd
A1
No nie był to mój pomysł, producent analizatora tak wymyślił
jarekr000000
@Pinek why? bity w javie nie działają?
PI
@jarekr000000: Ojj no, wiesz o co mi chodzi xd http server też można postawić w C, ale po co.
jarekr000000
@Pinek nie wiem o co chodzi.
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
1
adam12112 napisał(a):

Po linii najmniejszego oporu:

Kopiuj
      // 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.


jeden i pół terabajta powinno wystarczyć każdemu

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.