Да, этот вопрос похож на: Как войти в отдельные файлы для каждого потока с помощью Log4Net? за исключением того, что я не знаю количество потоков или их имен до времени выполнения.Мое приложение Windows порождает поток для каждого пользователя, чтобы выполнить долгую работу для этого пользователя.Я хочу отдельный файл журнала для каждого пользователя / потока.
- Как будет выглядеть файл конфигурации log4net (если его можно использовать для такого типа вещей)?
- Что будеткод выглядит как использовать регистратор?
- Когда я позвоню
log4net.Config.XmlConfigurator.Configure()?
(Пожалуйста, опишите подробно, как реализовать ведение журнала.)
ВотПример конфигурации (я не могу заставить свойство thread_name работать с несколькими потоками):
<log4net debug="false">
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<!--need to replace LogDir in code like this: log4net.GlobalContext.Properties["LogDir"] = "c:\programdata\myapp"-->
<file type="log4net.Util.PatternString" value="%property{LogDir}\logs\mylogfile_%property{thread_name}.log" />
...
И код:
public class MyMultiThreadedClassForUsers
{
private log4net.ILog Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public void Start()
{
log4net.GlobalContext.Properties("LogDir") = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
log4net.Config.XmlConfigurator.Configure()
List<IUser> users = GetAllUsersFromDB();
foreach (IUser user in users) {
System.Threading.Thread t = new System.Threading.Thread(CallBackMethod);
t.Name = user.FirstName;
t.Start();
}
}
private void CallBackMethod()
{
// this log message should be sent to a log file named after the current thread System.Threading.Thread.CurrentThread.Name
// Examples: mylogfile_bob.log, and mylogfile_fred.log, etc...
Log.Info("Starting work on thread " + System.Threading.Thread.CurrentThread.Name);
// do long running work here
}
}
Если это нелегко сделать с помощью log4net Iможет переключить каркасы ведения журналов на Nlog и использовать их ключевое слово% threadname как часть имени файла журнала, которое хранится в файле конфигурации.