Как войти, чтобы отделить файл журнала на поток, используя log4net - PullRequest
4 голосов
/ 08 марта 2012

Да, этот вопрос похож на: Как войти в отдельные файлы для каждого потока с помощью Log4Net? за исключением того, что я не знаю количество потоков или их имен до времени выполнения.Мое приложение Windows порождает поток для каждого пользователя, чтобы выполнить долгую работу для этого пользователя.Я хочу отдельный файл журнала для каждого пользователя / потока.

  1. Как будет выглядеть файл конфигурации log4net (если его можно использовать для такого типа вещей)?
  2. Что будеткод выглядит как использовать регистратор?
  3. Когда я позвоню 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 как часть имени файла журнала, которое хранится в файле конфигурации.

1 Ответ

1 голос
/ 09 марта 2012

Пожалуйста, попробуйте это:

http://geekswithblogs.net/rgupta/archive/2009/03/03/dynamic-log-filenames-with-log4net.aspx

Если вам нужно было генерировать динамические имена файлов журнала с помощью log4net, вы можете использовать следующую конфигурацию

<appender name="RollingFileAppenderV1" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="F:\HornetFeed\%property{LogName}" />
  <appendToFile value="true" />
  <rollingStyle value="Size" />
  ...
  <filter type="log4net.Filter.PropertyFilter">
    <Key value="Version" />
    <StringToMatch value="1" />
    ...
    <= Note the "%property{LogName}" syntax

Обратите внимание на свойство% {LogName}. Это свойство log4net, которое мы можем установить во время выполнения с помощью кода C #.

log4net.GlobalContext.Properties["LogName"] = "file1.log";

Не забудьте установить свойства GlobalContext перед созданием регистратора log4net.т.е. перед этим вызовом:

log4net.ILog log = LogManager.GetLogger(typeof(Program));

Затем:

  ///Helper method to log errors:
  internal static void LogError(Exception ex)
  {
    string state = "1";
    if (log4net.ThreadContext.Properties["Version"] != null)
      state = log4net.ThreadContext.Properties["Version"].ToString();
    log4net.ThreadContext.Properties["Version"] = "0";
    logger.HandleException(ex, "Error");
    log4net.ThreadContext.Properties["Version"] = state;
  }

'Надеюсь, что поможет

...