log4net 的用法

134 阅读2分钟

用例 1: App.Config + 代码设置配置文件中的值

步骤1:引用 log4net

  • 可以csproj 里添加对 log4net.dll 的引用

步骤2:在App.Config 文件里 添加对 log4net 的配置

  • %property{LOG_PATH}的值从 log4net.GlobalContext.Properties["LOG_PATH"]代码获得
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString" value="%property{LOG_PATH}\DemoProject-%date{yyyy-MM-dd-HH-mm-ss}.log" />
      <AppendToFile value="true" />
      <rollingStyle value="Size" />
      <MaxSizeRollBackups value="10" />
      <MaximumFileSize value="10MB" />
      <StaticLogFileName value="false" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date{yy-MM-dd HH:mm:ss} [%thread] [%-5level] %logger - %message %newline" />
      </layout>
    </appender>
    
    <root>
      <level value="All" />
      <appender-ref ref="RollingLogFileAppender" />
    </root>

  </log4net>
</configuration>

步骤3: 用代码告诉log4net 它的配置从哪里获取

配置文件中的值 也可以用代码指定: log4net.GlobalContext.Properties["配置文件中的值"] =

告诉log4net 它的配置从哪里获取: XmlConfigurator.Configure(new FileInfo(配置所在的文件的路径))

获得ILog: LogManager.GetLogger(loggerName)

using log4net;
using log4net.Config;

    public static class LogHelper
    {
        public static ILog InitLogger(string loggerName)
        {
            log4net.GlobalContext.Properties["LOG_PATH"] = "C:\Temp";

            var folder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            var configfilePath = Path.Combine(folder, "DemoProject.dll.config");
            if (File.Exists(configfilePath))
                XmlConfigurator.Configure(new FileInfo(configfilePath));
            else
                XmlConfigurator.Configure();
            return LogManager.GetLogger(loggerName);
        }
    }

步骤4:使用 logger

ILog 一般的做法是 获取之后 传递下去,而不是每次都重新获取。这样打的log 会在同一个文件中

ILog logger = LogHelper.InitLogger("AnyLoggerName");

logger.Info("info");

用例 2:App.Config + AssemblyInfo.cs

步骤1:引用 log4net

  • 可以csproj 里添加对 log4net.dll 的引用

步骤2:在App.Config 文件里 添加对 log4net 的配置

  • 和用例1相同

步骤3: 在AssemblyInfo.cs里 告诉log4net 它的配置从哪里获取

  • 在 AssemblyInfo.cs 的最后面添加下面这一行
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "DemoProject.dll.config", Watch = true)]

步骤4:使用 logger

这里的做法是: 为每一个Type重新获取 ILog

    public class LogHelper
    {
        private static readonly ConcurrentDictionary<Type, ILog> Loggers = new ConcurrentDictionary<Type, ILog>();
        
        private static ILog GetLogger(Type source)
        {
            if (Loggers.ContainsKey(source))
            {
                return Loggers[source];
            }
            else
            {
                ILog logger = LogManager.GetLogger(source);
                Loggers.TryAdd(source, logger);
                return logger;
            }
        }
    }
logger.Info("info");

用例 3:log4net.config

来自这篇文章: 链接

步骤1:引用 log4net

  • 安装Nuget package
    • 可以在Package Manager Console里执行下面的命令
    Install-Package log4net
    

步骤2:在log4net.config 文件里 添加对 log4net 的配置

在项目里添加 log4net.config 文件

  • log4net.config的 Copy to Output Directory设置为 Copy Always

image.png

<log4net>
    <root>
      <level value="ALL" />
      <appender-ref ref="console" />
      <appender-ref ref="file" />
    </root>
    <appender name="console" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %level %logger - %message%newline" />
      </layout>
    </appender>
    <appender name="file" type="log4net.Appender.RollingFileAppender">
      <file value="myapp.log" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="5" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
      </layout>
    </appender>
  </log4net>

步骤3: 在AssemblyInfo.cs里 告诉log4net 它的配置从哪里获取

  • 在 AssemblyInfo.cs 的最后面添加下面这一行
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]

步骤4:使用 logger

    class Program
    {
        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        static void Main(string[] args)
        {
            log.Info("Hello logging world!");
            Console.WriteLine("Hit enter");
            Console.ReadLine();
        }
    }

log4net level

  • All
  • Debug
  • Info
  • Warn
  • Error
  • Fatal
  • Off
 <appender name="file" type="log4net.Appender.RollingFileAppender">
     ...
    <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="INFO"/>
        <param name="LevelMax" value="INFO"/>
    </filter>
    ...
</appender>
 <appender name="file" type="log4net.Appender.RollingFileAppender">
     ...
    <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="DEBUG"/>
        <param name="LevelMax" value="FATAL"/>
    </filter>
    ...
</appender>

最小锁定 MinimalLock

  • 是在我查询 “如何能让多个进程同时访问一个log文件”时 查到的解决方案
  • 我发现有了这个设置以后,似乎可以在进程还开着的时候 删除掉正在使用的log文件文件
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
    ...
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    ...
</appender>

如何让log文件名中带上时间戳

  • type="log4net.Util.PatternString"必须加上,否则 %date{yyyy-MM-dd-HH-mm-ss}不生效
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
    <file type="log4net.Util.PatternString" value="C:\XXX-%date{yyyy-MM-dd-HH-mm-ss}.log" />
    ...
</appender>

设置 staticLogFileName

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="Logs\log-" />
    ...
    <param name="DatePattern" value="yyyy-MM-dd'.log'" />
    <staticLogFileName value="false" />
    ...
</appender>

<staticLogFileName value="false" />时,会输出

Logs\log-2018-01-30.log