用例 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
<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