侧边栏壁纸
博主头像
陌上花 博主等级

回首万事皆休

  • 累计撰写 69 篇文章
  • 累计创建 11 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Log4net基本使用

种向日葵的人
2024-08-30 / 0 评论 / 0 点赞 / 21 阅读 / 0 字

原因

  • 日志管理其实是一件很重要的事情,但是貌似一些开发中并不是很在意,但是我对于这一块还是觉得应该重视起来的,所以对于C#中使用比较广泛的包---log4net的使用做了一个基本的总结,同时也是为了方便日后可以直接使用。

安装

  • 安装截图
    185948.png

基本使用

配置

  • 可以新建一个配置文件,取名log4net
    log4net添加配置文件.png
  • 设置属性,复制到目录下。
    log4net复制到输出目录.png
  • 在配置文件内书写基本的配置信息,以下是我个人使用的配置,后续会继续补充,一开始了解也不是很多。
<configuration>
	<log4net>
		<!--用文本来记录日志-->
		<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
			<!--log存放的目录位置-->
			<file value="log\\"/>
			<!--是否在文件里追加-->
			<appendToFile value="true"/>
			<!--防止多线程时不能写Log,官方说是线程不安全的  所以指定最小锁-->
			<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
			<!--指定编码-->
			<encoding value="utf-8"/>
			<!--置为true,当前最新日志文件名永远为file节中的名字-->
			<staticLogFileName value="false"/>
			<!--为文件名追加的后缀  这里可以作为每一天的日志分别存储不同的文件-->
			<datePattern value="yyyyMM\\yyyyMMdd'.txt'" />
			<!--日志最大个数-->
			<!--rollingStyle节点为Size时,只能有value个日志文件-->
			<!--rollingStyle节点为Composite时,每天有value个日志-->
			<param name="MaxSizeRollBackups" value="100" />
			<!--可以为:Once|Size|Date|Composite-->
			<!--Composite为Size和Date的组合-->
			<!--<rollingStyle value="Composite" />-->
			<rollingStyle value="Date"/>
			<layout type="log4net.Layout.PatternLayout">
				<!--日志输出格式:时间  日志类型  日志内容-->
				<conversionPattern value="%newline %nDatetime:%date %nHostName:%property{log4net:HostName} %nThreadID:[%thread] %nLogLevel:  %-5level %nClassName:%logger property: [%property{NDC}] - %nDescription:%message%newline %n" />
			</layout>
		</appender>
		<!-- levels: OFF > FATAL > ERROR > WARN > INFO > DEBUG  > ALL -->
		<root>
			<level value="All" />
			<appender-ref ref="RollingLogFileAppender" />
		</root>
	</log4net>
</configuration>

使用

  • 注意以下三个方法使用一个就可以了的。

方法1

  • 需要在项目的App.config中添加对于log4net.config的引用,例如我的配置。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<startup>
		<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
	</startup>
	<!---指定配置文件的名称--->
	<appSettings>
        <add key="log4net.Config" value="Config/log4net.config"/>
        <add key="log4net.Config.Watch" value="True"/>
    </appSettings>
</configuration>

方法2

  • 在需要记录日志的地方引用命名空间using log4net;using log4net.Config;
  • 在需要记录日志的类上定义private static readonly ILog log = LogManager.GetLogger(typeof(Program));
  • 基本使用方法是:log.Debug("初始化form1");
using System.Windows.Forms;
using DevExpress.XtraBars.Ribbon;
using log4net;
using log4net.Config;


[assembly: XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
namespace WinFormsMain
{
    public partial class Form1 : Form
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(Program));
        public Form1()
        {
            InitializeComponent();
        }

        private void simpleButton1_Click(object sender, System.EventArgs e)
        {
            log.Debug("初始化form1");

        }
    }
}
  • 可以在项目的目录下看到有日志记录,注意是bin\debug\log下。

方法三

  • 以代码的形式加载日志
  public static class LoggerHelper
  {
      private static ILoggerRepository? logRepository { get; set; }

      private static ILog? _log;
      private static ILog log
      {
          get
          {
              if (_log == null)
                  ConfigureLogger();
              return _log;
          }
      }

      private static ILog ConfigureLogger(string respositoryName = "PQSoftLog", string logConfigFilePath = "log4net.config")
      {
          logRepository = LogManager.CreateRepository(respositoryName);
          XmlConfigurator.Configure(logRepository, new FileInfo(logConfigFilePath));
          _log = LogManager.GetLogger(respositoryName, "RollingLogFileAppender");
          return _log;
      }
      public static void Info(string msg, [CallerMemberName] string memberName = "") => log.Info($"{memberName}\t{msg}");
      public static void Debug(string msg, [CallerMemberName] string memberName = "") => log.Debug($"{memberName}\t{msg}");
      public static void Error(string msg, [CallerMemberName] string memberName = "") => log.Error($"{memberName}\t{msg}");
      public static void Warn(string msg, [CallerMemberName] string memberName = "") => log.Warn($"{memberName}\t{msg}");
      public static void Fatal(string msg, [CallerMemberName] string memberName = "") => log.Fatal($"{memberName}\t{msg}");

      public static void Error(Exception ex, [CallerMemberName] string memberName = "") => log.ErrorExt($"{memberName}\t{ex.Message}", ex);
  }

Tips

  • 还是比较推荐直接使用代码的形式加载,更加灵活而且易于配置。
0
博主关闭了所有页面的评论