我在搜索c#的日志框架,我可以从代码中轻松设置日志文件名。
我的程序启动了几个后台工作程序,它们都应该登录到自己的日志文件中。 他们使用相同的类进行工作,有时使用不同的线程。
e.g。
backgroundworker1:
var aboImport = new CSVImport(file1); <-- logs into backgroundWorker1.log
aboImport.Execute();
ArchiveFile(file1);
backgroundworker2:
var addressImport = new CSVImport(file2); <-- logs into backgroundWorker2.log
addressImport.Execute();
ArchiveFile(file2);
e.g.
backgroundWorker1.log
backgroundWorker2.log
backgroundWorker3.log
...
heartbeat.log <-- I´can see my workers or main thread is running an working
我目前正在使用log4net,但这似乎不符合我的需求。 我发现(Create multiple Logfiles with dynamic Names with log4net)他们在代码中创建动态appender。 但我不明白这是否有效,因为log4net定义通常与命名空间相关联。 其他日志框架可以更优雅吗?您为此推荐了哪种日志框架?
答案 0 :(得分:1)
远离Log4Net。这不是一个积极开发的项目。最近发布的时间差不多1年前(2015年12月)。 NLog得到了更好的支持。
话虽如此,所有日志记录框架都允许您使用一堆不同的“宏”执行所有模板驱动...您可以将文件名基于threadId或其他一些动态值......或者只是通过它传递它键/值对。您必须查看所有可用的“宏”并选择适用于您的场景的宏。
答案 1 :(得分:1)
使用nlog,我可以轻松创建具有不同文件目标的记录器。
private static void Main(string[] args)
{
var config = LogManager.Configuration;
AddLogger(config, "logger1", @"C:\Temp\Logfile\Log1.txt");
AddLogger(config, "logger2", @"C:\Temp\Logfile\Log2.txt");
LogManager.Configuration = config;
var logger1 = LogManager.GetLogger("logger1");
logger1.Debug("Test1");
var logger2 = LogManager.GetLogger("logger2");
logger2.Debug("Test2");
}
private static void AddLogger(LoggingConfiguration config, string loggerName, string fileName)
{
var fileTarget = new FileTarget();
config.AddTarget(loggerName, fileTarget);
fileTarget.FileName = fileName;
var rule = new LoggingRule(loggerName, LogLevel.Debug, fileTarget);
config.LoggingRules.Add(rule);
}