Nlog には、ログをデータベースに書き込む機能があります。
これを行うには、nlog 構成または Web 構成でユーザー/パスを指定する必要があります。
暗号化する方法はありますか?
Encrypting Passwords in a .NET app.config File をご覧ください。
次のクラスをプロジェクトに追加します。
class Encryption
{
static byte[] entropy = System.Text.Encoding.Unicode.GetBytes("Add some entropy");
public static string EncryptString(System.Security.SecureString input)
{
byte[] encryptedData = System.Security.Cryptography.ProtectedData.Protect(
System.Text.Encoding.Unicode.GetBytes(ToInsecureString(input)),
entropy,
System.Security.Cryptography.DataProtectionScope.CurrentUser);
return Convert.ToBase64String(encryptedData);
}
public static SecureString DecryptString(string encryptedData)
{
try
{
byte[] decryptedData = System.Security.Cryptography.ProtectedData.Unprotect(
Convert.FromBase64String(encryptedData),
entropy,
System.Security.Cryptography.DataProtectionScope.CurrentUser);
return ToSecureString(System.Text.Encoding.Unicode.GetString(decryptedData));
}
catch
{
return new SecureString();
}
}
public static SecureString ToSecureString(string input)
{
SecureString secure = new SecureString();
foreach (char c in input)
{
secure.AppendChar(c);
}
secure.MakeReadOnly();
return secure;
}
public static string ToInsecureString(SecureString input)
{
string returnValue = string.Empty;
IntPtr ptr = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(input);
try
{
returnValue = System.Runtime.InteropServices.Marshal.PtrToStringBSTR(ptr);
}
finally
{
System.Runtime.InteropServices.Marshal.ZeroFreeBSTR(ptr);
}
return returnValue;
}
}
次の構文を使用して、暗号化されたパスワード文字列を取得します。
var encryptedPassword = Encryption.EncryptString(
Encryption.ToSecureString("yourPassword"));
encryptedPassword
設定ファイルで、クリア パスワードをデータベース ターゲットの内容に置き換えてください。
<target xsi:type="Database"
name="d1"
dbUserName="log"
dbProvider="System.Data.SqlClient"
dbDatabase="NLog"
dbPassword="AQAAA... + the rest of the encryptedPassword string"
dbHost="TheLogServer"
commandText="INSERT INTO [LOG] VALUES (@p)">
<parameter layout="${longdate}|${level:uppercase=true}|${logger}|${message}" name="p" />
</target>
現在のクラス ロガーのを置き換えDBPassword
、復号化されたパスワードでロガーを返すメソッドを作成します。
static Logger logger = GetLogger();
private static Logger GetLogger()
{
var logger = LogManager.GetCurrentClassLogger();
var d1 = (DatabaseTarget)logger.Factory.Configuration
.AllTargets.Where(t => t.Name == "d1").FirstOrDefault();
d1.DBPassword = Encryption.ToInsecureString(
Encryption.DecryptString(((NLog.Layouts.SimpleLayout)(d1.DBPassword)).Text));
return logger;
}
今までと同じようにロガーを使用します。
static void Main(string[] args)
{
LogEventInfo myEvent = new LogEventInfo(LogLevel.Debug, "", "My debug message");
myEvent.LoggerName = logger.Name;
myEvent.Properties.Add("MyCustomValue", "This is from MyClass");
logger.Log(myEvent);
}