| 1853 | //===--------------------------------------------------------------------===// |
| 1854 | |
| 1855 | void ShellLogStorage::WriteLogEntry(duckdb::timestamp_t timestamp, duckdb::LogLevel level, const string &log_type, |
| 1856 | const string &log_message, const duckdb::RegisteredLoggingContext &context) { |
| 1857 | duckdb::lock_guard<duckdb::mutex> l(lock); |
| 1858 | |
| 1859 | HighlightElementType element_type; |
| 1860 | switch (level) { |
| 1861 | case duckdb::LogLevel::LOG_TRACE: |
| 1862 | element_type = HighlightElementType::LOG_TRACE; |
| 1863 | break; |
| 1864 | case duckdb::LogLevel::LOG_DEBUG: |
| 1865 | element_type = HighlightElementType::LOG_DEBUG; |
| 1866 | break; |
| 1867 | case duckdb::LogLevel::LOG_INFO: |
| 1868 | element_type = HighlightElementType::LOG_INFO; |
| 1869 | break; |
| 1870 | case duckdb::LogLevel::LOG_WARNING: |
| 1871 | element_type = HighlightElementType::LOG_WARNING; |
| 1872 | break; |
| 1873 | case duckdb::LogLevel::LOG_ERROR: |
| 1874 | case duckdb::LogLevel::LOG_FATAL: |
| 1875 | element_type = HighlightElementType::ERROR_TOKEN; |
| 1876 | break; |
| 1877 | default: |
| 1878 | throw std::runtime_error("Unsupported log level for WriteLogEntry"); |
| 1879 | } |
| 1880 | |
| 1881 | // check if the log has already been printed |
| 1882 | auto log_id = duckdb::StringUtil::CIHash(log_message); |
| 1883 | if (printed_logs.find(log_id) != printed_logs.end()) { |
| 1884 | return; |
| 1885 | } |
| 1886 | printed_logs.emplace(log_id); |
| 1887 | |
| 1888 | const auto log_level = duckdb::EnumUtil::ToString(level); |
| 1889 | shell_highlight.PrintText(log_level + ":\n", PrintOutput::STDOUT, element_type); |
| 1890 | shell_highlight.PrintText(log_message + "\n\n", PrintOutput::STDOUT, element_type); |
| 1891 | } |
| 1892 | |
| 1893 | } // namespace duckdb_shell |