QT의 핵심기능 중 하나인 Signal, Slot은 객체 간의 통신에 사용된다. 일반적인 개발언어의 객체 간 메시지 통신인 ‘메시지-메시지 핸들러’, ‘이벤트-이벤트 핸들러’와 유사한 개념이다. signal과 slot을 연결하기 위해 connect()를 사용한다. connect를 사용하는 방법은 함수 포인터를 사용하거나 람다에 연결한다. Singleton으로 확장한 예제는 여기(GitHub)에서 볼 수 있다.
connect(sender, &QObject::destroyed, this, &MyObject::objectDestroyed);
connect(sender, &QObject::destroyed, this, [=](){this->m_objects.remove(sender);});
//main.cpp
#include "water_cooler.h"
#include <QCoreApplication>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
WaterCooler Cooler;
a.exit(0);
}
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>