一、环境说明:
开发工具:vs2010 ,数据库:oracle 11g ,版本:log4net的目前最新版本1.2.13.0 ; Oracle.ManagedDataAccess.dll Version 4.121.1.0
二、官网dll准备
log4net http://mirrors.hust.edu.cn/apache//logging/log4net/binaries/log4net-1.2.13-bin-newkey.zip
Oracle.ManagedDataAccess.dll 官网 http://www.oracle.com/technetwork/topics/dotnet/downloads/index.html
三、实现步骤(以个人建立的项目为例子解说)
1、建立项目log4netTest5,把dll放在Lib文件内, 打开项目 引用 把dll 引入项目
2、建立log4net.config 配置文件(周公等网上的达人都详解的很清楚了,我就讲解oracle哪一部分)
注意: <appender name="AdoNetAppender_ORCL" type="log4net.Appender.OracleAppender">
数据驱动
<connectionType value="Oracle.ManagedDataAccess.Client.OracleConnection,Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
数据库连接串
<connectionString value="Data Source=//localhost:1521/orcl;User ID=user;Password=user;" />
还有
<commandText value="insert into SECURITY_LOG.NET
按照自己的实际情况自己修改
<?
3、自己实现 OracleAppender.cs 和OracleAppenderParameter.cs
(我直接取自http://www.cnblogs.com/hnsongbiao/p/4216147.html#commentform)
1 public class OracleAppender : BufferingAppenderSkeleton 2 { 3 // Fields 4 private static readonly Type declaringType = typeof(AdoNetAppender); 5 private string m_commandText; 6 private CommandType m_commandType = CommandType.Text; 7 private string m_connectionString; 8 private string m_connectionType; 9 private OracleCommand m_dbCommand; 10 private OracleConnection m_dbConnection; 11 protected ArrayList m_parameters = new ArrayList(); 12 private bool m_reconnectOnError = false; 13 private SecurityContext m_securityContext; 14 protected bool m_usePreparedCommand; 15 private bool m_useTransactions = true; 16 17 // Methods 18 public override void ActivateOptions() 19 { 20 base.ActivateOptions(); 21 this.m_usePreparedCommand = (this.m_commandText != null) && (this.m_commandText.Length > 0); 22 if (this.m_securityContext == null) 23 { 24 this.m_securityContext = SecurityContextProvider.DefaultProvider.CreateSecurityContext(this); 25 } 26 this.InitializeDatabaseConnection(); 27 this.InitializeDatabaseCommand(); 28 } 29 30 public void AddParameter(OracleAppenderParameter parameter) 31 { 32 this.m_parameters.Add(parameter); 33 } 34 35 protected virtual string GetLogStatement(LoggingEvent logEvent) 36 { 37 if (this.Layout == null) 38 { 39 this.ErrorHandler.Error("ADOAppender: No Layout specified."); 40 return ""; 41 } 42 StringWriter writer = new StringWriter(CultureInfo.InvariantCulture); 43 this.Layout.Format(writer, logEvent); 44 return writer.ToString(); 45 } 46 47 private void InitializeDatabaseCommand() 48 { 49 if ((this.m_dbConnection != null) && this.m_usePreparedCommand) 50 { 51 try 52 { 53 this.m_dbCommand = this.m_dbConnection.CreateCommand(); 54 this.m_dbCommand.CommandText = this.m_commandText; 55 this.m_dbCommand.CommandType = this.m_commandType; 56 } 57 catch (Exception exception) 58 { 59 this.ErrorHandler.Error("Could not create database command [" + this.m_commandText + "]", exception); 60 if (this.m_dbCommand != null) 61 { 62 try 63 { 64 this.m_dbCommand.Dispose(); 65 } 66 catch 67 { 68 } 69 this.m_dbCommand = null; 70 } 71 } 72 if (this.m_dbCommand != null) 73 { 74 try 75 { 76 foreach (OracleAppenderParameter parameter in this.m_parameters) 77 { 78 try 79 { 80 parameter.Prepare(this.m_dbCommand); 81 } 82 catch (Exception exception2) 83 { 84 this.ErrorHandler.Error("Could not add database command parameter [" + parameter.ParameterName + "]", exception2); 85 throw; 86 } 87 } 88 } 89 catch 90 { 91 try 92 { 93 this.m_dbCommand.Dispose(); 94 } 95 catch 96 { 97 } 98 this.m_dbCommand = null; 99 }100 }101 if (this.m_dbCommand != null)102 {103 try104 {105 this.m_dbCommand.Prepare();106 }107 catch (Exception exception3)108 {109 this.ErrorHandler.Error("Could not prepare database command [" + this.m_commandText + "]", exception3);110 try111 {112 this.m_dbCommand.Dispose();113 }114 catch115 {116 }117 this.m_dbCommand = null;118 }119 }120 }121 }122 123 private void InitializeDatabaseConnection()124 {125 try126 {127 this.m_dbConnection = new OracleConnection();128 this.m_dbConnection.ConnectionString = this.m_connectionString;129 using (this.SecurityContext.Impersonate(this))130 {131 this.m_dbConnection.Open();132 }133 }134 catch (Exception exception)135 {136 this.ErrorHandler.Error("Could not open database connection [" + this.m_connectionString + "]", exception);137 this.m_dbConnection = null;138 }139 }140 141 protected override void OnClose()142 {143 base.OnClose();144 if (this.m_dbCommand != null)145 {146 this.m_dbCommand.Dispose();147 this.m_dbCommand = null;148 }149 if (this.m_dbConnection != null)150 {151 this.m_dbConnection.Close();152 this.m_dbConnection = null;153 }154 }155 156 protected virtual Type ResolveConnectionType()157 {158 Type type;159 try160 {161 type = SystemInfo.GetTypeFromString(this.m_connectionType, true, false);162 }163 catch (Exception exception)164 {165 this.ErrorHandler.Error("Failed to load connection type [" + this.m_connectionType + "]", exception);166 throw;167 }168 return type;169 }170 171 protected override void SendBuffer(LoggingEvent[] events)172 {173 if (this.m_reconnectOnError && ((this.m_dbConnection == null) || (this.m_dbConnection.State != ConnectionState.Open)))174 {175 LogLog.Debug(declaringType, "OracleAppender: Attempting to reconnect to database. Current Connection State: " + ((this.m_dbConnection == null) ? "<null>" : this.m_dbConnection.State.ToString()));176 this.InitializeDatabaseConnection();177 this.InitializeDatabaseCommand();178 }179 if ((this.m_dbConnection != null) && (this.m_dbConnection.State == ConnectionState.Open))180 {181 if (this.m_useTransactions)182 {183 OracleTransaction dbTran = null;184 try185 {186 dbTran = this.m_dbConnection.BeginTransaction();187 this.SendBuffer(dbTran, events);188 dbTran.Commit();189 }190 catch (Exception exception)191 {192 if (dbTran != null)193 {194 try195 {196 dbTran.Rollback();197 }198 catch (Exception)199 {200 }201 }202 this.ErrorHandler.Error("Exception while writing to database", exception);203 }204 }205 else206 {207 this.SendBuffer(null, events);208 }209 }210 }211 212 protected virtual void SendBuffer(OracleTransaction dbTran, LoggingEvent[] events)213 {214 if (!this.m_usePreparedCommand)215 {216 throw new NotImplementedException();217 }218 if (this.m_dbCommand != null)219 {220 ArrayList list = null;221 foreach (OracleAppenderParameter parameter in this.m_parameters)222 {223 list = new ArrayList();224 OracleParameter parameter2 = this.m_dbCommand.Parameters[parameter.ParameterName];225 foreach (LoggingEvent event2 in events)226 {227 object obj2 = parameter.Layout.Format(event2);228 if (obj2.ToString() == "(null)")229 {230 obj2 = DBNull.Value;231 }232 list.Add(obj2);233 }234 parameter2.Value = list.ToArray();235 }236 this.m_dbCommand.ArrayBindCount = events.Length;237 this.m_dbCommand.ExecuteNonQuery();238 }239 }240 241 // Properties242 public string CommandText243 {244 get245 {246 return this.m_commandText;247 }248 set249 {250 this.m_commandText = value;251 }252 }253 254 public CommandType CommandType255 {256 get257 {258 return this.m_commandType;259 }260 set261 {262 this.m_commandType = value;263 }264 }265 266 protected OracleConnection Connection267 {268 get269 {270 return this.m_dbConnection;271 }272 set273 {274 this.m_dbConnection = value;275 }276 }277 278 public string ConnectionString279 {280 get281 {282 return this.m_connectionString;283 }284 set285 {286 this.m_connectionString = value;287 }288 }289 290 public bool ReconnectOnError291 {292 get293 {294 return this.m_reconnectOnError;295 }296 set297 {298 this.m_reconnectOnError = value;299 }300 }301 302 public SecurityContext SecurityContext303 {304 get305 {306 return this.m_securityContext;307 }308 set309 {310 this.m_securityContext = value;311 }312 }313 314 public bool UseTransactions315 {316 get317 {318 return this.m_useTransactions;319 }320 set321 {322 this.m_useTransactions = value;323 }324 }325 }
View Code
public class OracleAppenderParameter { // Fields private DbType m_dbType; private bool m_inferType = true; private IRawLayout m_layout; private string m_parameterName; private byte m_precision = 0; private byte m_scale = 0; private int m_size = 0; // Methods public virtual void FormatValue(OracleCommand command, LoggingEvent loggingEvent) { OracleParameter parameter = command.Parameters[this.m_parameterName]; parameter.Value = this.Layout.Format(loggingEvent); } public virtual void Prepare(OracleCommand command) { OracleParameter param = command.CreateParameter(); param.ParameterName = this.m_parameterName; if (!this.m_inferType) { param.DbType = this.m_dbType; } if (this.m_precision != 0) { param.Precision = this.m_precision; } if (this.m_scale != 0) { param.Scale = this.m_scale; } if (this.m_size != 0) { param.Size = this.m_size; } command.Parameters.Add(param); } // Properties public DbType DbType { get { return this.m_dbType; } set { this.m_dbType = value; this.m_inferType = false; } } public IRawLayout Layout { get { return this.m_layout; } set { this.m_layout = value; } } public string ParameterName { get { return this.m_parameterName; } set { this.m_parameterName = value; } } public byte Precision { get { return this.m_precision; } set { this.m_precision = value; } } public byte Scale { get { return this.m_scale; } set { this.m_scale = value; } } public int Size { get { return this.m_size; } set { this.m_size = value; } } }
View Code
4、实现CustomLayout.cs
ReflectionPatternConverter.cs文件
我浏览 誉满中华 博主的文章时,就想拿来就用呀,可惜博主太忙了 留言没有回复, 而且又急用用就自己下载了源码 参照源码和http://blog.csdn.net/kkkkkxiaofei/article/details/12946913 自己实现了一下,如有问题请留言指出
自定义字段时 一定要 先在 ReflectionPatternConverter.cs 中把自定义字段 映射好
然后 CustomLayout.cs 中
s_globalRulesRegistry = new Hashtable(2);
s_globalRulesRegistry.Add("USERID", typeof(USERIDPatternConverter));
s_globalRulesRegistry.Add("LOGTYPE", typeof(LOGTYPEPatternConverter));
绑定,有多少个自定义字段 就要在这两个cs中对应设置好,layout type 也要指定对地址
5、配置
Global.asax中 Application_Start里添加
log4net.Config.
AssemblyInfo.cs 中 添加
[assembly: log4net.Config.
6、测试一下
简单写个log。cs
private static ILog logOracle = log4net.LogManager.GetLogger("LogOracle");
public static void OracleInfo(Model.SECURITY_LOG4NET logMessage)
{
logOracle.Info(logMessage);
}
//测试写入
Model.SECURITY_LOG4NET model = new Model.SECURITY_LOG4NET();
model.USERID = System.Guid.NewGuid().ToString();
model.LOGTYPE = "Oracle.ManagedDataAccess.Client";
log.OracleInfo(model);
成功写入!
源码给大家做个参考: http://pan.baidu.com/s/1nUFvS 提取码 t45u
本文参考文章:
1、 http://www.cnblogs.com/lightnear/archive/2013/06/04/3117340.html 没有实现自定义 用 Oracle.DataAccess 驱动的
2、http://www.cnblogs.com/hnsongbiao/p/4216147.html#commentform
3、http://stackoverflow.com/questions/29614827/log4net-appender-adonetappender-connectiontype-oracle-manageddataaccess-client
4、http://blog.csdn.net/kkkkkxiaofei/article/details/12946913
5、http://zhoufoxcn.blog.51cto.com/792419/429988/
原标题:Log4net 自定义字段 写入Oracle 使用ODP.NET Managed驱动
关键词:.NET