mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-04 10:16:24 +02:00
This upgrades to [v0.0.24](https://github.com/check-spelling/check-spelling/releases/tag/v0.0.24). A number of GitHub APIs are being turned off shortly, so you need to upgrade or various uncertain outcomes will occur. There's a new accessibility forbidden pattern: > Do not use `(click) here` links > For more information, see: > * https://www.w3.org/QA/Tips/noClickHere > * https://webaim.org/techniques/hypertext/link_text > * https://granicus.com/blog/why-click-here-links-are-bad/ > * https://heyoka.medium.com/dont-use-click-here-f32f445d1021 ```pl (?i)(?:>|\[)(?:(?:click |)here|link|(?:read |)more)(?:</|\]\() ``` There are some minor bugs that I'm aware of and which I've fixed since this release, but I don't expect to make another release this month. I've added a pair of patterns for includes and pragmas. My argument is that the **compiler** will _generally_ tell you if you've misspelled an include and the **linker** will _generally_ tell you if you misspell a lib. - There's a caveat here: If your include case-insensitively matches the referenced file (but doesn't properly match it), then unless you either use a case-sensitive file system (as opposed to case-preserving) or beg clang to warn, you won't notice when you make this specific mistake -- this matters in that a couple of Windows headers (e.g. Unknwn.h) have particular case and repositories don't tend to consistently/properly write them.
119 lines
3.4 KiB
C++
119 lines
3.4 KiB
C++
// logger.cpp : Defines the functions for the static library.
|
|
//
|
|
#include "pch.h"
|
|
#include "framework.h"
|
|
#include "logger.h"
|
|
#include <unordered_map>
|
|
#include <spdlog/sinks/daily_file_sink.h>
|
|
#include <spdlog/sinks/msvc_sink.h>
|
|
#include <spdlog/sinks/null_sink.h>
|
|
#include <spdlog/sinks/stdout_color_sinks-inl.h>
|
|
#include <iostream>
|
|
|
|
using spdlog::sinks_init_list;
|
|
using spdlog::level::level_enum;
|
|
using spdlog::sinks::daily_file_sink_mt;
|
|
using spdlog::sinks::msvc_sink_mt;
|
|
using std::make_shared;
|
|
|
|
namespace
|
|
{
|
|
const std::unordered_map<std::wstring, level_enum> logLevelMapping = {
|
|
{ L"trace", level_enum::trace },
|
|
{ L"debug", level_enum::debug },
|
|
{ L"info", level_enum::info },
|
|
{ L"warn", level_enum::warn },
|
|
{ L"err", level_enum::err },
|
|
{ L"critical", level_enum::critical },
|
|
{ L"off", level_enum::off },
|
|
};
|
|
}
|
|
|
|
level_enum getLogLevel(std::wstring_view logSettingsPath)
|
|
{
|
|
auto logLevel = get_log_settings(logSettingsPath).logLevel;
|
|
if (auto it = logLevelMapping.find(logLevel); it != logLevelMapping.end())
|
|
{
|
|
return it->second;
|
|
}
|
|
|
|
if (auto it = logLevelMapping.find(LogSettings::defaultLogLevel); it != logLevelMapping.end())
|
|
{
|
|
return it->second;
|
|
}
|
|
return level_enum::trace;
|
|
}
|
|
|
|
std::shared_ptr<spdlog::logger> Logger::logger = spdlog::null_logger_mt("null");
|
|
|
|
bool Logger::wasLogFailedShown()
|
|
{
|
|
wchar_t* pValue;
|
|
size_t len;
|
|
_wdupenv_s(&pValue, &len, logFailedShown.c_str());
|
|
delete[] pValue;
|
|
return len;
|
|
}
|
|
|
|
void Logger::init(std::string loggerName, std::wstring logFilePath, std::wstring_view logSettingsPath)
|
|
{
|
|
auto logLevel = getLogLevel(logSettingsPath);
|
|
bool newLoggerCreated = false;
|
|
try
|
|
{
|
|
logger = spdlog::get(loggerName);
|
|
if (logger == nullptr)
|
|
{
|
|
auto sink = make_shared<daily_file_sink_mt>(logFilePath, 0, 0, false, LogSettings::retention);
|
|
if (IsDebuggerPresent())
|
|
{
|
|
auto msvc_sink = make_shared<msvc_sink_mt>();
|
|
msvc_sink->set_pattern("[%Y-%m-%d %H:%M:%S.%f] [%n] [t-%t] [%l] %v");
|
|
logger = make_shared<spdlog::logger>(loggerName, sinks_init_list{ sink, msvc_sink });
|
|
}
|
|
else
|
|
{
|
|
logger = make_shared<spdlog::logger>(loggerName, sink);
|
|
}
|
|
newLoggerCreated = true;
|
|
}
|
|
}
|
|
catch (...)
|
|
{
|
|
logger = spdlog::null_logger_mt(loggerName);
|
|
if (!wasLogFailedShown())
|
|
{
|
|
// todo: that message should be shown from init caller and strings should be localized
|
|
MessageBoxW(NULL,
|
|
L"Logger cannot be initialized",
|
|
L"PowerToys",
|
|
MB_OK | MB_ICONERROR);
|
|
|
|
SetEnvironmentVariable(logFailedShown.c_str(), L"yes");
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
if (newLoggerCreated)
|
|
{
|
|
logger->set_level(logLevel);
|
|
logger->set_pattern("[%Y-%m-%d %H:%M:%S.%f] [p-%P] [t-%t] [%l] %v");
|
|
logger->flush_on(logLevel); // Auto flush on every log message.
|
|
spdlog::register_logger(logger);
|
|
}
|
|
|
|
logger->info("{} logger is initialized", loggerName);
|
|
}
|
|
|
|
void Logger::init(std::vector<spdlog::sink_ptr> sinks)
|
|
{
|
|
auto init_logger = std::make_shared<spdlog::logger>("", begin(sinks), end(sinks));
|
|
if (!init_logger)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Logger::logger = init_logger;
|
|
}
|