.NET中使用NLog记录日志

在项目过程中需要使用到日志记录的时候之前使用的是log4net,在使用的过程中配置文件感觉有点冗余,由于没有深入,生成的error日志老是会出现在debug日志中,同时要删除日志文件的时候总是需要把站点或程序停止后才能删除,所以就想找下有没有简单点的日志框架,也就是下面介绍的Nlog

  • 配置灵活,简单——可以通过配置文件,也可通过程序代码配置
  • 写日志的过程中占用日志文件,随时可以删除日志文件
  • 日志文件格式、文件层级结构可配置(log4net也支持)
  • 日志输出方式多样化——文件、数据库等等(log4net也支持)
    参考地址:http://nlog-project.org/

基本使用

  1. nuget 安装NLog
  2. 新建NLog.config(*.exe.nlog/NLog.dll.nlog) 或者 在web.config(app.config)中添加配置文件

如果使用单独的配置文件、将该配置文件属性设置为始终复制

  1. 配置文件
<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>
  1. 使用
    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直接使用就可以了

  1. 日志工厂
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;
        }
    }
  1. 日志实例
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);
            }
        }
posted @ 2019-01-25 09:54  Pen丶  阅读(615)  评论(0编辑  收藏  举报