#include <iostream>
#include <Poco/Logger.h>
#include <Poco/PatternFormatter.h>
#include <Poco/FormattingChannel.h>
#include <Poco/ConsoleChannel.h>
#include <Poco/FileChannel.h>
#include <Poco/SplitterChannel.h>
#include <Poco/AutoPtr.h>
#include <Poco/Thread.h>
#include <Poco/Runnable.h>
using namespace Poco;
class LevelFilterFileChannel : public FileChannel
{
public:
LevelFilterFileChannel() : FileChannel() {}
void log(const Message& msg) override
{
// debug, trace 로그 제외
if (msg.getPriority() <= Message::PRIO_INFORMATION)
{
FileChannel::log(msg);
}
}
};
class MyWorker : public Runnable
{
public:
void run() override
{
Logger& logger = Logger::get("aLogger");
for (int i = 0; i < 5; ++i)
{
logger.notice("Poco Thread is running! i = " + std::to_string(i));
Poco::Thread::sleep(500); // 0.5초 대기
}
logger.information("Poco Thread done.");
}
};
int main()
{
AutoPtr<ColorConsoleChannel> colorConsoleChannel(new ColorConsoleChannel);
AutoPtr<LevelFilterFileChannel> fileChannel(new LevelFilterFileChannel);
fileChannel->setProperty("path", "myapp.log");
fileChannel->setProperty("rotation", "50000 K"); // 50,000KB 초과시 회전
fileChannel->setProperty("archive", "timestamp");
fileChannel->setProperty("purgeAge", "30 days"); // 30일 초과 로그 파일 삭제
AutoPtr<PatternFormatter> patternFormatter(new PatternFormatter);
patternFormatter->setProperty(
"pattern",
"[%Y-%m-%d %H:%M:%S] [%p] [PID:%P][TID:%T][TH:%I] %t"
);
patternFormatter->setProperty("times", "local");
AutoPtr<FormattingChannel> fcConsole(new FormattingChannel(patternFormatter, colorConsoleChannel)); // 콘솔은 모든 로그
AutoPtr<FormattingChannel> fcFile(new FormattingChannel(patternFormatter, fileChannel));
// 콘솔 및 파일 채널로 메시지를 전달
AutoPtr<SplitterChannel> splitter(new SplitterChannel);
splitter->addChannel(fcConsole);
splitter->addChannel(fcFile);
Logger& logger = Logger::get("Logger");
logger.setChannel(splitter);
logger.setLevel(Message::PRIO_TRACE); // 모든 로그 레벨 허용
logger.fatal("FATAL 메시지");
logger.critical("CRITICAL 메시지");
logger.error("ERROR 메시지");
logger.warning("WARNING 메시지");
logger.notice("NOTICE 메시지");
logger.information("INFO 메시지");
logger.debug("DEBUG 메시지 - 콘솔만");
logger.trace("TRACE 메시지 - 콘솔만");
MyWorker worker;
Thread thread;
thread.start(worker);
// 메인 스레드도 로그 남기기
for (int i = 0; i < 3; ++i)
{
logger.notice("Main thread working... i = " + std::to_string(i));
std::this_thread::sleep_for(std::chrono::milliseconds(400));
}
thread.join();
logger.information("모든 작업 종료");
}