[NLog] log message가 발생할 때 마다 호출되는 callback 함수 만들기

 일반적으로 여러개의 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");
    }
}