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

相关推荐
hccee2 小时前
C# IO文件操作
开发语言·c#
广煜永不挂科4 小时前
Devexpress.Dashboard的调用二义性
c#·express
zhy8103026 小时前
.net6 使用 FreeSpire.XLS 实现 excel 转 pdf - docker 部署
pdf·.net·excel
初九之潜龙勿用6 小时前
C#校验画布签名图片是否为空白
开发语言·ui·c#·.net
慧都小妮子7 小时前
Spire.PDF for .NET【页面设置】演示:打开 PDF 时自动显示书签或缩略图
java·pdf·.net
吾与谁归in7 小时前
【C#设计模式(13)——代理模式(Proxy Pattern)】
设计模式·c#·代理模式
吾与谁归in7 小时前
【C#设计模式(14)——责任链模式( Chain-of-responsibility Pattern)】
设计模式·c#·责任链模式
神仙别闹8 小时前
基于C#和Sql Server 2008实现的(WinForm)订单生成系统
开发语言·c#
霍先生的虚拟宇宙网络9 小时前
.net 支持跨平台(桌面)系列技术汇总
.net
djk88889 小时前
.net的winfrom程序 窗体透明&打开窗体时出现在屏幕右上角
.net