Nlog、Log4Net的一个小扩展(增加自定义LEVEL)
2023年7月17日发(作者:)
Nlog、Log4Net的⼀个⼩扩展(增加⾃定义LEVEL)因公司ELK监控分析⽇志的需要,需要区分进程运⾏状态⽇志以及错误⽇志,以便能够根据⽇志级别(level)进⾏不同策略的预警,⽽现有的Nlog、Log4Net都没有Process这样的level,故针对这两个⽇志框架做了⼀些扩展,实现了⾃定义PROCESS LEVEL,因代码不多,故直接贴代码,有疑问的或好的建议可以下⽅评论留⾔交流,谢谢!:(Nlog的扩展)⽂件代码内容如下: public static class NlogExtend { public static void Process(this ILogger logger, string message = "RUNNING") { var logEventInfo = new LogEventInfo(, , message); ties["custLevel"] = (9, "Process"); (logEventInfo); } } [LayoutRenderer("levelx")] public class LevelExLayoutRenderer : LevelLayoutRenderer { protected override void Append(StringBuilder builder, LogEventInfo logEvent) { if ( == && nsKey("custLevel")) { var custLevel = ties["custLevel"] as Tuple; if (custLevel == null) { throw new InvalidCastException("Invalid Cast Tuple"); } switch () { case : (2); break; case haracter: (2[0]); break; case l: (1); break; } } else { (builder, logEvent); } } } 因Nlog的LogLevel不允许直接通过继承或New 构造函数来创建⼀个新的Level,故只能采取把⾃定义的level写⼊到LogEventInfo的扩展属性中,然后再⾃定义⼀个继承⾃LevelLayoutRenderer的布局⽣成器类,就OK了⽤法如下:config⽂件:(⽤levelx取代原来的level即可) 代代码中输出PROCESS⽇志: /// /// 基于NLOG框架的⽇志⼯具类 /// public static class LogUtil { private readonly static ILogger logger = null; static LogUtil() { erDefinition("levelx", typeof(xLayoutRenderer));//注册⾃定义的布局⽣成器,这样config⽂件中的levelx才能⽣效 logger = rentClassLogger(); } public static void Info(string msg) { try { (msg); } catch { } } public static void Error(Exception ex) { try { (ex); } catch { } } public static void Error(string msg) { try { Log(, msg); } catch { } } public static void Warn(string msg) { try { (msg); } catch { } } public static void Log(LogLevel level, string msg) { try { (level, msg); } catch { } } public static void Process(string message = "RUNNING") { try { s(message); } catch { } } }//调⽤写Process进程⽇志s(); 说完了Nlog,再来说⼀下Log4Net的扩展实现。:(Nlog的扩展)⽂件代码内容如下: /// /// Log4Net扩展(扩展⼀个Process的LOG LEVEL,以便定时输出进程运⾏⽇志) /// Author:Zuowenjun /// Date:2018-4-25 /// public static class Log4NetExtend { public static readonly ProcessLevel = new (10001, "PROCESS"); private static void AddProcessLevel( log) { if (!ns(ProcessLevel)) { (ProcessLevel); } } public static void Process(this log, string message) { AddProcessLevel(log); (rentMethod().DeclaringType, ProcessLevel, message, null); } public static void ProcessFormat(this log, string message, params object[] args) { AddProcessLevel(log); string formattedMessage = (message, args); (rentMethod().DeclaringType, ProcessLevel, formattedMessage, null); } } /// /// 输出当前进程名转换器 /// public class ProcessPatternConvert : PatternLayoutConverter { private readonly static string processName = rentProcess().ProcessName; protected override void Convert(iter writer, gEvent loggingEvent) { (processName);//输出当前进程名 } } public class CustomPatternLayout : nLayout { public CustomPatternLayout() { verter("proc", typeof(ProcessPatternConvert)); } } log4net相对于Nlog好⼀点,可以通过New Level的构造函数⾃定义⼀个新的level实例,但也不好的地⽅,就是没有默认的显⽰进程名字,故需要⾃定义ProcessPatternConvert、CustomPatternLayout,通过CustomPatternLayout的构造函数把ProcessPatternConvert布局转换器类添加到布局转换器集合,这样config中就可以配置proc,以便输出进程名,config配置如下: 代码使⽤如下:public static ILog Logger = ger("KyAutoTimingExecSystem");s(msg); 好了,就介绍到这⾥,没有什么⾼⼤上的技术分享,只是⼀点对框架扩展的总结,举⼀反三,可以扩展其它⽅⾯。
发布者:admin,转转请注明出处:http://www.yc00.com/news/1689539350a264441.html
评论列表(0条)