Skip to content

Commit 2c7757c

Browse files
committed
Added noLogs feature, imporved exporter path location
1 parent d9694b7 commit 2c7757c

7 files changed

Lines changed: 212 additions & 17 deletions

File tree

app.log

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
2+
ARGS = []
3+
Elevated mode: false
4+
Controller initialized, appConfig = com.project.system_log_analyzer.config.appConfig@1156ebe3
5+
Application logs export : true
6+
LoadingBarFXController::initialize
7+
exported injected - exporting logs from backend
8+
Export successful: C:\Users\jakub\IdeaProjects\System Log Analyzer\logs\exported\exported\Application_20251123_154710.csv
9+
Logs list exported
10+
FileLoggerService: logsDir not set yet — skipping log.
11+
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException: Cannot invoke "java.io.File.length()" because "this.logFile" is null
12+
at com.project.system_log_analyzer.core.FileLoggerService.rotateLogsIfNeeded(FileLoggerService.java:192)
13+
at com.project.system_log_analyzer.core.FileLoggerService.saveParsedLogs(FileLoggerService.java:299)
14+
at com.project.system_log_analyzer.controller.MainWindowFXController.setData(MainWindowFXController.java:104)
15+
at com.project.system_log_analyzer.controller.LoadingBarFXController.lambda$initialize$0(LoadingBarFXController.java:79)
16+
at javafx.base@25-ea/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
17+
at javafx.base@25-ea/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:232)
18+
at javafx.base@25-ea/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:189)
19+
at javafx.base@25-ea/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
20+
at javafx.base@25-ea/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
21+
at javafx.base@25-ea/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
22+
at javafx.base@25-ea/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
23+
at javafx.base@25-ea/javafx.event.Event.fireEvent(Event.java:199)
24+
at javafx.graphics@25-ea/javafx.concurrent.EventHelper.fireEvent(EventHelper.java:219)
25+
at javafx.graphics@25-ea/javafx.concurrent.Task.fireEvent(Task.java:1321)
26+
at javafx.graphics@25-ea/javafx.concurrent.Task.setState(Task.java:724)
27+
at javafx.graphics@25-ea/javafx.concurrent.Task$TaskCallable.lambda$call$1(Task.java:1399)
28+
at javafx.graphics@25-ea/com.sun.javafx.application.PlatformImpl.lambda$runLater$4(PlatformImpl.java:419)
29+
at javafx.graphics@25-ea/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
30+
at javafx.graphics@25-ea/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
31+
at javafx.graphics@25-ea/com.sun.glass.ui.win.WinApplication.lambda$runLoop$0(WinApplication.java:168)
32+
at java.base/java.lang.Thread.run(Thread.java:1474)
33+
NoLogs = true → temporary directory removed.

src/main/java/com/project/system_log_analyzer/config/appConfig.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,24 @@ public class appConfig {
99
private boolean csvApplication;
1010
private boolean csvSystem;
1111
private boolean csvSecurity;
12+
private boolean noLogs;
13+
private boolean saveInExeDir;
14+
15+
public boolean isNoLogs() {
16+
return noLogs;
17+
}
18+
19+
public void setNoLogs(boolean noLogs) {
20+
this.noLogs = noLogs;
21+
}
22+
23+
public boolean isSaveInExeDir() {
24+
return saveInExeDir;
25+
}
26+
27+
public void setSaveInExeDir(boolean saveInExeDir) {
28+
this.saveInExeDir = saveInExeDir;
29+
}
1230

1331
public boolean isCsvSecurity() {
1432
return csvSecurity;

src/main/java/com/project/system_log_analyzer/controller/WelcomeViewFXController.java

Lines changed: 83 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ public class WelcomeViewFXController {
3131
@FXML private CheckBox systemButton;
3232
@FXML private CheckBox securityButton;
3333
@FXML private Label securityLabel;
34+
@FXML private Button logFilesDirButton;
35+
@FXML private Button reportDirButton;
36+
37+
@FXML private CheckBox noLogsBox;
38+
@FXML private CheckBox saveInAppDirectoryBox;
39+
3440

3541
@Autowired public appConfig appConfig;
3642

@@ -50,9 +56,11 @@ private void scan(ActionEvent event) throws IOException {
5056
String logDir = logFilesDirField.getText();
5157
String reportDir = reportDirField.getText();
5258

53-
if (logDir.isEmpty() || reportDir.isEmpty()) {
54-
informationLabel.setText("Please select both directories.");
55-
return;
59+
if (!noLogsBox.isSelected()) {
60+
if (logDir.isEmpty() || reportDir.isEmpty()) {
61+
informationLabel.setText("Please select both directories.");
62+
return;
63+
}
5664
}
5765

5866
if (!appButton.isSelected() && !systemButton.isSelected() && !securityButton.isSelected()) {
@@ -146,4 +154,76 @@ private boolean askForSecurityPermission() {
146154

147155
return alert.showAndWait().filter(btn -> btn == ButtonType.OK).isPresent();
148156
}
157+
@FXML
158+
private void noLogsBoxOn(ActionEvent event) throws IOException {
159+
if (noLogsBox.isSelected()) {
160+
appConfig.setNoLogs(true);
161+
162+
appConfig.setSaveInExeDir(false);
163+
saveInAppDirectoryBox.setSelected(false);
164+
saveInAppDirectoryBox.setDisable(true);
165+
166+
logFilesDirButton.setDisable(true);
167+
reportDirButton.setDisable(true);
168+
169+
logFilesDirField.clear();
170+
reportDirField.clear();
171+
172+
appConfig.setLogsDir(null);
173+
appConfig.setReportDir(null);
174+
175+
} else {
176+
appConfig.setNoLogs(false);
177+
saveInAppDirectoryBox.setDisable(false);
178+
179+
if (appConfig.isSaveInExeDir()) {
180+
String baseDir = System.getProperty("user.dir");
181+
String logs = baseDir + "/logs";
182+
String reports = baseDir + "/reports";
183+
184+
appConfig.setSaveInExeDir(true);
185+
appConfig.setLogsDir(logs);
186+
appConfig.setReportDir(reports);
187+
188+
logFilesDirField.setText(logs);
189+
reportDirField.setText(reports);
190+
191+
logFilesDirButton.setDisable(true);
192+
reportDirButton.setDisable(true);
193+
194+
} else {
195+
logFilesDirButton.setDisable(false);
196+
reportDirButton.setDisable(false);
197+
}
198+
}
199+
}
200+
@FXML
201+
private void saveInAppDirectoryBoxOn(ActionEvent event) throws IOException {
202+
if (saveInAppDirectoryBox.isSelected()) {
203+
appConfig.setSaveInExeDir(true);
204+
205+
String baseDir = System.getProperty("user.dir");
206+
String logs = baseDir + "/logs";
207+
String reports = baseDir + "/reports";
208+
209+
logFilesDirField.setText(logs);
210+
reportDirField.setText(reports);
211+
212+
logFilesDirButton.setDisable(true);
213+
reportDirButton.setDisable(true);
214+
215+
new File(logs).mkdirs();
216+
new File(reports).mkdirs();
217+
218+
appConfig.setLogsDir(logs);
219+
appConfig.setReportDir(reports);
220+
221+
} else {
222+
appConfig.setSaveInExeDir(false);
223+
224+
logFilesDirButton.setDisable(false);
225+
reportDirButton.setDisable(false);
226+
227+
}
228+
}
149229
}

src/main/java/com/project/system_log_analyzer/core/FileLoggerService.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,23 @@ private void ensureLogFile() {
5757

5858
if (logsDir == null) {
5959
String path = config.getLogsDir();
60-
if (path == null) {
61-
System.out.println("FileLoggerService: logsDir not set yet — skipping log.");
62-
return; //
60+
61+
if (path == null || path.isBlank()) {
62+
63+
String baseDir = System.getProperty("user.dir");
64+
path = baseDir + "/temp_";
65+
66+
new File(path).mkdirs();
67+
68+
config.setLogsDir(path);
69+
config.setReportDir(path);
70+
71+
System.out.println("FileLoggerService: Using TEMP directory for logs: " + path);
6372
}
6473

6574
logsDir = new File(path);
6675
if (!logsDir.exists()) logsDir.mkdirs();
76+
6777
logFile = new File(logsDir, "log_" + nOfLogPart + ".log");
6878
createLogFileIfMissing();
6979
}

src/main/java/com/project/system_log_analyzer/io/WindowsEventExporter.java

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,18 @@ public WindowsEventExporter(appConfig config) {
4242

4343
public Path exportToCsv(LogType type) { // Method responsible for exporting logs from windows
4444
try {
45-
String baseDir = config.getLogsDir() != null && !config.getLogsDir().isEmpty()
46-
? config.getLogsDir() : "logs/exported";
45+
String baseDir;
46+
if (config.getLogsDir() == null || config.getLogsDir().isBlank()) {
47+
baseDir = System.getProperty("user.dir") + "/temp_";
48+
} else {
49+
baseDir = config.getLogsDir();
50+
}
4751

48-
File dir = new File(baseDir, "exported");
49-
if (!dir.exists()) dir.mkdirs();
52+
File exportedDir = new File(baseDir, "exported");
53+
if (!exportedDir.exists()) exportedDir.mkdirs();
5054

5155
String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss"));
52-
Path outputFile = Path.of(dir.getAbsolutePath(), type.getLogName() + "_" + timestamp + ".csv");
56+
Path outputFile = Path.of(exportedDir.getAbsolutePath(), "Security_" + timestamp + ".csv");
5357

5458
// Powershell command
5559
String command = String.format(
@@ -80,14 +84,18 @@ public Path exportToCsv(LogType type) { // Method responsible for exporting logs
8084

8185
public Path exportSecurityLogsAsAdmin() {
8286
try {
83-
String baseDir = config.getLogsDir() != null && !config.getLogsDir().isEmpty()
84-
? config.getLogsDir() : "logs/exported";
87+
String baseDir;
88+
if (config.getLogsDir() == null || config.getLogsDir().isBlank()) {
89+
baseDir = System.getProperty("user.dir") + "/temp_";
90+
} else {
91+
baseDir = config.getLogsDir();
92+
}
8593

86-
File dir = new File(baseDir, "exported");
87-
if (!dir.exists()) dir.mkdirs();
94+
File exportedDir = new File(baseDir, "exported");
95+
if (!exportedDir.exists()) exportedDir.mkdirs();
8896

8997
String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss"));
90-
Path outputFile = Path.of(dir.getAbsolutePath(), "Security_" + timestamp + ".csv");
98+
Path outputFile = Path.of(exportedDir.getAbsolutePath(), "Security_" + timestamp + ".csv");
9199

92100
String ps =
93101
"Get-WinEvent -LogName Security -MaxEvents 15000 | " +

src/main/java/com/project/system_log_analyzer/system/AppShutdownHandler.java

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,33 @@
11
package com.project.system_log_analyzer.system;
22

33
import com.project.system_log_analyzer.config.SpringConfig;
4+
import com.project.system_log_analyzer.config.appConfig;
45
import com.project.system_log_analyzer.core.FileLoggerService;
56
import com.project.system_log_analyzer.core.FileReportExporter;
67
import org.springframework.beans.factory.annotation.Autowired;
78
import org.springframework.context.event.ContextClosedEvent;
89
import org.springframework.context.event.EventListener;
910
import org.springframework.stereotype.Component;
1011

12+
import java.io.File;
13+
import java.io.IOException;
14+
import java.nio.file.Files;
15+
import java.nio.file.Path;
16+
import java.nio.file.Paths;
17+
import java.util.Comparator;
18+
1119
@Component
1220
public class AppShutdownHandler {
1321

1422
private FileLoggerService fileLoggerService;
1523
private FileReportExporter reportExporter;
24+
private appConfig appConfig;
1625

1726
@Autowired
18-
public AppShutdownHandler(FileLoggerService fileLoggerService, FileReportExporter reportExporter) {
27+
public AppShutdownHandler(FileLoggerService fileLoggerService, FileReportExporter reportExporter, appConfig config) {
1928
this.fileLoggerService = fileLoggerService;
2029
this.reportExporter = reportExporter;
30+
this.appConfig = config;
2131
}
2232

2333
@EventListener(ContextClosedEvent.class)
@@ -27,6 +37,21 @@ public void onShutdown() {
2737
return;
2838
}
2939

40+
if (appConfig.isNoLogs()) {
41+
Path dir = Paths.get(appConfig.getLogsDir());
42+
43+
try {
44+
if (Files.exists(dir)) {
45+
deleteDirectoryRecursively(dir);
46+
System.out.println("NoLogs = true → temporary directory removed.");
47+
}
48+
} catch (Exception e) {
49+
System.err.println("Failed to delete temp directory: " + e.getMessage());
50+
}
51+
52+
return;
53+
}
54+
3055
try {
3156
System.out.println("AppShutdownHandler - Application is shutting down! Flushing logs and exporting report...");
3257
fileLoggerService.flushLogToMainFile();
@@ -36,5 +61,17 @@ public void onShutdown() {
3661
e.printStackTrace();
3762
}
3863
}
64+
// Method for correct deletion of temp files when noLogs is selected
65+
private void deleteDirectoryRecursively(Path path) throws IOException {
66+
if (!Files.exists(path)) return;
67+
68+
Files.walk(path)
69+
.sorted(Comparator.reverseOrder())
70+
.forEach(p -> {
71+
try {
72+
Files.deleteIfExists(p);
73+
} catch (IOException ignored) {}
74+
});
75+
}
3976

4077
}

src/main/resources/view/WelcomeView.fxml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,15 @@
3838
<Font size="18.0" />
3939
</font>
4040
</CheckBox>
41+
<CheckBox fx:id="noLogsBox"
42+
layoutX="480" layoutY="300"
43+
text="Don't save logs/reports"
44+
onAction="#noLogsBoxOn"/>
45+
46+
<CheckBox fx:id="saveInAppDirectoryBox"
47+
layoutX="250" layoutY="300"
48+
text="Save logs/reports in app folder"
49+
onAction="#saveInAppDirectoryBoxOn"/>
4150
<CheckBox fx:id="systemButton" layoutX="359.0" layoutY="340.0" mnemonicParsing="false" onAction="#systemButtonON" prefHeight="45.0" prefWidth="150.0" text="System Logs" textAlignment="CENTER">
4251
<font>
4352
<Font size="18.0" />

0 commit comments

Comments
 (0)