QT/C++ 개발환경에서 디버그 메시지(로깅)를 파일로 저장해보는 예제이다. qDebug(), qInfo(), qWarning(), qCritical(), qFatal() 매크로를 사용하고 윈도우 환경에서 OutputDebugString 모니터링을 위해 사용한 툴은 여기에서 다운로드한다.
// logwriter.h
#ifndef LOGWRITER_H
#define LOGWRITER_H
#include <QCoreApplication>
#include <QDateTime>
#include <QDir>
#include <QFile>
#include <QLoggingCategory>
#include <QScopedPointer>
#include <QTextStream>
class LogWriter {
public:
LogWriter();
~LogWriter();
static QScopedPointer<QFile> m_logFile;
static void WriteLog();
static void MessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg);
};
#endif // LOGWRITER_H
NLog는 풍부한 로그 라우팅 및 관리 기능을 가진 .NET 용 무료 로깅 플랫폼이다. 고품질 로그를 쉽게 생성하고 관리할 수 있다. 원하는 형식을 파일이나 데이터베이스에 같은 대상으로 보낼 수 있다. 다른 진단 로깅 라이브러리로는 Serilog가 있는데 ‘Worker Services in .NET Core 3.0’ 포스팅에서 소개하였고 이번 글에서는 NLog Wiki의 ‘Getting started with .NET Core 2 Console application’ 글을 참고하여 사용법을 간단하게 작성해보았다.
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="file" xsi:type="File"
layout="[${date:format=HH\:mm\:ss} ${level:uppercase=true:padding=5}] : ${message} ${callsite:className=false:fileName=true:includeSourcePath=false:methodName=false}[${threadid}]"
fileName="${basedir}/logs/${date:format=yyyyMM}/log_${date:format=yyyyMMdd}.txt"
concurrentWrites="true" />
<target name="n" xsi:type="OutputDebugString"
layout="${message} [${level:uppercase=true}]${callsite:className=false:fileName=true:includeSourcePath=false:methodName=false}[${threadid}]" />
</targets>
<rules>
<logger name="*" minlevel="trace" writeTo="file" />
<logger name="*" minlevel="trace" writeTo="n" />
</rules>
</nlog>
Blazor는 닷넷(.NET)을 사용하여 대화형 클라이언트 쪽 웹 UI를 빌드하기 위한 프레임워크이다. 내부적으로 WebAssembly(wasm), SignalR 기술을 사용한다. 웹어셈블리(WebAssembly, 간단히 Wasm)는 실행 프로그램 및 그와 일치하는 텍스트 어셈블리어, 그리고 이러한 프로그램과 호스트 환경 간 통신을 용이케 하는 인터페이스를 위한 이식 가능한 이진 코드 포맷을 정의하는 개방형 표준이다. 웹어셈블리의 주목적은 웹 페이지에서 고성능의 애플리케이션을 가능케 하는 것이지만 포맷은 다른 환경에서도 실행 및 연동되도록 설계되어 있다(wiki).
Blazor는 JavaScript 대신 C#으로 코드를 작성하고 Blazor WebAssembly, Blazor Server의 2가지 형태의 템플릿을 제공하는 데 첫 번째는 웹브라우저 안에 WebAssembly를 포함하고 두 번째 템플릿은 서버에서 WebAssembly를 렌더링하고 SignalR 연결(JavaScript interop)을 통해 웹브라우저(DOM)와 통신한다. 최신 웹브라우저가 아닌 경우는 두 번째 템플릿으로 개발하는 게 호환성이 좋다.