zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    map的集合顺序怎么跟添加时候的顺序一样
    陕西电信开出的电子发票没有发票代码
    微擎密码忘了,password.php也不起作用
    使用composer require安装服务后 切记使用composer install 安装一下才能用
    激活 山东理工大学 jetrbins
    SpringBoot打包成可执行jar
    卸载windows服务
    cglib的动态代理
    cglib的使用
    FCKeditor使用
  • 原文地址:https://www.cnblogs.com/SmileSunday/p/9224693.html
Copyright © 2011-2022 走看看