C#使用NLog记录日志

NLog是什么?

    NLog是一个简单灵活的.NET日志记录类库,可以免费使用的开源代码。

   NLog日志输出什么类型?

    输出文本文件,如TXT文件

    输出控制台

    输出EMAIL邮件 

    输出数据库 

    输出Windows系统日志等等

    如何使用NLog组件?

      1)下载NLog组件

              通过VS2015NuGet下载组件,见图

下载NLogNLog.Config即可。

2)配置NLog.Config文件

关于NLog配置参数,请参考NLog官网:http://nlog-project.org/

源代码托管地址:https://github.com/nlog/NLog/wiki/Configuration-file

以下是我的配置文件中的关键配置代码,直接上代码:

<targets>

<!—事件日志到文本文件-->

<target xsi:type="File" name="file" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} || ${uppercase:${level}} ==>> ${message}" />

 

<!—事件日志到数据库(Oracle12c)-->

<target name="database" xsi:type="Database" keepConnection="false" useTransactions="true"

dbProvider="Oracle.ManagedDataAccess.Client"

connectionStringName="OraConnstr" <!—名称APP.CONFIG中的connectionStrings 中的NAME名称-->

commandText="insert into <>(APPNAME,MODULENAME,PROCNAME,OPERATIONTYPE,LOGGER,LOGMESSAGE,IP,LONGDATE,USERNAME,LOGLEVEL) values(:APPNAME,:MODULENAME,:PROCNAME,:OPERATIONTYPE,:LOGGER,:LOGMESSAGE,:IP,:TIME_STAMP,:USERNAME,:LOGLEVEL)"

commandType="Text" >

 

<parameter name="APPNAME" layout="${event-context:item=APPNAME}" />

<parameter name="MODULENAME" layout="${event-context:item=MODULENAME}" />

<parameter name="PROCNAME" layout="${event-context:item=PROCNAME}" />

<parameter name="OPERATIONTYPE" layout="${event-context:item=OPERATIONTYPE}" />

<parameter name="LOGGER" layout="${event-context:item=LOGGER}" />

<parameter name="LOGMESSAGE" layout="${event-context:item=LOGMESSAGE}" />

<parameter name="IP" layout="${event-context:item=IP}" />

<parameter name="TIME_STAMP" layout="${longdate}" />

<parameter name="USERNAME" layout="${event-context:item=USERNAME}" />

<parameter name="LOGLEVEL" layout="${level:uppercase=true}" />

<dbProvider>Oracle.ManagedDataAccess.Client</dbProvider>

</target>

 

<!—事件日志到 Visual Studio Output-->

<target name="debugger" xsi:type="Debugger" layout="NLog: ${date:format=HH:mm:ss} | ${level:uppercase=true:padding=-5} | ${message}" />

<!-- write log message to email-->

<target xsi:type="Mail" name="infoMail"

smtpServer="smtp.126.com"

smtpPort="25"

smtpAuthentication="Basic"

smtpUserName="你的126邮箱名字"

smtpPassword="你的126邮箱密码"

enableSsl="true"

addNewLines="true"

from="你的发送126邮箱地址 " <!—例如ssss@126.com-->

to="接收的邮箱地址 " <!—例如XXX@QQ.com-->

subject="主题名称 "

header="==============="

body="${newline}${message}${newline}"

footer="================"

encoding="UTF-8" />

</targets>

 

<rules>

<!—规则定义 -->

<logger name="*" minlevel="Debug" writeTo="file" />

<!--TRACE,DEBUG,INFO,WARN,ERROR,FATAL-->

<logger name="*" minlevel="Trace" writeTo="debugger" />

<!--INFO,WARN,ERROR,FATAL-->

<logger name="*" minlevel="Info" writeTo="database"/>

<!--SEND EMAIL-->

<logger name="*" minlevel="Error" writeTo="infoMail" />

</rules>

3NLog自定义类库封装

以下是主要代码:

  1. 日志类初始化

try

{

    if (File.Exists(CONFIGPATH))

    {

        StringBuilder sb = new StringBuilder(STRINGMAX);

        WinAPI.GetPrivateProfileString("LOGMANAGER", "DATALOGSOURCE", "", sb, STRINGMAX, CONFIGPATH);

        DATALOGSOURCE = sb.ToString();

        WinAPI.GetPrivateProfileString("LOGMANAGER", "DATALOGNAME", "", sb, STRINGMAX, CONFIGPATH);

        DATALOGNAME = sb.ToString();

        WinAPI.GetPrivateProfileString("LOGMANAGER", "MODE", "", sb, STRINGMAX, CONFIGPATH);

        LogMode = sb.ToString();

    }

    switch (LogMode)

    {

        case "1": //Txt文件记录日志

            break;

        case "2": //windows系统记录日志

            if (!EventLog.SourceExists(DATALOGSOURCE))

                EventLog.CreateEventSource(DATALOGSOURCE, DATALOGNAME);

            SysLog = new EventLog(DATALOGNAME);

            break;

        case "3": //数据库记录日志

            break;

        case "4": //发送邮件

            break;

    }

}

catch (Exception ex)

{

    throw new Exception(ex.Message);

}

  1. 写日志函数

public static void AddErrorLog(string msg, string APPNAME = "", string MODULENAME = "", string PROCNAME = "", string OPERATIONTYPE = "", string IP = "127.0.0.1", string USERNAME = "ADMIN", string LOGGER = "From")

{

    switch (LogMode)

    {

        case "1": //Txt文件记录日志

            logger.Error(msg);

            break;

        case "2": //windows系统记录日志

            SysLog.Source = DATALOGSOURCE;

            SysLog.WriteEntry(msg, EventLogEntryType.Error);

            break;

        case "3"://写数据库表

            WriteDB(msg, LogLevel.Error, APPNAME, MODULENAME, PROCNAME, OPERATIONTYPE, IP, USERNAME, LOGGER);

            break;

        case "4": //发送邮件

            logger.Error(msg);

            break;

    }

}

写数据库公共函数:

public static void WriteDB(string LOGMESSAGE, LogLevel Level, string APPNAME = "", string MODULENAME = "", string PROCNAME = "", string OPERATIONTYPE = "", string IP = "127.0.0.1", string USERNAME = "ADMIN", string LOGGER = "From")

{

    if (LOGMESSAGE.Length > 3000)

    {

        LOGMESSAGE = LOGMESSAGE.Substring(0, 3000);

    }

    LogEventInfo lei = new LogEventInfo();

    lei.Properties["ID"] = Guid.NewGuid().ToString("D");

    lei.Properties["APPNAME"] = APPNAME;

    lei.Properties["MODULENAME"] = MODULENAME;

    lei.Properties["PROCNAME"] = PROCNAME;

    lei.Properties["OPERATIONTYPE"] = OPERATIONTYPE;

    lei.Properties["LOGGER"] = LOGGER;

    lei.Properties["LOGMESSAGE"] = LOGMESSAGE;

    lei.Properties["IP"] = IP;

    lei.Properties["TIME_STAMP"] = DateTime.Now;

    lei.Properties["USERNAME"] = USERNAME;

    lei.Properties["LOGLEVEL"] = Level.Name;

    lei.Level = Level;

    logger.Log(lei);

}

  1. NLog自定义类库使用

直接调用写数据库:Log.AddErrorLog(ex.Message,"应用名称","模块名称","系统MAIN函数执行","自动","127.0.0.1",sysdata.curUserID,"Program");

可以修改sysconfig.ini文件的日志写入模式,见图

 

源代码我已上传到百度网盘:链接:https://pan.baidu.com/s/1utnhzcyZJ_7gpnALAsZWDA

有需要的朋友可以加我微信:dj1348822213

 

原文地址:https://www.cnblogs.com/djzxjblogs/p/9337355.html