The LogLevel enum defines the different log levels supported by the logging framework.
The LogMessage class represents a log message with a timestamp, log level, and message content.
The LogAppender interface defines the contract for appending log messages to different output destinations.
The ConsoleAppender, FileAppender, and DatabaseAppender classes are concrete implementations of the LogAppender interface, supporting logging to the console, file, and database, respectively.
The LoggerConfig class holds the configuration settings for the logger, including the log level and the selected log appender.
The Logger class is a singleton that provides the main logging functionality. It allows setting the configuration, logging messages at different levels, and provides convenience methods for each log level.
The LoggingExample class demonstrates the usage of the logging framework, showcasing different log levels, changing the configuration, and logging from multiple threads.