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

本文介绍了如何在.NET项目中使用Apachelog4net库进行日志管理,包括添加NuGet包、创建自定义配置文件、设置不同级别的日志输出和文件命名规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

导入库

我们在工程里添加NuGet的包。输入名称log4net ,导入包。
在这里插入图片描述

创建配置文件

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

<?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>

使用类

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

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中

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

在这里插入图片描述
我们可以根据配置文件来生成不同的Log,配置文件里我分为了3个等级。

通过代码指定文件名

首先在配置文件中配置file

<file type="log4net.Util.PatternString" value="Log\%property{LogName}"/>

这里添加一个属性LogName

<appender name="ErrorLog" type="log4net.Appender.RollingFileAppender">
	<!--不加utf-8编码格式,中文字符将显示成乱码-->
	<param name="Encoding" value="utf-8" />
	<file type="log4net.Util.PatternString" value="Log\%property{LogName}"/>
	<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="ERROR" />
		<levelMax value="FATAL" />
	</filter>
</appender>

然后在代码中

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

    log4net.GlobalContext.Properties["LogName"] = fname+"_";
    logger = log4net.LogManager.GetLogger(" MMCEngine ");
    log4net.Config.XmlConfigurator.Configure(file);
    
}

这里要注意第一行我们就要设置属性LogName,然后再调用GetLogger

log4net.GlobalContext.Properties["LogName"] = fname+"_";

提示

如果使用了log4net来输出,要记得Log4net的实例化需要放在currentDoamin.ProcessExit += OnExitApp的后面,否则在程序退出的时候无法写入log。

参考

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thinbug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值