NLog添加系统日志
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>
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 + "\t" + sp.SqlDbType.ToString() + "\t= "); 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) ? "\t" : "\t, "); 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(); } }
调用:功能是把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()); //调用 }