首页 > 技术文章 > C# 使用log4net写日记与纯代码实现log4net日记

wangyonglai 2018-06-29 14:27 原文

方法一 配置文件实现

一 导入LOG4NET

打开VS2012 工具》》库程序包管理器》》管理解决方案的NuGet程序包,搜索LOG4NET,如下图

 

二 添加配置文件log4net.config

在配置文件中添加一下代码

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>

  </system.web>
  <configSections>
    <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
  </configSections>
  <log4net>
    <logger name="logerror">
      <level value="ERROR" />
      <appender-ref ref="ErrorAppender" />
    </logger>
    <logger name="loginfo">
      <level value="INFO" />
      <appender-ref ref="InfoAppender" />
    </logger>
    <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="Log\\LogError\\" />
      <param name="AppendToFile" value="true" />
      <param name="MaxSizeRollBackups" value="100" />
      <param name="MaxFileSize" value="10240" />
      <param name="StaticLogFileName" value="false" />
      <param name="DatePattern" value="yyyyMMdd&quot;.txt&quot;" />
      <param name="RollingStyle" value="Date" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%n异常时间:%d %n异常级别:%-5p%n异常内容:%m%n" />
      </layout>
    </appender>
    <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="Log\\LogInfo\\" />
      <param name="AppendToFile" value="true" />
      <param name="MaxFileSize" value="10240" />
      <param name="MaxSizeRollBackups" value="100" />
      <param name="StaticLogFileName" value="false" />
      <param name="DatePattern" value="yyyyMMdd&quot;.txt&quot;" />
      <param name="RollingStyle" value="Date" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="日志时间:%d %n日志级别:%-5p  %n日志内容:%m%n%n" />
      </layout>
    </appender>
  </log4net>

</configuration>

三 添加Log4netHelper类

插入代码

 1 using log4net;
 2 
 3 //
 4 ///
 5 
 6 public class Log4netHelper
 7     {
 8         private static readonly ILog loginfo = LogManager.GetLogger("loginfo");
 9 
10         private static readonly ILog logerror = LogManager.GetLogger("logerror");
11         /// <summary>
12         /// 记录错误日志
13         /// </summary>
14         /// <param name="info"></param>
15         /// <param name="ex"></param>
16         public static void WriteErrorLog(string info, Exception ex)
17         {
18             if (logerror.IsErrorEnabled)
19             {
20                 logerror.Error(info, ex);
21             }
22         }
23         /// <summary>
24         /// 记录一般信息
25         /// </summary>
26         /// <param name="info"></param>
27         public static void WriteInfoLog(string info)
28         {
29             if (loginfo.IsInfoEnabled)
30             {
31                 loginfo.Info(info);
32             }
33         }
34 
35     }

 

四 调用Log4netHelper 的函数

........
.......

try{
    
}
catch (Exception ex)
                    {
                        Log4netHelper.WriteErrorLog("测试", ex);
                    }

 最后一点要添加以下代码

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]

可以在AssemblyInfo.cs类中添加或在初始化程序中添加

 

方法二 纯代码实现

using log4net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Log
{
    public class Log4netHelper
    {
        private static ILog loginfo;//= LogManager.GetLogger("loginfo");

        private static ILog logerror;// = LogManager.GetLogger("logerror");

        private static ILog logwarning;// = LogManager.GetLogger("logwarning");

        /// <summary>
        /// 记录错误日志
        /// </summary>
        /// <param name="info"></param>
        /// <param name="ex"></param>
        public static void WriteErrorLog(string info, Exception ex)
        {
            logerror = GetLoggerByName("error");
            if (logerror.IsErrorEnabled)
            {
                logerror.Error(info, ex);

            }

        }

        /// <summary>
        /// 记录一般信息
        /// </summary>
        /// <param name="info"></param>
        public static void WriteInfoLog(string info)
        {
            loginfo = GetLoggerByName("info");
            if (loginfo.IsInfoEnabled)
            {
                loginfo.Info(info);

            }

        }
        /// <summary>
        /// 警告信息
        /// </summary>
        /// <param name="info"></param>
        public static void WriteWarning(string info)
        {
            logwarning = GetLoggerByName("warn");
            if (logwarning.IsWarnEnabled)
            {
                logwarning.Warn(info);

            }

        }

        /// <summary>
        /// 删除日志
        /// </summary>
        public static void DeleteLogFile()
        {
            DeleteLog(logerror);
            DeleteLog(loginfo);
            DeleteLog(logwarning);
        }

        private static void DeleteLog(ILog log)
        {
            Task.Run(() =>
            {
                var apps = log.Logger.Repository.GetAppenders();
                if (apps.Length <= 0) return;
                var now = DateTime.UtcNow.AddDays(-10);//删除10之前日志
                foreach (var item in apps)
                {
                    if (item is log4net.Appender.RollingFileAppender)
                    {
                        log4net.Appender.RollingFileAppender roll = item as log4net.Appender.RollingFileAppender;
                        var dir = System.IO.Path.GetDirectoryName(roll.File);
                        var files = System.IO.Directory.GetFiles(dir, "*.log");

                        foreach (var filepath in files)
                        {
                            var file = new System.IO.FileInfo(filepath);
                            if (file.CreationTimeUtc < now)
                            {
                                try
                                {
                                    file.Delete();
                                }
                                catch
                                { }
                            }
                        }
                    }
                }
            });
        }


        static ILog GetLoggerByName(string name)
        {
            if (LogManager.Exists(name) == null)
            {
                log4net.Appender.RollingFileAppender appender = new log4net.Appender.RollingFileAppender();
                appender.File = @"Log\\" + name + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".log";
                appender.AppendToFile = true;
                appender.MaxSizeRollBackups = 10;
                appender.MaximumFileSize = "10MB";
                appender.StaticLogFileName = false;//是否采用静态文件名。
                appender.RollingStyle = log4net.Appender.RollingFileAppender.RollingMode.Size;
                appender.Layout = new log4net.Layout.PatternLayout("%n异常时间:%d %n异常级别:%-5p%n异常内容:%m%n");
                appender.ActivateOptions();// 这个要调用一下呢
                log4net.Repository.Hierarchy.Hierarchy hierarchy = (log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository();
                log4net.Repository.Hierarchy.Logger loger = hierarchy.GetLogger(name, hierarchy.LoggerFactory); //!!! 此处写法是重点,不容更改
                //log4net.Repository.Hierarchy.Logger loger = hierarchy.LoggerFactory.CreateLogger((log4net.Repository.ILoggerRepository)hierarchy, name);
                loger.Hierarchy = hierarchy;
                //loger.Parent = hierarchy.Root;
                //loger.AddAppender((log4net.Appender.IAppender)appender);
                loger.AddAppender(appender);
                loger.Level = GetLoggerLevel(name);
                loger.Repository.Configured = true;
                //log4net.Config.BasicConfigurator.Configure(appender);

            }
            return LogManager.GetLogger(name);
        }

        static log4net.Core.Level GetLoggerLevel(string level)
        {
            if (!string.IsNullOrEmpty(level))
            {
                switch (level.ToLower().Trim())
                {
                    case "debug":
                        return log4net.Core.Level.Debug;
                    case "info":
                        return log4net.Core.Level.Info;
                    case "warn":
                        return log4net.Core.Level.Warn;
                    case "error":
                        return log4net.Core.Level.Error;
                    case "fatal":
                        return log4net.Core.Level.Fatal;
                }
            }
            return log4net.Core.Level.Info;
        }


        

    }
}

 

推荐阅读