将多线程 C# 与 .NET 控制台应用程序结合使用,我目前使用 NLog 记录到文件和数据库。 我写入几个不同的日志文件,具体取决于哪个"存储"处理事务。 我通过添加这样的file targets
来做到这一点:
var targetFileName = Path.Combine(Path.GetDirectoryName(fileName),
string.Format("{0}-{1}{2}", Path.GetFileNameWithoutExtension(fileName), name, Path.GetExtension(fileName)));
var target =
new FileTarget
{
FileName = targetFileName,
Layout = @"${date:format=yyyy-MM-dd HH:mm:ss.fff}|${level}|${threadid}|${logger}|${event-properties:item=StoreID}|${message}${exception:format=tostring}"
};
//Add async wrapper here
var asyncWrapper = new AsyncTargetWrapper
{
WrappedTarget = target,
QueueLimit = 20000,
OverflowAction = AsyncTargetWrapperOverflowAction.Discard
};
//Create rule
var rule = new LoggingRule(name, LogLevel.Trace, asyncWrapper);
LogManager.Configuration.LoggingRules.Add(rule);
//Add target
LogManager.Configuration.AddTarget(name, asyncWrapper);
//Tell logmanager to reconfigure itself
LogManager.ReconfigExistingLoggers();
然后,我可以使用LogManager.GetLogger(name)
来检索记录器。
在我的NLog.config中,我还登录到数据库<target name="Database" xsi:type="Database">
我每天都运行我的应用程序并关闭它。 使用文件目标,我可以通过创建新FileTarget
轻松地每天创建文件。
有没有办法对数据库做同样的事情? 当然,它需要以某种方式使用一些初始化代码创建......但我没有看到任何用于添加除"文件"目标以外的任何文档。
理想情况下,我每天都会创建一个新数据库(每次运行时(,文件名表示它运行的日期(就像我上面对 FileTarget 所做的那样(。
NLog中的所有内容都可以从配置文件(nlog.config(和代码中配置。
为此,您需要 DatabaseTarget(命名空间 NLog.Targets(。
属性的名称与 XML 属性匹配,因此文档位于此处:数据库目标。
小例子:
var config = new LoggingConfiguration();
config.AddRuleForAllLevels(new DatabaseTarget()
{
ConnectionString = "MyConnectionString",
CommandText = "INSERT .... ", //todo
Parameters =
{
new DatabaseParameterInfo("@message", "${message}"),
new DatabaseParameterInfo("@error", "${exception}"),
new DatabaseParameterInfo("@date", "${date}"){ DbType = "DbType.Date"},
}
});
LogManager.Configuration = config; // Apply config