|
@@ -0,0 +1,75 @@
|
|
|
+using NLog;
|
|
|
+using NLog.Config;
|
|
|
+using NLog.Targets;
|
|
|
+using System;
|
|
|
+using System.IO;
|
|
|
+using System.Reflection;
|
|
|
+
|
|
|
+namespace Wicture.DbRESTFul.Log.NLog
|
|
|
+{
|
|
|
+ public class DefaultNLogConfigProvider : INLogConfigProvider
|
|
|
+ {
|
|
|
+ public LoggingConfiguration Provide()
|
|
|
+ {
|
|
|
+ // Step 1. Create configuration object
|
|
|
+ var config = new LoggingConfiguration();
|
|
|
+
|
|
|
+ // Step 2. Create targets
|
|
|
+ var consoleTarget = new ColoredConsoleTarget("console")
|
|
|
+ {
|
|
|
+ Layout = @"${date:format=HH\:mm\:ss} ${level} ${message} ${exception}"
|
|
|
+ };
|
|
|
+ config.AddTarget(consoleTarget);
|
|
|
+
|
|
|
+ var fileTarget = new FileTarget("verbose")
|
|
|
+ {
|
|
|
+ FileName = "${basedir}/log/${shortdate}-verbose.log",
|
|
|
+ Layout = "${longdate} ${level} ${message} ${exception}"
|
|
|
+ };
|
|
|
+ config.AddTarget(fileTarget);
|
|
|
+
|
|
|
+ var errorTarget = GetDBLogger("error");
|
|
|
+ config.AddTarget(errorTarget);
|
|
|
+
|
|
|
+ // Step 3. Define rules
|
|
|
+ config.AddRuleForOneLevel(LogLevel.Error, errorTarget); // only errors to file
|
|
|
+ config.AddRuleForAllLevels(fileTarget); // all to console
|
|
|
+ config.AddRuleForAllLevels(consoleTarget); // all to console
|
|
|
+
|
|
|
+ return config;
|
|
|
+ }
|
|
|
+
|
|
|
+ // https://nlog-project.org/config/?tab=layout-renderers
|
|
|
+ private DatabaseTarget GetDBLogger(string dbName)
|
|
|
+ {
|
|
|
+ var path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "log");
|
|
|
+ if (!Directory.Exists(path)) Directory.CreateDirectory(path);
|
|
|
+
|
|
|
+ var target = new DatabaseTarget(dbName)
|
|
|
+ {
|
|
|
+ DBProvider = "System.Data.SQLite.SQLiteConnection, System.Data.SQLite",
|
|
|
+ ConnectionString = "Data Source=${basedir}/log/error.db;",
|
|
|
+ DBDatabase = "Log",
|
|
|
+ CommandText = "INSERT into Log(timestamp, logger, hostname, properties, stacktrace, message, exception) values(@timestamp, @logger, @hostname, @properties, @stacktrace, @message, @exception);",
|
|
|
+ };
|
|
|
+ target.Parameters.Add(new DatabaseParameterInfo { Name = "@timestamp", Layout = "${longdate}" });
|
|
|
+ target.Parameters.Add(new DatabaseParameterInfo { Name = "@logger", Layout = "${logger}" });
|
|
|
+ target.Parameters.Add(new DatabaseParameterInfo { Name = "@hostname", Layout = "${hostname}" });
|
|
|
+ target.Parameters.Add(new DatabaseParameterInfo { Name = "@properties", Layout = "${all-event-properties:separator=|}" });
|
|
|
+ target.Parameters.Add(new DatabaseParameterInfo { Name = "@stacktrace", Layout = "${callsite:includeNamespace=False:fileName=True}" });
|
|
|
+ target.Parameters.Add(new DatabaseParameterInfo { Name = "@message", Layout = "${message}" });
|
|
|
+ target.Parameters.Add(new DatabaseParameterInfo { Name = "@exception", Layout = "${exception:tostring}" });
|
|
|
+
|
|
|
+ target.InstallConnectionString = target.ConnectionString;
|
|
|
+ target.InstallDdlCommands.Add(new DatabaseCommandInfo
|
|
|
+ {
|
|
|
+ CommandType = System.Data.CommandType.Text,
|
|
|
+ Text = @"CREATE TABLE if not exists Log (timestamp TEXT, logger TEXT, hostname TEXT, properties TEXT, stacktrace TEXT, message TEXT, exception TEXT) "
|
|
|
+ });
|
|
|
+
|
|
|
+ target.Install(new InstallationContext(Console.Out));
|
|
|
+
|
|
|
+ return target;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|