.NET中使用NLog记录日志
在项目过程中需要使用到日志记录的时候之前使用的是log4net,在使用的过程中配置文件感觉有点冗余,由于没有深入,生成的error日志老是会出现在debug日志中,同时要删除日志文件的时候总是需要把站点或程序停止后才能删除,所以就想找下有没有简单点的日志框架,也就是下面介绍的Nlog
- 配置灵活,简单——可以通过配置文件,也可通过程序代码配置
- 写日志的过程中占用日志文件,随时可以删除日志文件
- 日志文件格式、文件层级结构可配置(log4net也支持)
- 日志输出方式多样化——文件、数据库等等(log4net也支持)
参考地址:http://nlog-project.org/
基本使用
- nuget 安装NLog
- 新建NLog.config(*.exe.nlog/NLog.dll.nlog) 或者 在web.config(app.config)中添加配置文件
如果使用单独的配置文件、将该配置文件属性设置为始终复制
- 配置文件
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="console" xsi:type="Console" />
<target name="debugger" xsi:type="Debugger" layout="${date:format=HH\:mm\:ss.fff}: ${message}" />
<target name="error_file" xsi:type="File"
fileName="${basedir}/Logs/Error/${shortdate}/error.txt" maxArchiveFiles="30"
layout="${longdate} | ${level:uppercase=false} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}" />
</targets>
<rules>
<logger name="*" writeTo="console" />
<logger name="*" minlevel="Debug" writeTo="debugger" />
<logger name="*" minlevel="Error" writeTo="error_file" />
</rules>
</nlog>
- 使用
private static Logger logger = LogManager.GetCurrentClassLogger();
static void Main(string[] args)
{
logger.Trace("Trace Message");
logger.Debug("Debug Message");
logger.Info("Info Message");
logger.Error("Error Message");
logger.Fatal("Fatal Message");
}
推荐使用
在实际项目过程中,我们的日志输出方式,日志输出格式等基本上都是固定的,很多时候就不想在每个项目中去配置NLog的配置文件,这个时候就可以通过代码来控制配置文件,于是我们可以把NLog+代码配置封装成直接的dll,其他项目只需要引用封装好的dll直接使用就可以了
- 日志工厂
internal class LogFactory
{
/// <summary>
/// 通过配置文件配置日志
/// </summary>
public LogFactory()
{
}
/// <summary>
/// 通过程序配置日志
/// </summary>
/// <param name="config"></param>
public LogFactory(LoggingConfiguration config)
{
LogManager.Configuration = config;
}
/// <summary>
/// 获取logger
/// </summary>
/// <param name="name">log Name</param>
/// <returns></returns>
public static ILogger CreateLogger(string name)
{
var logger = LogManager.GetLogger(name);
if (logger.Factory.Configuration == null)
{
// 没有找到配置文件时、使用默认的程序配置
LogManager.Configuration = DefaultConfig();
// 是否抛出内部异常
//LogManager.ThrowExceptions = true;
LogManager.ThrowConfigExceptions = true;
}
return logger;
}
/// <summary>
/// 默认日志配置
/// </summary>
/// <returns></returns>
public static LoggingConfiguration DefaultConfig()
{
var config = new LoggingConfiguration();
// 添加target
var debugTarget = new DebuggerTarget();
debugTarget.Layout = @"${longdate} | ${level:uppercase=false:padding=-5} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}";
var consoleTarget = new ColoredConsoleTarget();
consoleTarget.Layout = @"${longdate} | ${level:uppercase=false:padding=-5} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}";
var infoFileTarget = new FileTarget();
infoFileTarget.ArchiveAboveSize = 1024 * 1024 * 5;//每个文件最大5M
infoFileTarget.ArchiveNumbering = ArchiveNumberingMode.DateAndSequence;
infoFileTarget.ArchiveFileName = @"${basedir}/Logs/Info/{####}.txt";
infoFileTarget.FileName = @"${basedir}/Logs/Info/${shortdate}.txt";//当前文件路径
infoFileTarget.Layout = @"${longdate} | ${level:uppercase=false:padding=-5} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}";
var errorFileTarget = new FileTarget();
errorFileTarget.ArchiveAboveSize = 1024 * 1024 * 5;//每个文件最大5M
errorFileTarget.ArchiveNumbering = ArchiveNumberingMode.DateAndSequence;
errorFileTarget.ArchiveFileName = @"${basedir}/Logs/Error/{####}.txt";
errorFileTarget.FileName = @"${basedir}/Logs/Error/${shortdate}.txt";
errorFileTarget.Layout = @"${longdate} | ${level:uppercase=false:padding=-5} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}";
config.AddTarget("debug", debugTarget);
config.AddTarget("console", consoleTarget);
config.AddTarget("infoFile", infoFileTarget);
config.AddTarget("errorFile", errorFileTarget);
//添加rule
config.AddRuleForAllLevels(debugTarget);//所有日志都通过VS 输出窗口
config.AddRule(LogLevel.Debug, LogLevel.Fatal, consoleTarget);//DEBUG 以上都打印控制台
config.AddRuleForOneLevel(LogLevel.Info, infoFileTarget);//INFO写在Info文件
config.AddRule(LogLevel.Error, LogLevel.Fatal, errorFileTarget);//ERROR以上的写在error 文件
//Nlog 自身异常
InternalLogger.LogLevel = LogLevel.Error;
InternalLogger.LogFile = "C:\\InternalLog.txt";
return config;
}
}
- 日志实例
public class Loging
{
public static ILogger logger { get; private set; }
static Loging()
{
logger = LogFactory.CreateLogger("default");
}
public static void Trace(string message)
{
logger.Trace(message);
}
public static void Debug(string message)
{
logger.Debug(message);
}
public static void Debug(string message, Exception ex)
{
logger.Debug(ex, message);
}
public static void Info(string message)
{
logger.Info(message);
}
public static void Info(string message, Exception ex)
{
logger.Info(ex, message);
}
public static void Error(string message)
{
logger.Error(message);
}
public static void Error(string message, Exception ex)
{
logger.Error(ex, message);
}
public static void Fatal(string message)
{
logger.Fatal(message);
}
public static void Fatal(string message, Exception ex)
{
logger.Fatal(ex, message);
}
}
···
3. 使用日志
```csharp
public void Log()
{
Loging.Info("准备接收异常吧....");
try
{
var a = 0;
var b = 1 / a;
}
catch (Exception ex)
{
Loging.Error(ex.Message, ex);
}
}