Development/C#
[NLog] log message가 발생할 때 마다 호출되는 callback 함수 만들기
아빠는개발자
2023. 2. 8. 10:17
일반적으로 여러개의 class library혹은 여러개의 class 내부에서 NLog를 사용해 log message를 생성해 내게되는데, 매번 log message가 발생 할 때 마다 해당 메세지를 가공해서 GUI상에 뿌려준다거나 GRPC나 WebSocket 혹은 Kafka같은 Message Broker로 publish하는 기능이 필요할 때가 있습니다.
이럴 때 아래와같이 NLog의 MethodCallTarget 클래스를 사용하면 쉽게 구현이 가능합니다.
// Callback 함수를 정의합니다.
var target = new MethodCallTarget("LogNotify", async (logEvent, parameters) =>
{
// 여기서 본인이 원하는 처리를 하면 됩니다. 내부에 비동기 호출이 없으면 위에 async를 빼주세요.
if (logEvent.Level > NLog.LogLevel.Debug)
{
...
}
});
// 모든 log message level에 대해 해당 callback 함수가 호출되도록 등록합니다.
LogManager.Configuration.AddRuleForAllLevels(target);
// logger 설정을 업데이트 합니다.
LogManager.ReconfigExistingLoggers();
공식 홈페이지의 문서(https://nlog-project.org/documentation/v2.0.1/html/T_NLog_Targets_MethodCallTarget.htm)의 예제는 아래와 같습니다.
using System;
using NLog;
using NLog.Targets;
using System.Diagnostics;
public class Example
{
public static void LogMethod(string level, string message)
{
Console.WriteLine("l: {0} m: {1}", level, message);
}
static void Main(string[] args)
{
MethodCallTarget target = new MethodCallTarget();
target.ClassName = typeof(Example).AssemblyQualifiedName;
target.MethodName = "LogMethod";
target.Parameters.Add(new MethodCallParameter("${level}"));
target.Parameters.Add(new MethodCallParameter("${message}"));
NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(target, LogLevel.Debug);
Logger logger = LogManager.GetLogger("Example");
logger.Debug("log message");
logger.Error("error message");
}
}