/// <summary /> protected virtual void Log(string level, string message, string container, Exception exception, IDictionary <string, object> additionalData, IDictionary <string, object> metaData) { try { if (string.IsNullOrWhiteSpace(container)) { var stackTrace = new StackTrace(); StackFrame[] stackFrames = stackTrace.GetFrames(); if (stackFrames != null) { foreach (StackFrame frame in stackFrames) { MethodBase method = frame.GetMethod(); if (method.ReflectedType == null) { continue; } try { bool found = false; if (!ExclusionNamespaces.Any(@namespace => method.ReflectedType.FullName.StartsWith(@namespace))) { container = string.Format("{0}.{1}", method.ReflectedType.FullName, method.Name); found = true; } if (found) { break; } } catch { // Just move on } } } } } catch { // Just move on } var logInformation = new LogInformation { Level = level, Message = message, Container = container, AdditionalData = additionalData }; try { logInformation.Exception = JsonConvert.SerializeObject(exception, DefaultJsonSerializerSettings); } catch (JsonSerializationException) { } try { logInformation.MetaData = JsonConvert.SerializeObject(metaData, DefaultJsonSerializerSettings); } catch (JsonSerializationException) { } try { logInformation.CorrolationId = CorrelationIdHelper.GetCorrelationId(); } catch (NullReferenceException) { logInformation.CorrolationId = Guid.Empty; } Log(() => PersistLog(logInformation), logInformation.Level, logInformation.Container); }
/// <summary> /// Persists (or saves) the provided <paramref name="logInformation"></paramref> to the database /// </summary> /// <param name="logInformation">The <see cref="LogInformation"/> holding all the information you want to persist (save) to the database.</param> protected abstract void PersistLog(LogInformation logInformation);
/// <summary> /// Persists (or saves) the provided <paramref name="logInformation"></paramref> to the database /// </summary> /// <param name="logInformation">The <see cref="LogInformation"/> holding all the information you want to persist (save) to the database.</param> protected override void PersistLog(LogInformation logInformation) { try { using (IDbConnection dbConnection = GetDbConnection(GetSqlConnectionString())) { dbConnection.Open(); IDbCommand command = GetCommand(); command.Connection = dbConnection; command.CommandType = CommandType.Text; using (IDbTransaction dbTransaction = GetWriteTransaction(dbConnection)) { command.Transaction = dbTransaction; command.CommandText = GetInsertStatement(); IDbDataParameter raisedParameter = command.CreateParameter(); raisedParameter.DbType = DbType.DateTime; raisedParameter.Direction = ParameterDirection.Input; raisedParameter.ParameterName = "@Raised"; raisedParameter.Value = logInformation.Raised; command.Parameters.Add(raisedParameter); IDbDataParameter moduleParameter = command.CreateParameter(); moduleParameter.DbType = DbType.String; moduleParameter.Direction = ParameterDirection.Input; moduleParameter.ParameterName = "@Module"; moduleParameter.Value = LoggerSettings.ModuleName; command.Parameters.Add(moduleParameter); IDbDataParameter instanceParameter = command.CreateParameter(); instanceParameter.DbType = DbType.String; instanceParameter.Direction = ParameterDirection.Input; instanceParameter.ParameterName = "@Instance"; instanceParameter.Value = LoggerSettings.Instance; command.Parameters.Add(instanceParameter); IDbDataParameter environmentParameter = command.CreateParameter(); environmentParameter.DbType = DbType.String; environmentParameter.Direction = ParameterDirection.Input; environmentParameter.ParameterName = "@Environment"; environmentParameter.Value = LoggerSettings.Environment; command.Parameters.Add(environmentParameter); IDbDataParameter environmentInstanceParameter = command.CreateParameter(); environmentInstanceParameter.DbType = DbType.String; environmentInstanceParameter.Direction = ParameterDirection.Input; environmentInstanceParameter.ParameterName = "@EnvironmentInstance"; environmentInstanceParameter.Value = LoggerSettings.EnvironmentInstance; command.Parameters.Add(environmentInstanceParameter); IDbDataParameter correlationIdParameter = command.CreateParameter(); correlationIdParameter.DbType = DbType.Guid; correlationIdParameter.Direction = ParameterDirection.Input; correlationIdParameter.ParameterName = "@CorrelationId"; correlationIdParameter.Value = logInformation.CorrolationId; command.Parameters.Add(correlationIdParameter); IDbDataParameter levelParameter = command.CreateParameter(); levelParameter.DbType = DbType.String; levelParameter.Direction = ParameterDirection.Input; levelParameter.ParameterName = "@Level"; levelParameter.Value = logInformation.Level ?? (object)DBNull.Value; command.Parameters.Add(levelParameter); IDbDataParameter messageParameter = command.CreateParameter(); messageParameter.DbType = DbType.String; messageParameter.Direction = ParameterDirection.Input; messageParameter.ParameterName = "@Message"; messageParameter.Value = logInformation.Message ?? (object)DBNull.Value; command.Parameters.Add(messageParameter); IDbDataParameter containerParameter = command.CreateParameter(); containerParameter.DbType = DbType.String; containerParameter.Direction = ParameterDirection.Input; containerParameter.ParameterName = "@Container"; containerParameter.Value = logInformation.Container ?? (object)DBNull.Value; command.Parameters.Add(containerParameter); IDbDataParameter exceptionParameter = command.CreateParameter(); exceptionParameter.DbType = DbType.String; exceptionParameter.Direction = ParameterDirection.Input; exceptionParameter.ParameterName = "@Exception"; exceptionParameter.Value = logInformation.Exception ?? (object)DBNull.Value; command.Parameters.Add(exceptionParameter); if (logInformation.AdditionalData != null) { foreach (string key in logInformation.AdditionalData.Keys) { object value = logInformation.AdditionalData[key]; IDbDataParameter additionalDataParameter = command.CreateParameter(); additionalDataParameter.DbType = DbType.String; additionalDataParameter.Direction = ParameterDirection.Input; additionalDataParameter.ParameterName = string.Format("@{0}", key); additionalDataParameter.Value = value != null?JsonConvert.SerializeObject(value) : (object)DBNull.Value; command.Parameters.Add(additionalDataParameter); string tableName = LoggerSettings.SqlDatabaseTableName; command.CommandText = command.CommandText .Replace(", " + tableName + ".MetaData", string.Format(", " + tableName + ".MetaData, " + tableName + ".{0}", key)) .Replace(", @MetaData", string.Format(", @MetaData, @{0}", key)); } } IDbDataParameter metaDataParameter = command.CreateParameter(); metaDataParameter.DbType = DbType.String; metaDataParameter.Direction = ParameterDirection.Input; metaDataParameter.ParameterName = "@MetaData"; metaDataParameter.Value = logInformation.MetaData ?? (object)DBNull.Value; command.Parameters.Add(metaDataParameter); command.ExecuteNonQuery(); dbTransaction.Commit(); } } } catch (Exception exception) { Trace.TraceError("Persisting log failed with the following exception:\r\n{0}\r\n{1}", exception.Message, exception.StackTrace); } }