Skip to content

Commit a4e2053

Browse files
Replace Logging with spdlog library for log rotation and better file system logging (#42)
* WIP replacing logging with spdlog library * added ringbuffer sink for debug overlay * set logging level to debug * Set custom log patterns for spdlog
1 parent 98d0bda commit a4e2053

25 files changed

+134
-294
lines changed

CMakeLists.txt

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ OPTION (SERVED_BUILD_TESTS "Build served unit test suite" OFF)
4343
OPTION (SERVED_BUILD_EXAMPLES "Build served examples" OFF)
4444
add_subdirectory(dependencies/served)
4545

46+
add_subdirectory(dependencies/spdlog)
47+
4648
if(USE_SPI)
4749
message("We have wiring pi!")
4850

@@ -51,30 +53,43 @@ else()
5153
message("We don't have wiring pi!")
5254
endif()
5355

54-
add_executable(self_o_mat.app src/main.cpp src/logic/BoothLogic.cpp src/logic/BoothLogic.h src/ui/BoothGui.cpp src/ui/BoothGui.h
55-
src/camera/ICamera.h src/camera/OpenCVCamera.cpp src/camera/OpenCVCamera.h src/camera/GphotoCamera.cpp src/camera/GphotoCamera.h
56-
src/ui/FPSCounter.h src/camera/NopCamera.h src/logic/ImageProcessor.cpp src/logic/ImageProcessor.h src/ui/IGui.h src/tools/ILogger.h
57-
src/tools/ConsoleLogger.cpp src/tools/ConsoleLogger.h src/tools/buffers.h src/tools/buffers.cpp src/tools/imageinfo.h src/logic/PrinterManager.cpp
58-
src/logic/PrinterManager.h src/api/BoothApi.h src/api/BoothApi.cpp src/protobuf/api.pb.cc src/protobuf/api.pb.h src/ui/NopGui.cpp
59-
src/ui/NopGui.h src/tools/JpegDecoder.cpp src/tools/JpegDecoder.h src/tools/verbose.h src/tools/blocking_reader.h
60-
src/camera/controllers/BaseController.h src/camera/controllers/TriggerController.cpp src/camera/controllers/NikonViewfinderController.h
61-
src/camera/controllers/TriggerController.h src/camera/controllers/BaseController.cpp src/camera/controllers/FocusController.cpp
62-
src/camera/controllers/FocusController.h src/camera/controllers/InfoController.cpp src/camera/controllers/InfoController.h
63-
src/camera/controllers/ApertureController.h src/camera/controllers/ExposureCorrectionController.h src/camera/controllers/ChoiceRangeController.cpp
64-
src/camera/controllers/ChoiceRangeController.h src/tools/readfile.h src/tools/readfile.cpp src/tools/cobs.h src/tools/cobs.cpp src/logic/SelfomatController.cpp src/logic/SelfomatController.h src/logic/filters/IImageFilter.h src/logic/filters/BasicImageFilter.cpp src/logic/filters/BasicImageFilter.h src/logic/filters/IImageFilter.cpp src/tools/FilesystemLogger.cpp src/tools/FilesystemLogger.h src/tools/verbose.cpp)
65-
66-
67-
68-
target_link_libraries(self_o_mat.app ${Boost_LIBRARIES})
69-
target_link_libraries(self_o_mat.app gphoto2 gphoto2_port)
70-
target_link_libraries(self_o_mat.app turbojpeg)
71-
target_link_libraries(self_o_mat.app sfml-system)
72-
target_link_libraries(self_o_mat.app sfml-graphics)
73-
target_link_libraries(self_o_mat.app sfml-window)
74-
target_link_libraries(self_o_mat.app ${OpenCV_LIBS})
75-
target_link_libraries(self_o_mat.app ${CUPS_LIBRARIES})
76-
target_link_libraries(self_o_mat.app served)
77-
target_link_libraries(self_o_mat.app protobuf)
56+
add_executable(self_o_mat.app
57+
src/main.cpp
58+
src/logic/BoothLogic.cpp
59+
src/ui/BoothGui.cpp
60+
src/camera/OpenCVCamera.cpp
61+
src/camera/GphotoCamera.cpp
62+
src/logic/ImageProcessor.cpp
63+
src/tools/buffers.cpp
64+
src/logic/PrinterManager.cpp
65+
src/api/BoothApi.cpp src/protobuf/api.pb.cc
66+
src/ui/NopGui.cpp
67+
src/tools/JpegDecoder.cpp
68+
src/camera/controllers/TriggerController.cpp
69+
src/camera/controllers/BaseController.cpp src/camera/controllers/FocusController.cpp
70+
src/camera/controllers/InfoController.cpp
71+
src/camera/controllers/ChoiceRangeController.cpp
72+
src/tools/readfile.cpp
73+
src/tools/cobs.cpp src/logic/SelfomatController.cpp
74+
src/logic/filters/BasicImageFilter.cpp
75+
src/logic/filters/IImageFilter.cpp
76+
src/tools/verbose.cpp)
77+
78+
79+
80+
target_link_libraries(self_o_mat.app ${Boost_LIBRARIES}
81+
gphoto2
82+
gphoto2_port
83+
turbojpeg
84+
sfml-system
85+
sfml-graphics
86+
sfml-window
87+
${OpenCV_LIBS}
88+
${CUPS_LIBRARIES}
89+
served
90+
protobuf
91+
spdlog::spdlog
92+
)
7893

7994
add_executable(filter_test src/main_filter.cpp src/logic/filters/IImageFilter.h src/logic/filters/BasicImageFilter.cpp src/logic/filters/BasicImageFilter.h src/logic/filters/IImageFilter.cpp)
8095
target_link_libraries(filter_test ${Boost_LIBRARIES})

dependencies/spdlog/CMakeLists.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
Include(FetchContent)
3+
4+
FetchContent_Declare(
5+
spdlog
6+
GIT_REPOSITORY https://github.com/gabime/spdlog
7+
GIT_TAG v1.14.0
8+
)
9+
10+
FetchContent_MakeAvailable(spdlog)

src/camera/NopCamera.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ namespace selfomat {
6060
// Load assets
6161
video = cv::VideoCapture("/opt/assets/nop.mov");
6262
if (!video.isOpened()) {
63-
cerr << "Could not load nop video." << endl;
63+
spdlog::error("Could not load nop video.");
6464
} else {
6565
fpsClock.restart();
6666
}

src/camera/controllers/BaseController.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55

66
#include "BaseController.h"
7+
#include <sstream>
78

89
using namespace selfomat::camera::gphoto;
910
using namespace selfomat::tools;

src/logic/BoothLogic.cpp

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
//
44
#include "BoothLogic.h"
55

6+
#include "spdlog/sinks/dist_sink.h"
7+
68
using namespace std;
79
using namespace selfomat::logic;
810
using namespace selfomat::camera;
@@ -763,6 +765,10 @@ int BoothLogic::getTriggerCounter() {
763765
return triggerCounter;
764766
}
765767

768+
bool BoothLogic::isAgreementVisible() {
769+
return showAgreement;
770+
}
771+
766772
void BoothLogic::incTriggerCounter() {
767773
this->triggerCounter++;
768774
}
@@ -968,19 +974,25 @@ void BoothLogic::setDebugLogEnabled(bool newValue, bool persist) {
968974
return;
969975
}
970976

971-
FilesystemLogger::INSTANCE.enableLogToFile(imageDir);
977+
if(!file_logger) {
978+
// Create the file logger and add it to the dist_sink
979+
file_logger = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(imageDir+"/selfomat.log", 1024*1024*10, 3, false);
980+
dynamic_cast<spdlog::sinks::dist_sink<std::mutex>*>(spdlog::default_logger()->sinks().front().get())->add_sink(file_logger);
981+
}
972982
} else {
973-
FilesystemLogger::INSTANCE.disableLogToFile();
983+
if(file_logger) {
984+
// if we have a file logger, remove it from the sink and delete it
985+
dynamic_cast<spdlog::sinks::dist_sink<std::mutex>*>(spdlog::default_logger()->sinks().front().get())->remove_sink(file_logger);
986+
file_logger = nullptr;
987+
}
974988
}
975989

976-
gui->setDebugOutput(FilesystemLogger::INSTANCE.getLogToFileState() == FilesystemLogger::ENABLED);
977-
978990
if (persist)
979991
writeSettings();
980992
}
981993

982994
bool BoothLogic::getDebugLogEnabled() {
983-
return FilesystemLogger::INSTANCE.getLogToFileState() == FilesystemLogger::ENABLED;
995+
return file_logger != nullptr;
984996
}
985997

986998
bool BoothLogic::getAutofocusBeforeTrigger() {

src/logic/BoothLogic.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,9 @@
3333
#include "ILogicController.h"
3434

3535
#include <tools/verbose.h>
36+
#include <spdlog/spdlog.h>
3637

37-
38+
#include "spdlog/sinks/rotating_file_sink.h"
3839

3940

4041
using namespace selfomat::camera;
@@ -82,8 +83,8 @@ namespace selfomat {
8283
public:
8384
explicit BoothLogic(ICamera *camera, IGui *gui, bool has_button, const string &button_port, bool has_flash,
8485
string imageDir, bool force_image_dir_mountpoint, bool disable_watchdog, bool show_led_setup, bool autofocus_before_trigger) : camera(camera), gui(gui),
85-
imageProcessor(gui),
86-
printerManager(gui),
86+
imageProcessor(),
87+
printerManager(),
8788
has_button(has_button),
8889
has_flash(has_flash),
8990
imageDir(imageDir),
@@ -176,6 +177,8 @@ namespace selfomat {
176177
boost::thread printThreadHandle;
177178
boost::thread printMonitoringThreadHandle;
178179

180+
std::shared_ptr<spdlog::sinks::rotating_file_sink_mt> file_logger{nullptr};
181+
179182
int filterChoice = 0;
180183
double filterGain = 1.0;
181184
bool wasSuccessfullyStopped = false;
@@ -253,6 +256,8 @@ namespace selfomat {
253256
void incTriggerCounter();
254257
int getTriggerCounter();
255258

259+
bool isAgreementVisible() override;
260+
256261
void setPrinterEnabled(bool printerEnabled, bool persist = false);
257262
bool getPrinterEnabled();
258263

src/logic/ILogicController.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ namespace selfomat {
1313
virtual void confirmPrint() = 0;
1414
virtual void stop() = 0;
1515
virtual bool getPrintConfirmationEnabled() = 0;
16+
virtual bool isAgreementVisible() = 0;
1617
virtual std::wstring getTranslation(std::string id) = 0;
1718
};
1819
}

src/logic/ImageProcessor.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,7 @@ void ImageProcessor::loadTemplateImage() {
4949

5050
}
5151

52-
ImageProcessor::ImageProcessor(ILogger *logger) {
53-
if (logger != nullptr) {
54-
this->logger = logger;
55-
} else {
56-
this->logger = new ConsoleLogger();
57-
}
52+
ImageProcessor::ImageProcessor() {
5853
}
5954

6055
ImageProcessor::~ImageProcessor() {

src/logic/ImageProcessor.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@
77

88

99
#include <iostream>
10-
#include <tools/ILogger.h>
1110
#include <tools/imageinfo.h>
1211
#include <boost/property_tree/ptree.hpp>
1312
#include <boost/property_tree/json_parser.hpp>
14-
#include <tools/ConsoleLogger.h>
1513
#include <tools/buffers.h>
1614
#include <tools/verbose.h>
1715
#include <tools/JpegDecoder.h>
@@ -40,8 +38,6 @@ namespace selfomat {
4038

4139
cv::Rect offset;
4240

43-
ILogger *logger;
44-
4541
void *latestBuffer = nullptr;
4642
size_t latestBufferSize = 0;
4743

@@ -58,7 +54,7 @@ namespace selfomat {
5854
void loadTemplateImage();
5955

6056
public:
61-
explicit ImageProcessor(ILogger *logger);
57+
explicit ImageProcessor();
6258

6359
cv::Mat frameImageForPrint(void *inputImageJpeg, size_t jpegBufferSize, FILTER filter = NO_FILTER, double filterGain = 1.0);
6460
cv::Mat decodeImageForPrint(void *inputImageJpeg, size_t jpegBufferSize, FILTER filter = NO_FILTER, double filterGain = 1.0);

src/logic/PrinterManager.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ int PrinterManager::printImage() {
225225
return job_id;
226226
}
227227

228-
PrinterManager::PrinterManager(ILogger *logger) : logger(logger) {
228+
PrinterManager::PrinterManager() {
229229
currentPrinterState = STATE_UNKNOWN;
230230
}
231231

src/logic/PrinterManager.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
#include <cups/ipp.h>
1111
#include <cups/adminutil.h>
1212
#include <iostream>
13-
#include "tools/ILogger.h"
1413
#include <opencv2/opencv.hpp>
1514
#include "../tools/buffers.h"
1615

@@ -53,7 +52,6 @@ namespace selfomat {
5352
PRINTER_STATE currentPrinterState;
5453
std::vector<std::string> currentStateReasons;
5554

56-
ILogger *logger;
5755
std::string printer_name;
5856

5957
void *imageTmpBuffer = nullptr;
@@ -83,7 +81,7 @@ namespace selfomat {
8381

8482
bool refreshPrinterState();
8583

86-
PrinterManager(ILogger *logger);
84+
PrinterManager();
8785

8886
bool prepareImageForPrint(cv::Mat image);
8987

src/main.cpp

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@
1212

1313
#include <sstream>
1414
#include <iostream>
15+
#include <spdlog/spdlog.h>
16+
#include <spdlog/async.h>
17+
18+
#include "spdlog/sinks/dist_sink.h"
19+
#include "spdlog/sinks/rotating_file_sink.h"
20+
#include "spdlog/sinks/stdout_color_sinks.h"
1521

1622
using namespace std;
1723
using namespace boost;
@@ -84,7 +90,7 @@ void exitfunc(int code) {
8490

8591
LOG_I("main", "Disable filesystem logger");
8692

87-
selfomat::tools::FilesystemLogger::INSTANCE.disableLogToFile();
93+
// TODO: spdlog disable file system logging?
8894

8995
std::cout << "Cleaned up" << endl;
9096
exitMutex.unlock();
@@ -96,6 +102,22 @@ void exitfunc() {
96102

97103
int main(int argc, char *argv[]) {
98104

105+
// Setup logging (async logger to file and console)
106+
spdlog::init_thread_pool(8192, 1);
107+
108+
auto stdout_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt >();
109+
110+
// create a dist_sink which distributes to other sinks
111+
// this allows us to add the file sink later
112+
const auto dist_sink = std::make_shared<spdlog::sinks::dist_sink<std::mutex>>();
113+
dist_sink->add_sink(stdout_sink);
114+
spdlog::set_default_logger(std::make_unique<spdlog::async_logger>("default", dist_sink,
115+
spdlog::thread_pool(), spdlog::async_overflow_policy::block));
116+
117+
spdlog::flush_every(std::chrono::seconds(1));
118+
119+
spdlog::set_pattern("[%X] [%^%l%$]: %v");
120+
spdlog::set_level(spdlog::level::debug);
99121

100122
// Listen to some common signals so that we're able to stop the camera gui etc gracefully
101123
//^C
@@ -151,7 +173,6 @@ int main(int argc, char *argv[]) {
151173
} catch (boost::exception &e) {
152174
LOG_E(TAG, "Error loading properties. Using defaults.");
153175
}
154-
155176
LOG_D(TAG, "Using camera: ", camera_type);
156177
LOG_D(TAG, "Has Button: ", std::to_string(has_button));
157178
LOG_D(TAG, "Button Port Name: ", button_port_name);

src/tools/ConsoleLogger.cpp

Lines changed: 0 additions & 11 deletions
This file was deleted.

src/tools/ConsoleLogger.h

Lines changed: 0 additions & 25 deletions
This file was deleted.

0 commit comments

Comments
 (0)