Zastanawiałem się, czy ktoś może mi w tej sprawie pomóc. Mój obecny kod jest skonfigurowany, aby korzystać z Loggera w java.util.logging, zapisujemy dziennik do pojedynczego pliku, a gdy potrzebujemy dostępu do dziennika, po prostu czytamy plik.

    String filename = name + ".log";
    Logger logger = Logger.getLogger(name);
    logger.setLevel(Level.ALL);
    final FileHandler fileHandler = new FileHandler(filename, true);
    final SimpleFormatter formatter = new LogFormatter();
    fileHandler.setFormatter(formatter);
    logger.addHandler(fileHandler);

Zawartość dziennika jest następnie pozyskiwana przez

    Files.readAllLines(Paths.get(filename));

Wystąpił problem polegający na tym, że rozmiar pliku może stać się zbyt duży, dlatego chcę go ograniczyć. Czytając dokumentację, mogę wykonać następujące czynności

    final FileHandler fileHandler = new FileHandler(filename, 1000000, 3, true);

Spowoduje to utworzenie do trzech plików o wielkości 1 MB, przechodząc cyklicznie po zapełnieniu trzeciego, usuwając pierwszy plik i zapisując stamtąd ponownie. To idealne rozwiązanie, ale wiąże się z dwoma problemami, których nie jestem pewien, jak je rozwiązać.

Po pierwsze, czy istnieje łatwy sposób na znalezienie nazwy wszystkich utworzonych plików? (Dokładniej, czy jest na to łatwy sposób? Doceniam, że mogę po prostu wyszukać nazwę pliku.0, nazwa_pliku.1 ... do granic możliwości).

Po drugie, jak sprawdzić, który plik jest „aktywny”. Przykład. Powiedzmy, że jeden cykl został już zakończony i istnieją trzy pliki („plik.0”, „plik.1”, „plik.2”). Jeśli rejestrator aktualnie zapisuje do pliku.1, jak to określić, więc kiedy tworzę dziennik jako Lista, początek dziennika jest najstarszą zawartością (w tym przykładzie plik.2)

Dziękuję za odpowiedź.

0
John Duskin 26 marzec 2020, 16:37

2 odpowiedzi

Najlepsza odpowiedź

Okej, opracowałem rozwiązanie, które jest na tyle proste, że jestem z niego wystarczająco zadowolony. Jak wspomniał jmehrens, nie ma bezpośredniego sposobu, ale pomyślałem, że opublikuję to tutaj, na wypadek, gdyby ktoś inny miał ten sam problem.

String filename = name + ".log";
// To make life easy create a directory to output logs into
final File directory = new File("log");
directory.mkdir();

// Create a java.io.FileFilter object to filter only the files I am looking for 
// ignoring the locked file (this answers my first question)
FileFilter filter = (pathname) -> {
        final String name = pathname.getName();
        return name.contains(filename) && !name.endsWith(".lck");
    };

// Uses the filter to find all files in the directory associated with 
// the log and deletes them
Arrays.asList(directory.listFiles(filter)).forEach(file -> file.delete());

// Create logger as before 
logger = Logger.getLogger(name);
logger.setLevel(Level.ALL);
final FileHandler fileHandler = new FileHandler("log/" + filename, limit, 
numberOfFiles, true);
final SimpleFormatter formatter = new LogFormatter();
fileHandler.setFormatter(formatter);
logger.addHandler(fileHandler);

Uzyskanie danych wyjściowych z dzienników polega następnie na użyciu tego samego filtru we wcześniej określonym katalogu. Sortowanie według daty ostatniej modyfikacji, a następnie czytanie wszystkich wierszy.

final List<File> logFiles = Arrays.asList(directory.listFiles(filter));
logFiles.sort((file0, file1) -> {
    final Long date1 = file0.lastModified();
    final Long date2 = file1.lastModified();
    return date1.compareTo(date2);
});
// Iterate through logFiles and read the lines
0
John Duskin 26 marzec 2020, 15:25

Po pierwsze, czy istnieje łatwy sposób na znalezienie nazwy wszystkich utworzonych plików? (Dokładniej, czy jest na to łatwy sposób? Doceniam, że mogę po prostu wyszukać nazwę pliku.0, nazwa_pliku.1 ... do granic możliwości).

Nie, ale złożono wnioski o udzielenie informacji o tym fakcie. Widzieć: Jak wyświetlić nazwę bieżącego pliku dziennika java.util.logging.Logger?

Po drugie, jak sprawdzić, który plik jest „aktywny”. Przykład. Powiedzmy, że jeden cykl został już zakończony i istnieją trzy pliki („plik.0”, „plik.1”, „plik.2”). Jeśli rejestrator aktualnie zapisuje do pliku.1, jak to określić, więc kiedy tworzę dziennik jako Lista, początek dziennika jest najstarszą zawartością (w tym przykładzie plik.2)

Zgodnie z kod źródłowy dla FileHandler :: rotate, pliki dziennika są obracane w dół i upuszczane od końca. Dlatego pozycja zero jest zawsze aktywnym plikiem.

1
jmehrens 26 marzec 2020, 15:08