NLog添加系统日志

1、引用NLog.Config

在使用NLog之前,我们要首先添加对NLog.Config的引用,这里小编使用NuGet来添加引用,在安装NLog.Config时会同时安装NLog.Schema和NLog包。

//输出日志:

//实例化Logger对象,默认logger的名称是当前类的名称(包括类所在的命名空间名称)
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
 //两种记录日志的方式
 logger.Log(LogLevel.Warn, "warning");
//Info方法表示日志级别是Info
logger.Info(() => "record logger info");

1.1、配置NLog.config文件

只有代码是不够的,要想让代码发挥作用还要进行相关配置。我们在添加NLog.Config包后,项目中会自动添加一个名为NLog.config的文件,针对NLog的配置就写在该文件中。

 1 <targets>
 2     <!--xsi:type表示日志的输出方式,File表示将日志写到文件中-->
 3     <target name="logfile" xsi:type="File"  fileName="C:/Logs/${shortdate}.txt" layout="${date:format=HH:mm:ss.fff}: ${message}"/>
 4     <!--xsi:type="Console"表示将日志信息打印到控制台上-->
 5     <target name="logConsole" xsi:type="Console"/>
 6 </targets>
 7 
 8 <rules>
 9     <logger name="*" minlevel="Info" writeTo="logfile"/>
10     <!--name指的是程序代码中logger对象的名字(默认是logger对象所在的命名空间名.类名),writeTo的值是配置文件中target的名字-->
11     <logger name="Test.Program" minlevel="Debug" writeTo="logConsole"/>
12 </rules>

日志在控制台中输出效果如下:

查看博客:https://www.cnblogs.com/Cwj-XFH/p/5822837.html

 其他配置文件:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="false"
      throwExceptions="true">
   <!--注意此处要是false, 当日志发生异常程序不会发生异常,对于调试来说不适用。项目发布时选择false,较妥当。-->
  <targets>
    <!--文件设置-->
    <target xsi:type ="File"  name="file"
    fileName="${basedir}/App_Data/Logs/${shortdate}.log"
    layout="${longdate} - ${level:uppercase=true}:${message} ${callsite:fileName=true} ${exception:format=Type,Message,Method,StackTrace:maxInnerExceptionLevel=5:innerFormat=ShortType,Message,Method,StackTrace}"
    keepFileOpen="false"
    archiveFileName="${basedir}/App_Data/Logs/Backup_${shortdate}.{##}.log"
    archiveNumbering="Sequence"
    archiveEvery="Day"
    maxArchiveFiles="30">
    </target>
    <!--数据库设置 ,注意此处必须这么填写,否则会提示创建连接异常-->
    <target xsi:type="Database" 
    name="database"
    dbProvider="System.Data.SqlClient" 
    connectionString="Server=DESKTOP-OCGH29Q;database=xx;integrated security=true;Connection Timeout=30;"> 
      
    <commandText>
      INSERT INTO log(event_time, level, logger, message, exce_type, operation,exce_message, stacktrace, username) VALUES (getDate(), @level, @logger, @message, @exce_type, @operation,@exce_message, @stacktrace, @username);
    </commandText>
      
    <parameter name="@level" layout="${level}" /> 
    <parameter name="@logger" layout="${logger}" />
    <parameter name="@message" layout="${message}" />
    <parameter name="@exce_type" layout="${exception:format=type}" />
    <parameter name="@operation" layout="${exception:format=method}" />
    <parameter name="@exce_message" layout="${exception:format=message}" />
    <parameter name="@stacktrace" layout="${exception:format=stacktrace}" />
    <parameter name="@username" layout="${identity}" />
    </target>
  </targets>
  <rules>
    <logger name="*" minlevel="Warn" writeTo="file" />
    <logger name="*" minlevel="Debug" maxlevel="Info" writeTo="database" />
  </rules>
</nlog>
其他的匹配方法

2、web项目添加sql日志

1、在DAO类库项目中用NuGet添加NLog包,并在该项目下,添加packages.config文件

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="NLog" version="4.5.6" targetFramework="net45" />
</packages>

2、在web 启动项项目中添加Nlog.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
  </configSections>
  <nlog autoReload="true" internalLogLevel="Trace" internalLogFile="logs/internalLog.txt">
    <targets>
      <target name="SQLDebugger" type="File" fileName="C:/logs/SQLDebugger-${shortdate}.log" layout="--${longdate} ${callsite} ${level}:${newline}${message}${newline}"/>
     
    </targets>
    <rules>
      <logger name="TSMember.DAL.SqlHelper" minlevel="Debug" maxlevel="Debug" writeTo="SQLDebugger" />
    </rules>
  </nlog>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
</configuration>
Nlog.config
public static class SqlExtensions
    {
        public static String ParameterValueForSQL(this SqlParameter sp)
        {
            String retval = "";

            switch (sp.SqlDbType)
            {
                case SqlDbType.Char:
                case SqlDbType.NChar:
                case SqlDbType.NText:
                case SqlDbType.NVarChar:
                case SqlDbType.Text:
                case SqlDbType.Time:
                case SqlDbType.VarChar:
                case SqlDbType.Xml:
                case SqlDbType.Date:
                case SqlDbType.DateTime:
                case SqlDbType.DateTime2:
                case SqlDbType.DateTimeOffset:
                    retval = "'" + sp.Value.ToString().Replace("'", "''") + "'";
                    break;

                //case SqlDbType.Bit:
                //    retval = bool.Parse(sp.Value.ToString()) ? "1" : "0";
                //    break;

                default:
                    retval = sp.Value.ToString().Replace("'", "''");
                    break;
            }

            return retval;
        }

        public static String ToFullSQL(this IDbCommand sc)
        {
            StringBuilder sql = new StringBuilder();
            Boolean FirstParam = true;

            sql.AppendLine("use " + sc.Connection.Database + ";");
            switch (sc.CommandType)
            {
                case CommandType.StoredProcedure:
                    sql.AppendLine("declare @return_value int;");

                    foreach (SqlParameter sp in sc.Parameters)
                    {
                        if ((sp.Direction == ParameterDirection.InputOutput) || (sp.Direction == ParameterDirection.Output))
                        {
                            sql.Append("declare " + sp.ParameterName + "	" + sp.SqlDbType.ToString() + "	= ");

                            sql.AppendLine(((sp.Direction == ParameterDirection.Output) ? "null" : sp.ParameterValueForSQL()) + ";");

                        }
                    }

                    sql.AppendLine("exec [" + sc.CommandText + "]");

                    foreach (SqlParameter sp in sc.Parameters)
                    {
                        if (sp.Direction != ParameterDirection.ReturnValue)
                        {
                            sql.Append((FirstParam) ? "	" : "	, ");

                            if (FirstParam) FirstParam = false;

                            if (sp.Direction == ParameterDirection.Input)
                                sql.AppendLine(sp.ParameterName + " = " + sp.ParameterValueForSQL());
                            else

                                sql.AppendLine(sp.ParameterName + " = " + sp.ParameterName + " output");
                        }
                    }
                    sql.AppendLine(";");

                    sql.AppendLine("select 'Return Value' = convert(varchar, @return_value);");

                    foreach (SqlParameter sp in sc.Parameters)
                    {
                        if ((sp.Direction == ParameterDirection.InputOutput) || (sp.Direction == ParameterDirection.Output))
                        {
                            sql.AppendLine("select '" + sp.ParameterName + "' = convert(varchar, " + sp.ParameterName + ");");
                        }
                    }
                    break;
                case CommandType.Text:
                    string query = sc.CommandText;
                    foreach (SqlParameter sp in sc.Parameters)
                    {
                        query = Regex.Replace(query, sp.ParameterName + @"([^w]|$)", sp.ParameterValueForSQL() + "$1");
                    }
                    sql.AppendLine(query);
                    break;
            }

            return sql.ToString();
        }
    }
SqlExtensions

调用:功能是把sql语句组全

private static void PrepareCommand(IDbCommand cmd, IDbConnection conn, IDbTransaction trans, CommandType cmdType, string cmdText, IDataParameter[] cmdParms)
        {
            if (conn.State != ConnectionState.Open)
            {
                conn.Open();
            }
            if (trans != null)
            {
                cmd.Transaction = trans;
            }
            cmd.Connection = conn;
            cmd.CommandText = cmdText;
            cmd.CommandType = cmdType;
            if (cmdParms != null)
            {
                foreach (IDataParameter parm in cmdParms)
                {
                    cmd.Parameters.Add(parm);


                }
            }
            logger.Debug(cmd.ToFullSQL()); //调用
        }
SqlHelper
原文地址:https://www.cnblogs.com/SmileSunday/p/9224693.html