我正在处理的Web应用程序使用log4net进行日志记录。项目的要求是连接字符串应加密。如何告诉log4net使用解密值?
例如:
<log4net>
<root>
<level value="Debug"/>
<appender-ref ref="AdoNetAppender"/>
</root>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1"/>
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<connectionString value="encryptedconnectionstringhere=="/>
有没有办法实现这个目标?
答案 0 :(得分:6)
当实现drumboog的答案时,由于无限递归的方法调用,我遇到了stackoverflow异常。这基本上就是我最终使用的。
public class CustomAdoNetAppender : AdoNetAppender
{
private string _connectionString;
protected override string ResolveConnectionString(out string connectionStringContext)
{
if(string.IsNullOrEmpty(_connectionString))
{
var decrypt = new MyDecyptionLib();
_connectionString = decrypt.MyDecryptionFunction(ConfigurationManager.AppSettings["Connection"]);
}
connectionStringContext = _connectionString;
return connectionStringContext;
}
}
...并在log4net配置部分
<appender name="AdoNetAppender" type="My.Name.Space.To.CustomAdoNetAppender">
答案 1 :(得分:3)
除了编写自定义appender之外,您还可以加密整个配置部分:
http://msdn.microsoft.com/en-us/library/zhhddkxy.aspx
Programmatically encrypting a config-file in .NET
修改强>
log4net是开源的,所以你也可以尝试查看他们的代码并自定义他们的appender以满足你的需求......也许是这样的:
public class DecryptConnectionStringAdoNetAppender : AdoNetAppender
{
protected override string ResolveConnectionString(out string connectionStringContext)
{
string result = base.ResolveConnectionString(out connectionStringContext);
if (String.IsNullOrEmpty(result))
{
return result;
}
else
{
Decrypt(result);
}
}
private string Decrypt(string encryptedValue)
{
// Your code goes here.
}
}
然后更新配置文件中appender
元素的type属性:
<appender name="AdoNetAppender" type="Your.Namespace.DecryptConnectionStringAdoNetAppender">