C# 使用 log4net 日志组件
一、 什么是 log4net
Apache log4net 库是帮助程序员将日志语句输出到各种输出目标的工具,它是从Java中的Log4j迁移过来的一个.Net版的开源日志框架。log4net 的一个显著特征是分层记录器的概念。使用这些记录器可以有选择地控制以任意粒度输出哪些日志语句。主要特征如下:
- 支持多个框架
- 输出到多个日志记录目标
- 分层日志记录体系结构
- XML 配置
- 动态配置
- 日志记录上下文
- 久经考验的架构
- 模块化和可扩展设计
- 高性能和灵活性
二、C# 使用 log4net
添加Nuget 包,搜索到“log4net”后 ,选择安装,具体如下图所示:

三、添加 log4net 配置文件
使用 log4net需要我们配置log4net的配置文件,目前,配置文件是用 XML 编写的。一般有两种方式,一种是使用og4net自动生成的 “log4net.xml”进行配置,另一种是直接嵌入到运行程序的 app.config 文件中。 
具体内容如下:

1 <?xml version="1.0" encoding="utf-8" ?>
2 <configuration>
3 <configSections>
4 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
5 </configSections>
6 <startup>
7 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
8 </startup>
9 <log4net>
10 <!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
11 <!-- Set root logger level to ERROR and its appenders -->
12 <root>
13 <level value="ALL" />
14 <appender-ref ref="SysAppender" />
15 </root>
16 <!-- Print only messages of level DEBUG or above in the packages -->
17 <logger name="WebLogger">
18 <level value="DEBUG" />
19 </logger>
20 <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net">
21 <param name="File" value="log/" />
22 <param name="AppendToFile" value="true" />
23 <param name="RollingStyle" value="Date" />
24 <param name="DatePattern" value="'demo_'yyyy_MM_dd-HH'.log'" />
25 <param name="StaticLogFileName" value="false" />
26 <param name="RollingStyle" value="Composite" />
27 <layout type="log4net.Layout.PatternLayout,log4net">
28 <param name="ConversionPattern" value="%date [th=%3thread] [line:%5L] [%-5level] %message%newline"/>
29 </layout>
30 </appender>
31 <appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net">
32 <layout type="log4net.Layout.PatternLayout,log4net">
33 <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
34 </layout>
35 </appender>
36 </log4net>
37 </configuration>
主要参数含义如下:

三、源码测试
我们可以添加一个日志类,专门用于输出日志打印,具体代码如下:

1 public static class LogUtil
2 {
3 private static log4net.ILog Log { get; } = log4net.LogManager.GetLogger("log");
4
5
6 public static void Configure(string exeConfigFile)
7 {
8 log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(exeConfigFile));
9 }
10
11 private static string GetMethodName(int skipFrames = 2)
12 {
13 try
14 {
15 // 这里忽略skipFrames层堆栈,也就忽略了当前方法GetMethodName,以及调用此方法的方法,这样拿到的就正好是外部调用打印日志所在函数的方法信息
16 var method = new StackFrame(skipFrames).GetMethod();
17 var properties =
18 method?.DeclaringType?.GetProperties(
19 BindingFlags.Instance |
20 BindingFlags.Static |
21 BindingFlags.Public |
22 BindingFlags.NonPublic);
23 var property = properties?.Where(p => p.GetGetMethod(true) == method || p.GetSetMethod(true) == method)
24 .FirstOrDefault();
25
26 var name = $"{method?.DeclaringType?.ToString().Split('.').Last()}.{method?.Name}";
27 return property == null
28 ? $"{name,-50}"
29 : $"{property.Name,-50}";
30 }
31 catch (Exception e)
32 {
33 return "ERROR TO GET CALLING METHOD";
34 }
35 }
36 private static string NoWarp(string msg)
37 {
38 return msg?.Replace("\r\n", " ").Replace("\n", " ");
39 }
40 private static string WrapException(string msg, Exception e)
41 {
42 var builder = new StringBuilder(msg);
43 builder.Append("\t[").Append(e.Message).Append("]");
44 if (e.InnerException != null)
45 {
46 builder.Append(" --> [").Append(e.InnerException.Message).Append("]");
47 }
48
49 return builder.ToString();
50 }
51
52
53
54
55 public static void Debug(string msg)
56 {
57 Log.Debug(msg);
58 }
59 public static void Debug(string msg, Exception e)
60 {
61 Log.Debug(WrapException(msg, e), e);
62 }
63
64 public static void Info(string msg)
65 {
66 Log.Info(msg);
67 }
68 public static void Info(string msg, Exception e)
69 {
70 Log.Info(WrapException(msg, e), e);
71 }
72
73 public static void Warn(string msg)
74 {
75 Log.Warn(msg);
76 }
77 public static void Warn(string msg, Exception e)
78 {
79 Log.Warn(WrapException(msg, e), e);
80 }
81
82 public static void Error(string msg)
83 {
84 Log.Error(msg);
85 }
86 public static void Error(string msg, Exception e)
87 {
88 Log.Error(WrapException(msg, e), e);
89 }
90
91 public static void Fatal(string msg)
92 {
93 Log.Fatal(msg);
94 }
95 public static void Fatal(string msg, Exception e)
96 {
97 Log.Fatal(WrapException(msg, e), e);
98 }
99 }
测试代码如下:

1 static void Main(string[] args)
2 {
3 try
4 {
5 string exeConfigFile = $"{AppDomain.CurrentDomain.BaseDirectory}//Log4netDemo.exe.config";
6
7 if (File.Exists(exeConfigFile) == false)
8 {
9 throw new Exception($"应用程序配置文件 [{exeConfigFile}] 不存在,无法加载日志 log4net 的配置");
10 }
11
12 XmlConfigurator.Configure(new FileInfo(exeConfigFile));
13 LogUtil.Info("====================================== Log4netDemo started, log4net setup...");
14 LogUtil.Warn("程序启动入参不合理");
15 LogUtil.Error("程序启动失败");
16
17 Console.ReadKey();
18 }
19 catch (Exception ex)
20 {
21 Console.WriteLine(ex);
22 LogUtil.Error("程序加载失败",ex);
23 }
24 }
运行程序后,实际输出效果如下:

四、引用地址
- http://logging.apache.org/log4net/release/manual/configuration.html
- https://www.sohu.com/a/254335960_696685
- https://blog.csdn.net/hr541659660/article/details/45575473
C# 使用 log4net 日志组件的更多相关文章
- .net core 使用log4net日志组件
一个web站点必须要记录日志,否则哪里出错了,完全是黑娃找黑妹,两眼一抹黑. 最常用的就是log4net日志组件.我们可以通过扩展加入日志组件. 第一步:在项目中NuGet log4net包,即 In ...
- log4net日志组件经验分享
引自log4net日志组件经验分享 我们在开发WEB项目的时候,经常会出现这样的情况:在本地调试都是正常的,但是部署到服务器上就不行了.一般出现这种情况很大一部分原因是因为服务的环境和本地不同,数据库 ...
- 快速入门系列--Log4net日志组件
Log4net是阿帕奇基金会的非常流行的开源日志组件,是log4j的.NET移植版本,至今已经有11年的历史,使用方便并且非常稳定,此外很重要的一点是其和很多开源组件能很好的组合在一起工作,例如NHi ...
- C#控制台程序使用Log4net日志组件
1.Log4net一般都不陌生,但是在配置上不同类型的项目又不相同的地方比如C#控制台程序和C# MVCWeb项目,拿控制台项目为例 项目源码在文章底部 2.首先创建一个控制台程序,引入Log4n ...
- log4net日志组件
转载:http://www.cnblogs.com/knowledgesea/archive/2012/04/26/2471414.html 一.什么是log4net组件 Log4net是基于.net ...
- Log4net日志组件使用
一.简介 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题.经验表明,日 ...
- 使用log4net日志组件经验分享
常见步骤: 第一:在项目中引用log4net组件. 第二:配置log4net,一般都写在web.config中. 第三:调用部分. 具体怎么配置,大家可以参考博客其它博友写的,这里我只写我 ...
- 性能秒杀log4net的NLogger日志组件(附测试代码与NLogger源码)
NLogger特性: 一:不依赖于第三方插件和支持.net2.0 二:支持多线程高并发 三:读写双缓冲对列 四:自定义日志缓冲大小 五:支持即时触发刷盘机制 六:先按日期再按文件大小滚动Rolling ...
- .Netcore之日志组件Log4net、Nlog性能比较
转载请注明出处http://www.cnblogs.com/supernebula/p/7506993.html .Netcore之Log4net.Nlog性能比较 最近在写一个开源.netcore ...
随机推荐
- JZOJ2020年8月13日提高组反思
JZOJ2020年8月13日提高组反思 T1 打了3h+,然后自己的小数据都没过 果断选择交对拍的暴力 下次还是注意时间吧 T2 一下三题都没时间打了 看了题目觉得特别烦人(有式子) 再看发现式子类似 ...
- 第1章 Python学习环境构建目录
第1章 引子 第1.1节 学习环境搭建 第1.2节 Python学习环境的使用 第2章 Python编程基础知识 第2.1节 简单的Python数据类型.变量赋值及输入输出 第2.2节 Python的 ...
- 第8.34节 《Python类中常用的特殊变量和方法》总结
本章介绍了Python类中常用的特殊变量和方法,这些特殊变量和方法都有特殊的用途,是Python强大功能的基石之一,许多功能非常有Python特色.由于Python中一切皆对象,理解这些特殊变量和方法 ...
- PyQt(Python+Qt)学习随笔:QListWidget的addItem方法
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在QListWidget对象中,增加一个项的方法是调用addItem方法,addItem方法有2种重 ...
- 一文搞懂RESTful API
RESTful接口实战 原创公众号:bigsai 转载请联系bigsai 文章收藏在回车课堂 前言 在学习RESTful 风格接口之前,即使你不知道它是什么,但你肯定会好奇它能解决什么问题?有什么应用 ...
- uniapp 微信授权登陆
准备工作: 1.微信开发者账号 2.AppId .AppSecret (这些可以在开放平台申请到) 第一步 添加移动应用,仔细添加上述信息: 审批通过后,即刻 第二步 打开uniapp,开启OAuth ...
- Day1 【Scrum 冲刺博客】
(因发作业当天没注意看作业内容,第一天的冲刺博客和第二天的同时发!!!不好意思!!!) 各个成员在 Alpha 阶段认领的任务 方晓莹 搭建社区管理系统的前端框架 登录页开发 管理员模块个人中心开发 ...
- 步步为营,打造CQUILib UI框架库
步步为营,打造CQUILib UI框架库 UI框架包括如下几个方面:: 丰富的UI控件 窗口管理 主题 多语言 托盘 视图与业务解耦 登录框效果如下:: 提示框效果如下:: 后续讲解如何步步为营,打造 ...
- DBeaver连接MySQ报错
遇错情况:第一次使用DBaver连接MySQL遇到以下问题: 报错信息:Public Key Retrieval is not allowed 截图如下: 解决方案步骤: 一.已有连接的情况:F4或者 ...
- 新手关于C++ cin 的返回值
cin是C++的标准输入流,其本身是一个对象,并不存在返回值的概念. 不过经常会有类似于 while(cin>>a) 的调用,这里并不是cin的返回值,应该关注">> ...