일반적으로 여러개의 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");
    }
}
'Development > C#' 카테고리의 다른 글
| [C#] HMACSHA256 클래스를 이용해서 사용자 비밀번호를 암호화하기 (0) | 2023.02.15 | 
|---|---|
| [C#] Project publish할 때 "Could not find a part of the path..." 오류가 발생할 경우 (0) | 2023.02.12 | 
| [C#] 두 변수의 값 바꾸기(Swap) (0) | 2023.02.07 | 
| [Json.Net] SelectToken/SelectTokens 사용법 (0) | 2023.01.25 | 
| [C#] JSON Serialization 할 때 enum 타입을 문자열 형태로 변환시키기 (0) | 2023.01.19 | 
