root/src/Logger.cc @ dbbd2afa
| 2c54c4c3 | david.sorber | /********************************************************************
|
||
* CONFIDENTIAL - All source code is the propriety and confidential *
|
||||
* information of David Sorber. *
|
||||
* *
|
||||
* Copyright 2024 David Sorber *
|
||||
* Unpublished -- all rights reserved under the copyright laws *
|
||||
* of the United States. *
|
||||
********************************************************************/
|
||||
#include <chrono>
|
||||
| eee13fa3 | david.sorber | #include <cstdio>
|
||
#include <ctime>
|
||||
| 2c54c4c3 | david.sorber | #include <stdexcept>
|
||
#include "Logger.h"
|
||||
DBS::Logger::Logger(CopyManagerOptions* configObj)
|
||||
: r_options(*configObj)
|
||||
{
|
||||
m_outputStream.str("");
|
||||
| eee13fa3 | david.sorber | |||
if (r_options.getLogToStderr() == false)
|
||||
| 2c54c4c3 | david.sorber | {
|
||
| eee13fa3 | david.sorber | // If configured to log to file attempt to open the specified log file
|
||
m_logFile.open(r_options.getLogFilePath(), std::ios::out | std::ios::app);
|
||||
if (!m_logFile)
|
||||
{
|
||||
throw std::runtime_error("Unable to open log file: " +
|
||||
r_options.getLogFilePath());
|
||||
}
|
||||
| 2c54c4c3 | david.sorber | }
|
||
}
|
||||
DBS::Logger::~Logger()
|
||||
{
|
||||
| eee13fa3 | david.sorber | // Close log file if it was opened
|
||
if (m_logFile.is_open())
|
||||
{
|
||||
m_logFile.close();
|
||||
}
|
||||
| 2c54c4c3 | david.sorber | }
|
||
void DBS::Logger::log_msg(
|
||||
enum LOG_LEVEL level,
|
||||
const std::string& msg)
|
||||
{
|
||||
| eee13fa3 | david.sorber | // Filter log messages as needed
|
||
| 4fd46efa | david.sorber | if ((! r_options.getEnableLog()) || level > r_options.getLogLevel())
|
||
| 2c54c4c3 | david.sorber | {
|
||
return;
|
||||
}
|
||||
| eee13fa3 | david.sorber | // Grab current time
|
||
struct timeval tv{};
|
||||
gettimeofday(&tv, nullptr);
|
||||
struct tm* tm = std::localtime(&tv.tv_sec);
|
||||
| 2c54c4c3 | david.sorber | |||
| eee13fa3 | david.sorber | char time_format[32], time_str[32];
|
||
| 2c54c4c3 | david.sorber | |||
const bool LOG_WITH_MILLISECONDS = true;
|
||||
if (LOG_WITH_MILLISECONDS == true)
|
||||
{
|
||||
// Set format to include milliseconds
|
||||
| eee13fa3 | david.sorber | std::strftime(time_format,
|
||
sizeof(time_format),
|
||||
"%a %b %d %H:%M:%S.%%03u %Y",
|
||||
tm);
|
||||
std::snprintf(time_str,
|
||||
sizeof(time_str),
|
||||
time_format,
|
||||
(tv.tv_usec / 1000));
|
||||
| 2c54c4c3 | david.sorber | }
|
||
else
|
||||
{
|
||||
// Set format to not include milliseconds
|
||||
| eee13fa3 | david.sorber | std::strftime(time_str,
|
||
sizeof(time_str),
|
||||
"%a %b %d %H:%M:%S %Y",
|
||||
tm);
|
||||
| 2c54c4c3 | david.sorber | }
|
||
switch (level)
|
||||
{
|
||||
case error:
|
||||
| eee13fa3 | david.sorber | getStream() << time_str << "|ERROR|copytool|" << msg << std::endl;
|
||
| 2c54c4c3 | david.sorber | break;
|
||
case warn:
|
||||
| eee13fa3 | david.sorber | getStream() << time_str << "|WARNING|copytool|" << msg << std::endl;
|
||
| 2c54c4c3 | david.sorber | break;
|
||
case info:
|
||||
| eee13fa3 | david.sorber | getStream() << time_str << "|INFO|copytool|" << msg << std::endl;
|
||
| 2c54c4c3 | david.sorber | break;
|
||
case debug:
|
||||
| eee13fa3 | david.sorber | getStream() << time_str << "|DEBUG|copytool|" << msg << std::endl;
|
||
| 2c54c4c3 | david.sorber | break;
|
||
case trace:
|
||||
| eee13fa3 | david.sorber | getStream() << time_str << "|TRACE|copytool|" << msg << std::endl;
|
||
| 2c54c4c3 | david.sorber | break;
|
||
default:
|
||||
break;
|
||||
}
|
||||
}
|