C#控制台程序中使用log4.net来输出日志

Apache log4net 库是一个帮助程序员将日志语句输出到各种输出目标的工具。log4net 是优秀的 Apache log4j™ 框架到 Microsoft® .NE​​T 运行时的端口。

我喜欢他可以自定义输出,区分等级等特点。

导入库

我们在工程里添加NuGet的包。输入名称log4net ,导入包。

创建配置文件

然后我们在项目根创建一个配置文件log4net.config

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<log4net>
	<!-- 将日志以回滚文件的形式写到文件中 -->
	<!-- 按日期切分日志文件,并将日期作为日志文件的名字 -->
	<!--Error-->
	<appender name="ErrorLog" type="log4net.Appender.RollingFileAppender">
		<!--不加utf-8编码格式,中文字符将显示成乱码-->
		<param name="Encoding" value="utf-8" />
		<file value="Log/"/>
		<appendToFile value="true" />
		<rollingStyle value="Date" />
		<!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->
		<datePattern value="&quot;ErrorLogs_&quot;yyyyMMdd&quot;.log&quot;" />
		<!--日志文件名是否为静态-->
		<StaticLogFileName value="false"/>
		<!--多线程时采用最小锁定-->
		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
		<!--布局(向用户显示最后经过格式化的输出信息)-->
		<layout type="log4net.Layout.PatternLayout">
			<conversionPattern value="%date| %-5level %newline%message%newline--------------------------------%newline" />
		</layout>
		<filter type="log4net.Filter.LevelRangeFilter">
			<levelMin value="WARN" />
			<levelMax value="FATAL" />
		</filter>
	</appender>
	<!--Error-->



	<!--Info-->
	<appender name="InfoLog" type="log4net.Appender.RollingFileAppender">
		<!--不加utf-8编码格式,中文字符将显示成乱码-->
		<param name="Encoding" value="utf-8" />
		<!--定义文件存放位置-->
		<file value="Log/"/>
		<appendToFile value="true" />
		<rollingStyle value="Date" />
		<!--日志文件名是否为静态-->
		<StaticLogFileName value="false"/>
		<!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->
		<datePattern value="&quot;InfoLogs_&quot;yyyyMMdd&quot;.log&quot;" />
		<!--多线程时采用最小锁定-->
		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
		<!--布局(向用户显示最后经过格式化的输出信息)-->
		<layout type="log4net.Layout.PatternLayout">
			<conversionPattern value="%date| %-5level%c %newline%message%newline--------------------------------%newline" />
		</layout>
		<filter type="log4net.Filter.LevelRangeFilter">
			<levelMin value="INFO" />
			<levelMax value="INFO" />
		</filter>
	</appender>
	<!--Info-->

	<!--Info-->
	<appender name="DebugLog" type="log4net.Appender.RollingFileAppender">
		<!--不加utf-8编码格式,中文字符将显示成乱码-->
		<param name="Encoding" value="utf-8" />
		<!--定义文件存放位置-->
		<file value="Log/"/>
		<appendToFile value="true" />
		<rollingStyle value="Date" />
		<!--日志文件名是否为静态-->
		<StaticLogFileName value="false"/>
		<!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->
		<datePattern value="&quot;DebugLogs_&quot;yyyyMMdd&quot;.log&quot;" />
		<!--多线程时采用最小锁定-->
		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
		<!--布局(向用户显示最后经过格式化的输出信息)-->
		<layout type="log4net.Layout.PatternLayout">
			<conversionPattern value="%date| %-5level%c %newline%message%newline--------------------------------%newline" />
		</layout>
		<filter type="log4net.Filter.LevelRangeFilter">
			<levelMin value="DEBUG" />
			<levelMax value="DEBUG" />
		</filter>
	</appender>
	<!--Info-->
	<root>
		<!-- 控制级别,由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF -->
		<!-- 比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录 -->
		<!-- 如果没有定义LEVEL的值,则缺省为DEBUG -->
		<level value="ALL" />
		<!-- 按日期切分日志文件,并将日期作为日志文件的名字 -->
		<appender-ref ref="ErrorLog" />
		<appender-ref ref="InfoLog" />
		<appender-ref ref="DebugLog" />
	</root>
</log4net>

使用类

我们创建一个单独的类来使用他。

csharp 复制代码
using log4net;


namespace MMCEngine
{
    internal class Loger
    {

        readonly static ILog logger = LogManager.GetLogger(" MMCEngine ");
        public Loger() {
            Thread.CurrentThread.Name = "main";//为了让主线程名显示
            string path = @"../../../log4net.config";
            FileInfo file = new FileInfo(path);


            log4net.Config.XmlConfigurator.Configure(file);
            
            Console.WriteLine("loger");
        }

        public static void Debug(string str)
        {
            Console.WriteLine(DateTime.Now.ToString("yyyy-mm-dd HH:MM:ss")+" DEBUG:" + str);
            logger.Debug(str);
        }
        public static void Info(string str)
        {
            Console.WriteLine(DateTime.Now.ToString("yyyy-mm-dd HH:MM:ss") + " INFO:" + str);
            logger.Info(str);
        }
        public static void Warn(string str)
        {
            Console.WriteLine(DateTime.Now.ToString("yyyy-mm-dd HH:MM:ss") + " WARN:" + str);
            logger.Warn(str);
        }
        public static void Error(string str)
        {
            Console.WriteLine(DateTime.Now.ToString("yyyy-mm-dd HH:MM:ss") + " ERROR:" + str);
            logger.Error(str);
        }
    }
}

使用

在Program.cs中

csharp 复制代码
new Loger();
// 调用Python脚本的Test函数
Loger.Info("info1");
Loger.Info("info2");
Loger.Debug("Debug3");
Loger.Warn("Warn4");
Loger.Error("err5");

我们可以根据配置文件来生成不同的Log,配置文件里我分为了3个等级。

参考

https://www.cnblogs.com/netcore5/articles/14611567.html

相关推荐
唐青枫13 分钟前
别滥用 Task.Run:C# 异步并发实操指南
c#·.net
我好喜欢你~7 小时前
C#---StopWatch类
开发语言·c#
一阵没来由的风11 小时前
拒绝造轮子(C#篇)ZLG CAN卡驱动封装应用
c#·can·封装·zlg·基础封装·轮子
zzzhpzhpzzz14 小时前
Win10快速安装.NET3.5
.net·win10
许泽宇的技术分享16 小时前
Windows MCP.Net:基于.NET的Windows桌面自动化MCP服务器深度解析
windows·自动化·.net
一枚小小程序员哈17 小时前
基于微信小程序的家教服务平台的设计与实现/基于asp.net/c#的家教服务平台/基于asp.net/c#的家教管理系统
后端·c#·asp.net
Eternity_GQM19 小时前
【Word VBA Zotero 引用宏错误分析与改正指南】【解决[21–23]参考文献格式插入超链接问题】
开发语言·c#·word
cimeo1 天前
【C 学习】06-算法&程序设计举例
c#
百锦再1 天前
.NET 的 WebApi 项目必要可配置项都有哪些?
java·开发语言·c#·.net·core·net
WYH2871 天前
C#控制台输入(Read()、ReadKey()和ReadLine())
开发语言·c#