NLog日志封装和配置(C#)

NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码。
NLog是一个简单灵活的.NET日志记录类库。通过使用NLog,我们可以在任何一种.NET语言中输出带有上下文的(contextual information)调试诊断信息,根据喜好配置其表现样式之后发送到一个或多个输出目标(target)中。

简单的说可以用NLog记录系统中的日志,尤其是项目上线以后在线上如果出现问题,没有日志将很难定位到问题。

NLog下载http://nlog-project.org/download/

下面主要是我在项目中封装的一个日志类,以及NLog的配置文件。

需要引用dll,NLog.dll ,命名空间:

using NLog;
using NLog.Config;

封装的日志类为:

/// <summary>
/// 项目日志封装
/// </summary>
public class Logs
{
    private static Logger logger = LogManager.GetCurrentClassLogger(); //初始化日志类

    /// <summary>
    /// 日志状态枚举
    /// </summary>
    private enum LogState
    {
        /// <summary>
        /// 用户已登录
        /// </summary>
        NLogin,
        /// <summary>
        /// 用户未登录
        /// </summary>
        YLogin,
    }

    /// <summary>
    /// 静态构造函数
    /// </summary>
    static Logs()
    {
        //初始化配置日志
        LogManager.Configuration = new XmlLoggingConfiguration(System.AppDomain.CurrentDomain.BaseDirectory.ToString() + "\\Demo\\NLog.config");
    }

    /// <summary>
    /// 日志写入通用方法(建议使用)
    /// </summary>
    /// <param name="msg">日志内容</param>
    /// <param name="logType"> 日志类别
    ///     类别: 1.Debug
    ///           2.Info
    ///           3.Error
    ///           4.Fatal
    ///           5.Warn
    /// </param>
    /// <param name="loginState">登录状态  true:有用户登录信息 false 无用户登录信息</param>
    /// <remarks>
    ///     注:默认类型为Info 可以配置其他日志 logType用于反射 规则一定要准确
    ///     例:  1.默认日志 LogWriter("test log");   正常的业务日志
    ///          2.异常日志 LogWriter("test log","Fatal");  try catch 里请使用这个日志级别
    ///     
    /// </remarks>
    public static void LogWriter(String msg, String logType = "Info", bool loginState = true)
    {
        try
        {
            String logMethod = "";  //调用者类名和方法名
            if (logType == "Fatal")
            {
                StackTrace trace = new StackTrace();
                //获取是哪个类来调用的  
                String invokerType = trace.GetFrame(1).GetMethod().DeclaringType.Name;
                //获取是类中的那个方法调用的  
                String invokerMethod = trace.GetFrame(1).GetMethod().Name;
                logMethod = invokerType + "." + invokerMethod + " | ";
            }

            String IP = HttpContext.Current.Request.UserHostAddress;   //获取IP
            //反射执行日志方法
            Type type = typeof(Logger);
            MethodInfo method = type.GetMethod(logType, new Type[] { typeof(String) });
            if (loginState == true)
            {
                //如果是登陆状态 可以记录用户的登陆信息 比如用户名,Id等
                method.Invoke(logger, new object[] { logMethod + msg + " [ " + IP + " | " + LogState.NLogin + " ]" });
            }
            else
            {
                method.Invoke(logger, new object[] { logMethod + msg + " [ " + IP + " | " + LogState.NLogin + " ]" });
            }
        }
        catch
        {
            //日志代码错误,直接记录日志
            Fatal(msg);
            Warn(msg);
        }
    }

    /// <summary>
    /// 调试日志
    /// </summary>
    /// <param name="msg">日志内容</param>
    private static void Debug(String msg)
    {
        logger.Debug(msg);
    }

    /// <summary>
    /// 信息日志
    /// </summary>
    /// <param name="msg">日志内容</param>
    /// <remarks>
    ///     适用大部分场景
    ///     1.记录日志文件
    /// </remarks>
    private static void Info(String msg)
    {
        logger.Info(msg);
    }

    /// <summary>
    /// 错误日志
    /// </summary>
    /// <param name="msg">日志内容</param>
    /// <remarks>
    ///     适用异常,错误日志记录
    ///     1.记录日志文件
    /// </remarks>
    private static void Error(String msg)
    {
        logger.Error(msg);
    }

    /// <summary>
    /// 严重致命错误日志
    /// </summary>
    /// <param name="msg">日志内容</param>
    /// <remarks>
    ///     1.记录日志文件
    ///     2.控制台输出
    /// </remarks>
    private static void Fatal(String msg)
    {
        logger.Fatal(msg);
    }

    /// <summary>
    /// 警告日志
    /// </summary>
    /// <param name="msg">日志内容</param>
    /// <remarks>
    ///     1.记录日志文件
    ///     2.发送日志邮件
    /// </remarks>
    private static void Warn(String msg)
    {
        try
        {
            logger.Warn(msg);
        }
        catch { }
    }
}

如果是后台服务或者只简单记下日记 可以直接用

logger.Info(msg);
logger.Fatal(msg);

这样记录日志。
我这里写了个入口LogWriter用于统一调用,方便以后修改日志或者切换其他日志。


日志的配置文件为NLog.config,NLog的配置可以放在Web.config中,也可以放在单独的文件中,这里为了项目好维护,把配置放到一个单独的文件中,具体配置的内容为:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" throwExceptions="true">

  <targets xsi:type="AsyncWrapper">
    <!--保存至文件-->
    <target name="log_file" xsi:type="File" 
                    fileName="${basedir}/Logs/${shortdate}/${level:uppercase=false:padding=-5}.txt"
                    layout="${longdate} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}" />
    <!--输出至Debugger-->
    <target name="debugger" xsi:type="Debugger" 
            layout="NLog: ${date:format=HH\:mm\:ss} | ${message}" />
    <!--输出至控制台-->
    <target name="console" xsi:type="ColoredConsole" layout="${longdate} ${message} ${exception:format=tostring}"></target>
    <!--输出至邮件-->
     <target xsi:type="Mail" name="infoMail"
          smtpServer="smtp.163.com"  
          smtpPort="25"  
          smtpAuthentication="Basic"  
          smtpUserName="deno@163.com"   
          smtpPassword="demo"  
          enableSsl="true"  
          addNewLines="true"  
          from="demo@163.com"  
          to="demo@qq.com"  
          subject="Project Exception Mail"
          header="*********************"  
          body="${longdate} | ${message} "
          footer="*********************"/>
  </targets>


  <rules>
    <logger name="*" level="Info" writeTo="log_file" />
    <logger name="*" levels="Error" writeTo="log_file" />
    <logger name="*" levels="Debug" writeTo="log_file" />
    <!--<logger name="*" level="Debug" writeTo="debugger" />-->
    <!--<logger name="*" level="Fatal" writeTo="console" />-->
    <logger name="*" level="Fatal" writeTo="log_file" />
    <!--<logger name="*" level="Warn" writeTo="infoMail" />-->
    <logger name="*" level="Warn" writeTo="log_file" />
  </rules>
</nlog>

好了,这样就可以使用NLog来记录日志了。

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值